Kvízre fel!

|

Néhány egyszerű komponens és némi kódolás segítségével való kvízmestert faraghatsz a mikrovezérlődből.

Egy Arduino segítségével nem csak a programozási tudásodat tesztelheted, egy megfelelően megírt kód használatával ugyanis egy szellemi vetélkedő virtuális agyaként is bevetheted a mikrokontrolleredet.

Ehhez pedig komolyabb hardveres kiegészítőkre sem lesz szükséged, ha megelégszel a Soros-monitor kiíratási képességeivel. Cikkünkben bemutatjuk, hogy miként készítheted el az igaz/hamis kérdésekre választ váró szerkezetedet és adunk tippeket az alapkoncepció továbbfejlesztéséhez is.

Szükséges hardverek

Viszonylag egyszerű a projekt alapötlete, hisz kezdetben mindössze annyit szeretnél elérni, hogy két input segítségével lehetőséged legyen megadni az igaz és a hamis válaszokat. Ennek köszönhetően hardveresen tényleg csak néhány kiegészítő komponensre van szükséged, a szoftveres oldalba kell komolyabb munkát fektetned. Alapvetően az Arduino mikrovezérlőd mellett két gombra, valamint a bekötésükhöz szükséges egyéb elemekre (kábelek, ellenállások, breadboard, shield) lesz szükséged a projekt alapvető funkcióinak megvalósításához, persze ha bővíteni szeretnél azért jól jöhet még néhány LED, esetleg egy berregő, vagy ha komolyabb kihívásokat keresel, akkor egy kijelző is. Természetesen, ha magát a kvíz felépítését változtatnád meg akkor érdemes több gomb csatasorba állításán is elgondolkoznod, azonban a cikkünkben erre nem térünk ki. Összeállításunkban az Arduino R3 Uno lapkánk mellett a Grove Starter Kit dobozában található Shield modult, a nyomógombot és az érintésérzékelőt használtuk csupán.

Kérdések tömbje

Számos módszer közül választhatsz a kérdések tárolására, hisz a C++ képes kezelni külső fájlokat, valamint egyedi objektumokat is, azonban a legegyszerűbb megoldás, ha a kódodba égetve, egy szimpla tömbben adod meg, szépen egymást követően, felsorolva a kérdéseket. A tömb adattípusa értelemszerűen legyen String, hisz szövegesen tárolod benne az adatokat, a kérdéseket pedig a String kerdesek[] = {}; kapcsos zárójelein belül, idézőjelek között helyezd el és vesszővel szeparáld el őket egymástól. Ha már elkészítettél néhány mintakérdést, jöhetnek a válaszok is, ehhez egy új tömböt készíts, melyben 0 és 1 értékeket helyezz el, ahol majd a 0 jelöli az igaz válaszokat az 1 pedig a hamis állításokat.

A tömbök indexelésénél figyelj arra, hogy az elsőként beírt kérdésre az első helyen legyen a válasz és így tovább. Hogy a későbbiekben egyszerűbb legyen végiglépkedni az elemeken hozz létre még itt egy int idx = 0; változót is. Ezzel el is készült a kvízjáték rögtönzött "adatbázisa", így már csak annyi a dolgod, hogy megvalósítsd azt a felületet, ami lehetőséget ad a felhasználói válaszok bevitelére.

Gombnyomás érzékelése

Még az inicializációs részben címkézd fel a két gombodhoz tartozó pineket, hisz így a későbbiekben sokkal könnyebben hivatkozhatsz majd rájuk. Mintakódodban érdemes lehet a 2-es és a 3-as pineket kiválasztani a csatlakoztatáshoz, melyek közül a 2-es csatornán az igaz, a 3-as pinen pedig a hamis szavazat adható le. Kódodban használd az int igazGomb = 2; valamint az int hamisGomb = 3; kifejezéseket ezen funkciók megvalósítására. Ha ezzel elkészültél ugorhatsz is a setup() belsejébe, ahol elsőként megnyitod a Soros-portot a Serial.begin(9600); utasítással, majd beállítod a két előzőleg megcímkézett pin-t bemenetként a pinmode(igazGomb, INPUT); valamint a pinmode(hamisGomb, INPUT); segítségével. Ezt követően egy külön függvényt hozz létre a két gombod kezelésére, vagyis a loop() lezárását követő üres sorba már kezdheted is begépelni az int gombLenyomva(){} kódot, mely a két nyomógombod állapotváltozását fogja felügyelni. Egy int valaszGomb = -1; változót helyezz el a függvény belsejében, melynek az értéke adja meg majd a lenyomott gomb számszerűsített állapotát. A gombnyomás vizsgálatához a beépített digitalRead() függvényt használd és egy feltételben azt figyeled majd, hogy a megcímkézett gombjaid mikor érik el a HIGH értéket ( if(digitalRead(trueButton) == HIGH){} else if(digitalRead(falseButton) == HIGH){} ). Az igaz gomb esetén a valaszGomb értékét 0-ra, a hamisnál pedig 1-re állítsd, a látványosabb funkcióbemutatás érdekében pedig egy-egy üzenettel is megemlékezhetsz a gombnyomás végrehajtásáról. Ha végeztél, akkor a függvény végén elhelyezed a return valaszGomb; visszatérési értéket.

Várakozó folyamat

Most a loop belsejében a Serial.println(kerdesek[idx]); segítségével már ki is írhatod az első kérdést, és az int valasz = gombLenyomva(); sorral pedig várhatsz a felhasználó válaszára. Igaz jelen formájában a Soros-monitort elég szépen teleírja majd első kérdéseddel a szoftver, ugyanis a loop rengetegszer lefut egymás után, hisz nincs késleltetésed, ami ebben gátolja. Hogy ezt elkerüld, fékezned kell némileg a program futását, méghozzá egy while ciklus segítségével. Hozz létre egy globális változót boolean kesz = false; néven még a setup() előtt, majd a while függvény ciklusfeltételéhez írd be a !kesz kifejezést. A cikluson belülre helyezd el a gombnyomást vizsgáló értékadást, a valasz = gombLenyomva(); sor begépelésével.

Ezzel elérted, hogy egészen a gombnyomásig mindössze egyszer jelenjen meg a képernyőn a kérdésed. Most már csak a válasz helyességét kell megvizsgálnod a kvíz befejezéséhez. Ehhez ismét egy feltételt használj, ahol ellenőrizd a valaszok tömböd aktuális eleme és a valasz-ban tárolt érték közötti egyenlőséget. Amennyiben ez teljesül egy üzenettel tudathatod a felhasználóval a sikeres választ ( Serial.println("Helyes!"); ), majd állíts be némi késleltetést ( delay(2000); ), növeld az indexet és a kesz értékét kattintsd át hamisra. Ezzel az igaz érték vizsgálatát már meg is valósítottad, most a hamis következik. Itt a harmadik, vagyis az alapértelmezetten generált állapottal - ami a -1 - veted össze a valasz értékét, ha pedig itt nem kapsz egyenlőséget, akkor egyértelműen rossz a döntésed. Tehát az else if ág belsejében helyezd el a rossz válaszról szóló üzenetet ( Serial.println("Hiba!"); ), ékelj be némi csúsztatást a kiírás után ( delay(2000); ), növeld az indexet és a kesz változót itt is állítsd be hamisra. Amennyiben szeretnél odafigyelni arra is, hogy az idx ne lépje túl az elérhető maximális tömbértékeket egyszerűen vegyél fel egy globális változót a kódod elején, aminek értékként a kérdéseid számát add meg. Ezek után mindkét eredményvizsgálat esetén bővítsd a kódod egy feltételvizsgálattal, melyben azt figyeled, hogy mikor lépi túl az idx értéke ezt a meret változót. Amennyiben ez bekövetkezik pusztán annyi a teendőd, hogy az idx értékét 0-ra állítod, így az elejéről kezdi a kérdéssort a felület.

Úgy tűnik, AdBlockert használsz, amivel megakadályozod a reklámok megjelenítését. Amennyiben szeretnéd támogatni a munkánkat, kérjük add hozzá az oldalt a kivételek listájához, vagy támogass minket közvetlenül! További információért kattints!

Engedélyezi, hogy a https://www.helloworldonline.hu értesítéseket küldjön Önnek a kiemelt hírekről? Az értesítések bármikor kikapcsolhatók a böngésző beállításaiban.