Profi kódfejtés
Szeretnéd értelmezni a hosszú és rövid jelek váltakozásából kialakított üzeneteket? Az Arduino ebben is segítségedre lesz!
Első körben arra lesz szükségünk, hogy különbséget tegyünk a hosszú és a rövid jelzések között, szerencsére ehhez csupán annyi a teendőnk, hogy a setup előtt létrehozunk három változót méghozzá az unsigned long jel_hossz,g1,g2; parancs segítségével. Ezt követően visszalépünk a loop belsejébe és a while (digitalRead(inputPin) == HIGH) {} g1 = millis(); digitalWrite(ledPin, HIGH); parancs segítségével figyeljük a gombnyomásunk kezdetét, majd felkapcsoljuk a LED-lámpát, majd ugyan ezt a kódrészlete végrehajtjuk a g2-vel is, csak ahol az első esetén HIGH volt az érték, ott átírjuk LOW-ra. Ezzel ugyanis a gombunk felengedését dokumentálhatjuk, a lenyomás és a felengedés közötti időt ezzel pedig már képesek leszünk mérni, és a jel_hossz = g2-g1; utasítással számszerűsíthetjük is ezt az adatot. Ezek után már jöhetne a hosszú és rövid kódrészletek kiértékelése, azonban még mielőtt ezzel elkezdünk foglalkozni hozzunk létre egy változót a start függvény előtt, méghozzá a String code = ""; utasítással, mellyel egy jelenleg még üres karakterláncot kezdünk el szépen lassan elkészíteni. A loop után írjunk egy void beolvas () {} függvényt melynek belsejében nem lesz más, mint egy idő alapján történő összevetés, elegendő ugyanis megadnunk az if (jel_hossz < 600 && jel_hossz > 50) {return '.';} és máris elérjük, hogy egy 0,6 másodpercnél rövidebb gombnyomás a . jelzéssel térjen vissza (az 50-es értékre csak az esetleges kósza áram miatt fellépő hibás jelzés elkerülésének érdekében van szükség). Szintén hasonlóan járunk el a hosszú értékek esetén is, itt ha 0,6 másodpercnél tovább nyomjuk a gombot ez azonnal aktivál, kódban pedig csupán egy előjel cserére és a visszatérési értékek módosítására van szükség.
Hogy a gombnyomásokat vizuálisan is szemléltessük, meghívásukkor írjuk ki a Serial.print("."); és a Serial.print("-"); utasítással a megfelelő karaktert. Ha ezt a kis függvényt elkészítettük térjünk vissza a loop() belsejébe, és code += beolvas(); utasítást biggyesszük a végére, mellyel folyamatosan bővíthető a kódszavunk. Amennyiben szeretnénk elkerülni a kóboráram véletlenszerű bejelzéseit érdemes lehet ezt a kis függvényt is egy olyan feltétel mögé rejteni, mely figyeli a már korábban is említett 50 milliszekundumos értéket, és csak ennél nagyobb különbség esetén jelez. Ezek után már csak annyi a teendőnk, hogy egy while függvényben megadjuk, hogy amint egy másodpercig nem érintjük az eszközünket ugorjon a következő karakterre, majd meghívjuk a konvertáló függvényünket. A következő kód segítségével pedig pontosan ezt hajthatjuk végre: while ((millis() - g2) < 500){ if (digitalRead(inputPin) == LOW){ goto KovetkezoSzam; } }. A loop belsejét ezen kívül már csak annyival kell kiegészítenünk, hogy közvetlenül a függvény első kapcsos zárójele után begépeljük a KovetkezoSzam: jelölőpontot, melynek köszönhetően a vezérlési szerkezet ismételten a kezdő pozícióba ugrik kódunk. Ezzel pedig el is készült a morze-jelzések megjelenítésére képes felületünk.
Karakterek értelmezése
Természetesen ezek után jöhet még egy fontos bővítés, mellyel a kódsorokból értelmes karaktereket készíthetünk. Ehhez szükség lesz egy void visszatérési értékű konvertalas(); függvényre, melynek belsejében tárolnunk kell a vonalakból és pontokból álló ABC-t.
Ezen célra használhatunk egy statikus tömböt, de egyedileg létrehozott változókként is összeállíthatjuk a használni kívánt karaktereket. Tömb esetén csupán annyi a teendőnk, hogy egy ciklusba helyezzük a beolvasást és elemenként összehasonlítjuk ez egyes értékeket (itt for és while ciklust is használhatunk). Egyedi változók használatakor pedig csak elseif ágakban összehasonlítjuk a kapott karaktereket és a beolvasott kódunkat, a megfelelő eredményt pedig a soros-monitoron is megjelenítjük. Persze ezt követően még érdemes lehet néhány egyéb ellenőrzést is bevetni, azonban ezen funkciókkal már eléggé könnyedén elérhetjük a szükséges konverziót. Természetesen a gombok finomhangolása továbbra is a saját feladatunk lesz, hisz még a megfelelően követett instrukciók sem garantálják, hogy a végeredmény úgy fordul majd, ahogy azt mi szerettük volna, azonban kis próbálgatással és a kód megfelelő módosítgatásával elérhetjük a kívánt eredményt akkor is, ha nem csak hivatalos kiegészítőket használunk.