Jocul în care poți testa cine are cea mai bună memorie. Acesta constă în reținerea ordinii în care s-au aprins LED-urile și introducerea acesteia pe keypad. Vor fi 2 moduri de joc:
Folosind aceste 2 moduri se obțin dificultăți diferite, dar și încă o șansă pentru a demonstra cine are memoria cea mai bună. Scorul maxim pentru modul curent va fi mereu vizibil pentru jucători, pe un ecran.
Oricând e bună puțină competiție!
Schema bloc:
Jocul de memorie se va desfășura astfel:
Componente utilizate:
Schema electrica: schema_electrica.pdf
BOM:
Componenta | Cantitate | Locul achizitionarii | Datasheet |
---|---|---|---|
Arduino Uno R3 | 1 | Arduino | Datasheet |
LCD 16×2 (I2C) | 1 | Ecran LCD | |
Keypad 4×4 | 1 | Keypad | Datasheet |
Buton | 1 | Buton | |
Buzzer | 1 | Buzzer | |
Shift Register | 2 | 74HC595 | Datasheet |
LED | 9 | LED | |
Rezistenta 220Ω | 9 | Rezistenta | |
Suport baterii | 1 | Suport baterii |
Descrierea componentelor:
Controler principal, responsabil cu logica jocului, gestionarea LED-urilor, afisajul si input-ul.
Folosita de catre jucator pentru introducerea secventei de LED-uri retinute si pentru pornirea jocului;
Pini utilizati: D2-D9, conform datasheet-ului.
Afiseaza dificultatea curenta si scorul maxim facut pentru acea dificultate;
Pini utilizati: VCC - 5V, GND - GND, SDA - A4, SCL - A5 (pinii A4 si A5 sunt pinii SDA, respectiv SCL ai placutei).
Se vor aprinde intr-o secventa generata aleator pe care jucatorul va trebui sa o retina si sa o introduca pe tastele de la 1 la 9 de pe Keypad;
Pini utilizati: folosesc doar 3 pini, nu 9, datorita celor 2 shift registers.
Permit utilizarea a mai putini pini de pe placuta Arduino, si permit o eventuala scalare pana la 16 LED-uri;
Pini utilizati: D11, D12, D13 (pinii digitali ramasi).
Folosit pentru oferirea unui feedback sonor jucatorului atunci cand greseste un LED din secventa sau cand apasa tastele in ordinea corecta pentru intreaga secventa;
Pini utilizati: GND - GND, D10.
Va schimba dificultatea;
Pini utilizati: A3 (este pin analogic dar poate fi folosit si ca pin digital).
Suport de 6 baterii AA, conectat folosind jack-ul de pe placuta Arduino.
Pentru implementarea software am folosit Visual Studio Code cu extensia PlatformIO.
Jocurile de memorie sunt de obicei formate din 4 LED-uri de culori diferite. Jocul pe care l-am realizat eu contine 9 LED-uri de aceeasi culoare pozitionate intr-un patrat 3×3, punand accentul pe retinearea pozitiei, nu a culorii.
Functionalitatile din laborator pe care le-am folosit sunt: GPIO, Intreruperi, I2C;
Proiectul este realizat in fisierul main.cpp si este structurat astfel:
if (idleState) { unsigned long currentTime = millis(); if (currentTime - lastLedUpdateTime >= ledInterval) { uint16_t data = 1 << ledIndex; sendToShiftRegister(data); ledIndex = (ledIndex + 1) % 9; lastLedUpdateTime = currentTime; } }
Folosind aceasta logica pentru animatia de idle, ci nu apelusi de delay(), am putut evita blocarea celorlalte dispozitive, tinand cont de resetarea animatiei in cazul in care jucatorul opreste si porneste jocul sau in cazul in care pierde si este intors in starea de idle.
Am obtinut un joc de memorie distractiv, dar si competitiv. Este usor de jucat, intuitiv si functioneaza corect, comparativ cu planurile realizate la inceput. Cele doua dificultati sunt diferite si permit testarea a 2 tipuri de memorie (Easy - repetitia LED-urilor din secventele anterioare in toate cele care vor urma; Hard - memoria vizuala la prima vedere prin schimbarea totala a secventei de LED-uri). In plus, circuitul este montat intr-o cutie pentru a putea fi folosit cu usurinta si prin folosirea bateriilor poate fi jucat oriunde fara sa fie conectat la un laptop/PC.
Realizarea proiectului a fost o experienta interesanta, care incepea sa imi placa din ce in ce mai mult cu cat avansam in dezvoltarea acestuia, de la alegerea componentelor hardware, pana la introducerea lor intr-o cutie pentru a arata mai bine.