1. ro
  2. en
28 iulie 2025

Repetă după mine

Introducere

 

În universul jocurilor de memorie, Simon Says, jocul de la care am preluat ideea, este un clasic indiscutabil—o provocare simplă, dar captivantă, în care jucătorii trebuie să repete o secvență de culori și sunete cu precizia unui metronom. Creat în anii ’70 ca un dispozitiv electronic ce combina sunet, lumină și memorie vizuală, Simon a devenit rapid un fenomen cultural. Astăzi, în era microcontrolerelor și educației STEM, pasionații de tehnologie îl reimaginează cu gust, transformându-l într-un instrument ideal pentru învățare interactivă și experimentare DIY.

 

O astfel de reinterpretare vine cu ajutorul platformei Arduino, unde Simon Says primește un upgrade colorat și sonor: LED-uri vibrante, tonuri polifonice specifice fiecărei culori, și un afișaj digital TM1637 care adaugă un strat vizual retro-cool, afișând mesaje și scoruri într-un mod captivant. Codul prezent oferă o execuție clară și modulară, construită pentru interactivitate și feedback instantaneu, în care fiecare componentă are un rol bine definit: LED-urile semnalizează pașii, buzzerul asigură comunicarea acustică, iar butoanele permit o interacțiune directă cu jucătorul.

 

Jocul se desfășoară intuitiv: după afișarea stării de pornire „ROSU” pe display, urmează o numărătoare inversă 3–2–1 care introduce tensiune. Fiecare nivel adaugă un nou element în secvență, redat prin LED-ul colorat și sunetul caracteristic (de ex., 261Hz pentru galben sau 784Hz pentru albastru). Jucătorul trebuie să reproducă secvența apăsând butoanele corespunzătoare, fiecare asociat unei frecvențe distincte. Astfel, pe lângă latura vizuală, se activează și memoria auditivă—un detaliu important pentru cei cu ureche muzicală, care pot reține și reproduce o melodie după ce o aud. Din acest motiv, proiectul poate fi folosit și ca antrenament pentru artiști sau muzicieni.

 

Dacă jucătorul greșește, un efect sonor clasic de tip „wah-wah” semnalează eșecul, urmat de o resetare dramatică a scorului și o scurtă animație vizuală pe display. Dacă reușește, este recompensat cu o mică melodie care marchează progresul și încurajează memoria activă. Nivelurile avansează cu dificultate progresivă, dezvoltând capacitatea de concentrare și reacție rapidă.

 

Designul modular permite extinderea ușoară cu funcționalități suplimentare: efecte  vizuale complexe, display-uri suplimentare, salvarea scorului în EEPROM sau conectivitate wireless pentru leaderboard global. Totodată, poate fi adaptat ca instrument de stimulare cognitivă pentru copii sau vârstnici, fiind ideal pentru antrenarea memoriei de scurtă durată într-un mod ludic și accesibil.

 

În esență, această versiune Arduino de Simon Says nu este doar o reimaginare a unui joc retro, ci o platformă multisenzorială pentru explorarea conceptelor de interacțiune om-mașină, logică secvențială și învățare activă. Este un proiect complet, care îmbină nostalgia cu inovația și demonstrează cum hardware-ul educațional poate deveni o sursă de creativitate, cunoaștere și bucurie.

 

Cum se desfășoară efectiv jocul?

 

La pornirea sistemului, LED-ul roșu începe să pâlpâie iar pe ecran apare cuvântul „ROSU”, semnalând că jocul este pregătit să înceapă, însă așteaptă intervenția jucătorului. Prin apăsarea butonului roșu, jocul intră în faza de numărătoare inversă, afișând pe display cifrele 3, 2, 1, însoțite de bipuri sonore care construiesc anticiparea momentului. 

 

Imediat după, sistemul generează o secvență aleatorie de culori și tonuri, iar LED-urile se aprind pe rând, fiecare asociat cu un sunet distinctiv, stimulând atât memoria vizuală cât și cea auditivă. 

 

Jucătorul trebuie apoi să reproducă corect secvența apăsând butoanele în aceeași ordine, iar cu fiecare nivel complet, dificultatea crește prin adăugarea unui nou element în serie.

 

Pe măsură ce jocul avansează, jucătorul este provocat tot mai intens, fiind nevoit să se concentreze și să-și coordoneze atenția, memoria și reflexele. Orice greșeală duce la încheierea rundei, iar sistemul poate afișa un mesaj de încurajare sau rezultatul obținut...

 

 

 

Schema electrică

 

La prima vedere, schema electrică poate părea complexă, iar liniile sale par că se încurcă într-o poveste tehnică fără sfârșit. Dar nu lăsa aparențele să te descurajeze. Vom parcurge împreună fiecare etapă — pas cu pas — interpretând schema, descoperind logica din spatele fiecărui simbol și așezând componentele pe breadboard într-un mod clar și intuitiv. Vei vedea cât de repede se transformă confuzia în curiozitate și încredere.

 

 

După cum puteți observa, avem următoarele conexiuni electrice între componentele circuitului nostru:

  •     Terminalul 1 al butonului roșu → Pin D12 Arduino

  •     Terminalul 2 al butonului roșu → GND Arduino

  •     Pinul D7 Arduino → Terminalul 1 al rezistorului R1 (asociat LED-ului roșu)

  •     Terminalul 2 al rezistorului R1 → Terminalul pozitiv (+) al LED-ului roșu

  •     Terminalul negativ (−) al LED-ului roșu → GND Arduino

  •     Terminalul 1 al butonului galben → Pin D6 Arduino

  •     Terminalul 2 al butonului galben → GND Arduino

  •     Pinul D10 Arduino → Terminalul 1 al rezistorului R2 (asociat LED-ului galben)

  •     Terminalul 2 al rezistorului R2 → Terminalul pozitiv (+) al LED-ului galben

  •     Terminalul negativ (−) al LED-ului galben → GND Arduino

  •     Terminalul 1 al butonului verde → Pin D8 Arduino

  •     Terminalul 2 al butonului verde → GND Arduino

  •     Pinul D4 Arduino → Terminalul 1 al rezistorului R3 (asociat LED-ului verde)

  •     Terminalul 2 al rezistorului R3 → Terminalul pozitiv (+) al LED-ului verde

  •     Terminalul negativ (−) al LED-ului verde → GND Arduino

  •     Terminalul 1 al butonului albastru → Pin D9 Arduino

  •     Terminalul 2 al butonului albastru → GND Arduino

  •     Pinul D5 Arduino → Terminalul 1 al rezistorului R4 (asociat LED-ului albastru)

  •     Terminalul 2 al rezistorului R4 → Terminalul pozitiv (+) al LED-ului albastru

  •     Terminalul negativ (−) al LED-ului albastru → GND Arduino

  •     Terminalul pozitiv (+) al difuzorului → Pin D12 Arduino

  •     Terminalul negativ (−) al difuzorului → GND Arduino

  •     Terminalul 1 al afișajului (CLK) → Pin D3 Arduino

  •     Terminalul 2 al afișajului (DIO) → Pin D2 Arduino

  •     Terminalul 3 al afișajului (GND) → GND Arduino

  •     Terminalul 4 al afișajului (5V) → Pin 5V Arduino

 

 

 

Materiale necesare:

 

  • Arduino Uno sau un model echivalent al acestuia

  • 4 LED-uri, de preferat de 5mm, care să emită lumină de culori diferite – roșu, galben, verde și albastru

  • 4 întrerupătoare cu revenire, normal deschise, care pot fi instalate pe breadboard  

  • un afișaj cu șapte segmente, cu 4 digiți, controlat de circuit integrat TM1637

  • un difuzor 

  • un breadboard de dimensiune mare, 830 puncte 

  • fire de legătură

 

 

 

Instalarea componentelor pe breadboard 

 

 

După cum observați, nu avem foarte multe conexiuni electrice de realizat. Trebuie doar să fiți atenți la câteva detalii esențiale pentru montajul corect:

 

  • LED-urile au polaritate și trebuie conectate în direcția corectă. Am notat cu A – anod (plus) și K – catod (minus) pentru a vă ghida mai ușor. Dacă sunt montate invers, nu vor lumina.

 

  • Întrerupătoarele au patru pini dispuși într-un dreptunghi, nu într-un pătrat perfect. Acest lucru înseamnă că, fără a forța, ele se vor potrivi natural într-o singură direcție pe breadboard.

  • Rezistoarele nu au polaritate, deci pot fi instalate în orice sens, fără restricții. Rolul lor este să limiteze curentul și să protejeze componentele, în special LED-urile.
  • Difuzorul poate avea fire colorate. Dacă nu este marcat, rețineți că firul roșu indică polul pozitiv și trebuie conectat la pinul D12, iar firul negru la GND (masa).
  • În zona de alimentare a breadboardului, pinii laterali sunt conectați grupat câte 25. Pentru a asigura continuitatea tensiunii, este necesară interconectarea între cele două sectoare — adică alimentarea trebuie să fie comună pe toată lungimea plăcii.
  • Dacă utilizați pentru prima dată placa Arduino, atunci puteți realiza conexiunile fără griji. În acest caz, placa este liberă de orice program anterior, astfel că nu există riscul unor execuții necontrolate.

 

 

 

Codul sursă

 

Înainte de a compila codul sursă, trebuie să instalați o bibliotecă — aceea care ne permite să interacționăm cu afișajul cu 7 segmente controlat de circuitul integrat TM1637. Această bibliotecă poartă denumirea „TM1637”, creată de Avishay Orpaz, și aceasta înseamnă că, în căsuța care permite căutarea bibliotecilor, veți căuta termenul „TM1637”, veți selecta biblioteca „TM1637 by Avishay Orpaz” și apoi veți apăsa butonul „INSTALL”.

 

Puteți descărca de aici codul sursă. Acesta conține explicații pentru aproape fiecare linie de cod.

 

 

Dacă ați realizat montarea componentelor pe breadboard, descărcați codul sursă din link-ul de mai sus și încărcați-l în memoria dispozitivului Arduino, apoi bucurați-vă de joc! 🎮

 

Totuși, înainte de a începe să vă distrați, iată câteva lucruri care pot merge greșit și cum le puteți verifica:

 Componente neconectate corect

  • Verificați dacă toți pinii sunt așezați în breadboard conform schemei.

  • Uneori, un pin greșit afectează funcționarea LED-urilor, butoanelor sau afișajului.

Buzzer fără sunet

  • Asigurați-vă că pinul SPEAKER_PIN (12) este corect conectat și buzzer-ul nu este inversat.

  • Verificați tensiunea și conexiunea GND/VCC.

Displayul nu afișează

  • Verificați conexiunile CLK și DIO.

  • Puteți reduce viteza de transfer sau testa cu o bibliotecă exemplu simplu.

LED-urile nu se aprind

  • Asigurați-vă că LED-urile nu sunt inversate (anod/catod).

  • Pinii 7, 10, 4, 5 trebuie să fie setați ca OUTPUT.

Butoanele nu răspund

  • Verificați dacă pinii 11, 6, 8, 9 sunt setați ca INPUT_PULLUP.

  • Dacă nu se detectează apăsarea, testul cu Serial.println(digitalRead(pin)); poate ajuta.

Secvența nu se salvează corect

  • Dacă jocul se resetează brusc, verificați dacă array-ul gameSequence[] este modificat accidental sau gameIndex depășește limita (ceea ce se poate întâmpla doar dacă ați modificat accidental valoarea sa).

 
 

 

 

Mecanismul codului sursă

 

Totul începe cu importarea bibliotecii TM1637Display, care permite controlul unui afișaj cu 4 cifre, tip 7 segmente. Acest afișaj va fi folosit pentru a afișa nivelul, mesaje ca „ROSU” și o numărătoare inversă.

 

Se definesc apoi pinii utilizați pentru conectarea componentelor:

  • CLK și DIO pentru afișaj.

  • SPEAKER_PIN pentru difuzor.

  • patru LED-uri conectate la pinii 7, 10, 4 și 5.

  • patru butoane conectate la pinii 11, 6, 8 și 9.

 

Fiecărui LED îi este asociat un ton muzical distinct (frecvență), stocat în vectorul tones. De exemplu, LED-ul roșu produce 196 Hz, galbenul — 784 Hz etc.

 

Ca răspuns auditiv, există două melodii:

  • levelUpMelody[] — redată când utilizatorul trece la nivelul următor.

  • wahwah[] — sunet trist pentru greșeli.

 

Se instanțiază obiectul display și se definește gameSequence[], un array de maxim 100 de pași — fiecare pas fiind un index de la 0 la 3, corespunzător unui LED/buton. gameIndex ține evidența nivelului curent.

 

Pentru interacțiunea audio-vizuală, funcția lightLedAndPlayTone(index, durata) aprinde LED-ul dorit și emite tonul aferent.

 

În funcția setup() se configurează hardware-ul: se setează pinii, se pornește afișajul și se inițializează generatorul de numere aleatorii.

 

Apoi, jocul pornește în stareInitiala(), unde se afișează textul „ROSU” pe display, iar LED-ul roșu clipește. Utilizatorul trebuie să apese butonul roșu ca să înceapă jocul.

 

După confirmare, se redă o scurtă numărătoare inversă în numaratoareInversa(), afișând pe display cifrele 3 → 2 → 1, la intervat de o secundă, însoțite de tonuri.

 

Apoi intrăm în loop() — nucleul jocului. Aici se generează un pas nou aleator, se adaugă la gameSequence, și se afișează nivelul curent. Urmează playSequence(), care parcurge întreaga secvență și aprinde LED-urile respective, redând tonurile.

 

După ce secvența este redată, utilizatorul trebuie să o reproducă — apăsând butoanele în aceeași ordine. Acest lucru se realizează în checkUserSequence(), care compară fiecare apăsare cu pasul corespunzător din gameSequence. Fiecare apăsare corectă oferă feedback (lumina LED-ului + sunet), iar dacă apare o greșeală, se redă melodia wahwah[], LED-urile iluminează intermitent și jocul se resetează.

 

În caz de succes, se redă levelUpMelody[], se crește gameIndex, iar jucătorul trece la nivelul următor, cu o secvență mai lungă de reprodus.

 

Funcția readButtons() citește apăsarea unui buton, așteptând eliberarea (debounce), și returnează indexul — folosit pentru verificarea răspunsului.

 

În momentele critice, când jucătorul eșuează, funcția gameOver() intră în acțiune. Afișajul arată scorul final, se aprind toate LED-urile secvențial, se redă melodia eșecului și se revine la starea inițială.

 

 

 

 

Îmbunătățiri posibile pentru acest joc

 

Personalizare vizuală

  • Folosirea unui afișaj OLED sau LCD cu mesaje și animații.

  • Adăugarea unui carcasaj personalizat imprimat 3D pentru un aspect profesional.

 

Sunete și muzică

  • Introducerea de sunete diferite pentru fiecare etapă (start, greșeală, victorie).

  • Crearea unei melodii tematice cu ajutorul buzzer-ului pasiv.

  • Adăugarea unui mod „silent” pentru jocuri în bibliotecă .

 

Moduri de dificultate

  • Creșterea vitezei secvențelor în funcție de progres.

  • Activarea unui mod „Challenge” cu memorarea inversă a secvenței. Am realizat acest proiect aici.

  • Modul „Time Attack” — răspunde corect într-un interval de timp limitat!

 

Salvare și reluare

  • Implementarea unui sistem de salvare a scorului maxim în EEPROM.

  • Posibilitatea de a relua jocul din ultima etapă atinsă.

 

Multiplayer sau competiție

  • Doi jucători, fiecare cu propriul set de butoane și LED-uri.

  • Modul versus — cine reproduce secvența mai repede și corect.

 

Integrare Bluetooth sau Wi-Fi

  • Trimiterea scorurilor online pentru clasamente.

 

 

​​​​​​​

​​​​​​​