ASCII karakterlánc olvasása

Elemezze a vesszővel elválasztott egész számokat a LED fényerejéhez.


Utolsó felülvizsgálat: 2022.02.04 16:50


Ez a vázlat a Serial.parseInt() függvényt használja a nem alfanumerikus karakterekkel elválasztott értékek meghatározásához. Az emberek gyakran használnak vesszőt különböző információrészek jelzésére (ezt a formátumot általában vesszővel elválasztott értékeknek vagy CSV-nek (comma-separated-values) nevezik), de más karakterekkel, például szóközzel vagy ponttal is működnek. Az értékeket egész számokká elemezzük, és meghatározzuk az RGB LED színét. Az Arduino Software (IDE) soros monitorral olyan karakterláncokat küldhet a kártyára, mint az "5,220,70" a lámpa színének megváltoztatásához.

Hardver szükséglet

  • Arduino kártya

  • közös anódú RGB LED

  • 3 220 ohm-os ellenállás

  • összekötő vezetékek

  • dugdosós próbapanel (breadboard)

Az áramkör

Vázlat

A fenti áramkör létrehozásához négy vezetékre lesz szüksége. Egy vezeték köti össze az 5V-ot a kártya POWER kivezetését az RGB LED leghosszabb érintkezőjével. A LED-et úgy kell elforgatni, hogy a leghosszabb érintkező legyen balról a második.

Helyezze az RGB LED-et a próbapanelre úgy, hogy felülről a leghosszabb érintkező legyen a második. Ellenőrizze az adott LED adatlapját a tűk ellenőrzéséhez, de ezeknek R, V+, G és B jelzésűeknek kell lenniük. Az 5 V-ról érkező vezetéket ezért felülről a második érintkezőhöz kell csatlakoztatnia, mint a fenti csatlakozási vázlatban.

A megmaradt vezetékekkel csatlakoztassa a piros katódot a 3. kivezetéshez, a zöld katódot az 5. kivezetéshez és a kék katódot a 6. kivezetéshez sorbakötve az ellenállásokkal.

A közös anóddal rendelkező RGB LED-ek közös tápcsatlakozóval rendelkeznek. Ahelyett, hogy egy kivezetést HIGH-ra kapcsolna, hogy megvilágíson a LED, a kivezetést LOW-ra kell állítania, hogy feszültségkülönbséget hozzon létre a diódán. Tehát ha 255-öt küldünk az analogWrite()-on keresztül, akkor a LED kikapcsol, míg a 0 érték esetén teljes fényerővel világít. Az alábbi kódban a vázlatban egy kis matematikát fog alkalmazni, így olyan értékeket küldhet, amelyek megfelelnek a várt fényerőnek. Lényegében az analogWrite(pin, brightness) használata helyett az analogWrite(pin, 255-brightness) függvényt kell meghívnia.

A kód

Először be kell állítania néhány globális változót azon kivezetésekhez, amelyekhez a LED csatlakozni fog. Így könnyebb lesz megkülönböztetni, hogy melyik a piros, zöld és kék a program fő részében:

const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;

A setup()-ban indítsa el a soros kommunikációt 9600 bit/s sebességgel a kártya és a számítógép között a következő sorral:

Serial.begin(9600);

Szintén a setup()-ban szeretné a kivezetéseket kimenetként konfigurálni:

pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);

A loop()-ban ellenőrizze, hogy van-e adat a soros pufferben. Ha ezt a while() utasítás megadja, addig fog futni, amíg van olvasásra váró információ:

while (Serial.available() > 0) {

Ezután deklaráljon néhány helyi változót a soros információk tárolására. Ezek lesznek a LED-ek fényerejei. A Serial.parseInt() használatával a vesszőnél szétválasztja az adatokat, az információkat beolvassa a változókba:

int red = Serial.parseInt();
int green = Serial.parseInt();
int blue = Serial.parseInt();

Miután beolvasotta az adatokat a változókba, ellenőrizze az újsor karaktert a folytatáshoz:

if (Serial.read() == '\n') {

A constrain() segítségével az értékeket egy elfogadható tartományban tarthatja a PWM-vezérléshez. Így, ha az érték kívül esik azon a tartományon, amit a PWM küldhet, akkor érvényes számra korlátozódik. Ha ezt az értéket kivonja 255-ből, akkor az értéket egy közös anódú LED-hez formázza. A fentiek szerint ezek a LED-ek akkor világítanak, ha feszültségkülönbség van az anód és a kártyához csatlakoztatott kivezetés között:

red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);

Most, hogy megformázta a PWM értékeit, az analogWrite() segítségével módosítsa a LED színét. Mivel a fenti lépésben kivonta az értékét 255-ből:

analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);

Az egyes LED-ek értékét egy sztringben küldje vissza a soros monitornak HEX értékként:

Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);

Végül zárja be a zárójeleket az if utasításból, a while utasításból és a fő ciklusból:

}
}
}

Miután beprogramozta az alaplapot, nyissa meg az Arduino Software (IDE) soros monitorát. Győződjön meg arról, hogy az újsor karakter küldését választotta üzenet küldésekor. Adjon meg 0 és 255 közötti értékeket a következő formában a lámpához: Piros, Zöld, Kék. Miután elküldte az értékeket a kártyára, a mellékelt LED az Ön által megadott színűre vált, és visszakapja a HEX értékeket a soros monitoron.

/*
  Reading a serial ASCII-encoded string.

  Ez a vázlat a Serial parseInt() függvényt mutatja be.
  Egy vesszővel elválasztott értékekből álló ASCII-karakterláncot keres.
  Int-ekké elemzi őket, és ezeket használja az RGB LED színbeállítására.

  Az áramkör: A közös anódú RGB LED a következőképpen van bekötve:
  - piros katód: digitális 3 kivezetés 220 ohm ellenálláson keresztül
  - zöld katód: digitális 5 kivezetés 220 ohm ellenálláson keresztül
  - kék katód: digitális 6 kivezetés 220 ohm ellenálláson keresztül
  - anód: +5V

  created 13 Apr 2012
  by Tom Igoe
  modified 14 Mar 2016
  by Arturo Guadalupi

  Ez a kód nyilvános.

  https://docs.arduino.cc/built-in-examples/communication/ReadASCIIString
*/

// a LEDek kivezetései:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;

void setup() {
  // a soros kommunikáció inicializálása:
  Serial.begin(9600);
  // tegye a kivezetéseket kimenetté:
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

}

void loop() {
  // ha van elérhető adat a soros porton, olvasd el:
  while (Serial.available() > 0) {

    // keresse meg a következő érvényes egész számot a bejövő soros adatfolyamban:
    int red = Serial.parseInt();
    // csináld újra:
    int green = Serial.parseInt();
    // csináld újra:
    int blue = Serial.parseInt();

    // keresd az újsort. Ez a mondatod vége: 
    if (Serial.read() == '\n') {
      // korlátozza az értékeket 0 és 255 között, és fordítsa meg, ha közös katódú LED-et alkalmaz,
      // csak a "constrain(color, 0, 255);" parancsot használja.
      red = 255 - constrain(red, 0, 255);
      green = 255 - constrain(green, 0, 255);
      blue = 255 - constrain(blue, 0, 255);

      // a LED piros, zöld és kék fényereje:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);

      // nyomtassa ki a három számot egy karakterláncban hexadecimális formában:
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
  }
}

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.