Nagyon elteltem önbizalommal az elmúlt napok sikereitől, úgyhogy új kihívás után néztem, ami egy hétledes apró kijelző programozása lett.
Az első meglepetés akkor ért, amikor a php-s felsülés után a tömböt ezen a példán rögtön értettem:
int gomb=2; int num_array[10][7] = { { 1,1,1,1,1,1,0 }, // 0 { 0,1,1,0,0,0,0 }, // 1 { 1,1,0,1,1,0,1 }, // 2 { 1,1,1,1,0,0,1 }, // 3 { 0,1,1,0,0,1,1 }, // 4 { 1,0,1,1,0,1,1 }, // 5 { 1,0,1,1,1,1,1 }, // 6 { 1,1,1,0,0,0,0 }, // 7 { 1,1,1,1,1,1,1 }, // 8 { 1,1,1,0,0,1,1 }}; // 9 int szam=0;
Bár szerintem inkább az a kettő közötti különbség, hogy itt - mivel egy olyan feladatról van szó, amit utána kézzelfogható formában létre is hozok - látom a végeredményt. Egy lednél már akkor is tudom, hogy hogyan fog kinézni később, mert látom, hogy melyik led az, amit pl. a 0 megjelenítéséhez be kell kapcsolni, és melyik az, amelyiket nem.
Ennél a feladatnál megint látszik, hogy mennyire nem az én észjárásom szerint megy a programozás, mert a tömb maga érthető (1=ON, 0=Off, szal a ledek állapotát mutatja, hogy be- vagy kikapcsolva kell, hogy legyenek egy szám megjelenítéséhez), viszont az, hogy melyik érték melyik ledhez tartozik, az csak egy lejjebb hozzáadott kódban (Num_Write) van megírva. Ez nálam még mindig 404 :D
Miután megvoltunk a ledekkel, azt tűztem ki célul, hogy mutassa a kijelző, hogy hányszor nyomom meg a gombot. Ehhez viszont egy új parancsot kellett megtanulnom:
attachInterrupt(digitalPinToInterrupt(gomb),gombnyomas,FALLING);
Bár mondjuk annak feldolgozása, hogy ebben a függvényben van már olyan, amit korábban meghatároztunk (gomb a kettes porton már az első sorban) és az is, amit még csak ezzel a paranccsal írunk bele ( gombnyomás maga), és az, hogy a gombnyomás melyik részénél reagáljon (FALLING, azaz felengedésnél) kissé komplikált. Hát kösz.
Ahhoz, hogy kiírja a számot, megint segítségre volt szükségem, mert a kódírás leginkább a német nyelvtudásomra hasonlít: megértem, de nem megy magamtól :D a végére azért összehoztuk, és a legszebb az egészben, hogy még mindig értem :3 mondjuk nem egy nagy durranás, na de csak számolgat vele a led :)
void gombnyomas() { delay(500); szam++; if (szam>9) szam=0; Num_Write(szam); } void Num_Write(int number) { int pin= 3; for (int j=0; j < 7; j++) { digitalWrite(pin, num_array[number][j]); pin++; }
Itt látható a híres-neves Num_Write, amiben a digitalWrite első paramére mondja meg, hogy melyik ledről van szó, a második pedig, hogy világítson-e vagy ne. Nekem ez a sorrend nem tetszik, de nem is azért csinálják így, hogy nekem jó legyen :)
Itt kaptam a következő vérszemet, hogy lehet-e gépről is irányítani? És mivel lehet, meg is csináltuk, mondjuk volt egy kis kavarodás az ASCII körül (két sorral korábban lett megemlítve a kelleténél, de no para), a végére mégis egyben maradt a lakás és a led is pöpecül működött :)
void loop() { if (Serial.available()) { char ch = Serial.read(); if (ch >= '0' && ch <= '9') { Num_Write(ch-48); Serial.println("Szam atallitva."); } else { Serial.println("Hibas input!"); } } }
Még párszor azért meg kell ismételni ezt a gyakorlatot, mert ez magamtól sose jutna az eszembe, bár hallottam már párszor azt a biztatást, hogy a fejlesztő lusta állatfaj, ha valaki már írt valaha hasonló parancsot, akkor azt bizony nem kell újra megírni magamtól :D
A biztonság kedvéért azért kinéztem már magamnak a következő project-et, a kis ledlámpákkal szívesen játszom addig, amíg futófény nem lesz belőlük :)
Addig itt van a videó a számkijelzésről, enjoy :)
E.