This is an old revision of the document!
Proiectul reprezinta o implementare a jocului clasic Simon Says pe placa ATmega328P Xplained Mini. Jocul afiseaza secvente de lumini prin 4 LED-uri colorate, iar jucatorul trebuie sa reproduca secventa in ordinea corecta, apasand butoanele corespunzatoare. Cu fiecare nivel reusit, secventa creste in lungime, iar viteza de afisare creste progresiv.
Proiectul integreaza:
Schema bloc:
IDLE (ecran start)
│ apasare buton
▼
SHOW_SEQUENCE (afisare secventa LED-uri)
│ secventa terminata
▼
WAIT_INPUT (asteapta input jucator)
├─ corect → CORRECT (animatie + nivel urmator) → SHOW_SEQUENCE
└─ gresit → GAME_OVER (animatie + salvare scor) → IDLE
| Componenta | Model/Valoare | Cantitate | Rol in proiect |
|---|---|---|---|
| Microcontroller | ATmega328P Xplained Mini | 1 | Unitate centrala de control |
| Display LCD | 16×2 cu modul I2C (PCF8574) | 1 | Afisare scor, nivel, mesaje |
| LED rosu | 5mm, 2V, 20mA | 1 | Culoarea 1 a jocului |
| LED albastru | 5mm, 3.2V, 20mA | 1 | Culoarea 2 a jocului |
| LED verde | 5mm, 2.1V, 20mA | 1 | Culoarea 3 a jocului |
| LED galben | 5mm, 2V, 20mA | 1 | Culoarea 4 a jocului |
| Rezistenta | 220Ω | 4 | Protectie LED-uri |
| Butoane tactile | 6x6mm | 4 | Input jucator |
| Buzzer pasiv | 5V | 1 | Feedback sonor |
| Breadboard | 830 puncte | 1 | Prototipare |
| Fire jumper | M-M | ~25 | Conexiuni |
| Componenta | Pin ATmega | Pin Arduino | Motivatie alegere |
|---|---|---|---|
| LED rosu | PD4 | D4 | GPIO simplu, fara functii speciale |
| LED albastru | PD5 | D5 | GPIO simplu, fara functii speciale |
| LED verde | PD6 | D6 | GPIO simplu, fara functii speciale |
| LED galben | PD7 | D7 | GPIO simplu, fara functii speciale |
| Buton rosu | PB0 | D8 | GPIO cu pull-up intern disponibil |
| Buton albastru | PB1 | D9 | GPIO cu pull-up intern disponibil |
| Buton verde | PB2 | D10 | GPIO cu pull-up intern disponibil |
| Buton galben | PB3 | D11 | GPIO cu pull-up intern disponibil |
| Buzzer | PB4 | D12 | Compatibil cu functia tone() |
| LCD SDA | PC4 | A4 | Pin hardware TWI/I2C al ATmega |
| LCD SCL | PC5 | A5 | Pin hardware TWI/I2C al ATmega |
Motivatia alegerii pinilor:
LED-uri (x4, conectare identica):
Pin GPIO (PD4-PD7) ──────── Anod LED (+, picior lung)
Catod LED (-, picior scurt) ── Rezistenta 220Ω ── GND
Butoane (x4, cu pull-up intern):
Pin GPIO (PB0-PB3) ──────── Pin 1 buton GND ─────────────────────── Pin 2 buton (opus) Pull-up intern activat in cod prin INPUT_PULLUP Butonul citeste LOW cand e apasat, HIGH cand e liber
Buzzer pasiv:
PB4 (D12) ──────────────── Pin + buzzer GND ─────────────────────── Pin - buzzer
LCD I2C:
PC4 (A4/SDA) ───────────── SDA modul I2C PC5 (A5/SCL) ───────────── SCL modul I2C 5V ──────────────────────── VCC modul I2C GND ─────────────────────── GND modul I2C Potentiometru albastru pe modul = reglaj contrast
Alimentare breadboard:
5V placa ──── linia rosie (+) breadboard GND placa ──── linia albastra (-) breadboard
| Biblioteca | Sursa | Motivatie |
|---|---|---|
| Wire.h | Built-in Arduino | Comunicatie I2C hardware cu LCD — nu necesita instalare externa |
| EEPROM.h | Built-in Arduino | Acces la memoria EEPROM a ATmega328P pentru persistenta high score |
| Arduino.h | Built-in | API de baza: pinMode, digitalWrite, tone, delay |
Motivatia alegerii Wire.h in loc de LiquidCrystal_I2C: Libraria LiquidCrystal_I2C a prezentat probleme de compatibilitate cu toolchain-ul MiniCore pentru ATmega328P Xplained Mini. Solutia adoptata a fost implementarea directa a protocolului I2C pentru LCD folosind Wire.h (built-in), scriind manual functiile de initializare, trimitere nibble/byte, setare cursor si print. Aceasta abordare ofera control complet si elimina dependentele externe.
| Functionalitate | Utilizare in proiect |
|---|---|
| GPIO output | Control LED-uri: PORTD pentru afisarea secventei |
| GPIO input cu pull-up | Citire butoane fara rezistente externe: INPUT_PULLUP pe PB0-PB3 |
| Timer (tone()) | Generare frecvente audio pentru buzzer pasiv — intern foloseste Timer2 |
| TWI/I2C (Wire.h) | Comunicatie cu modulul LCD prin 2 fire (SDA/SCL) |
| EEPROM | Stocare persistenta a high score-ului la adresa 0 |
| Intreruperi soft (debounce) | Eliminarea zgomotului mecanic al butoanelor prin delay 50ms + asteptare release |
// Masina de stari implementata prin apeluri recursive de functii: asteaptaStart() └─> animatieStart() + afisare LCD "SIMON SAYS + Best Score" └─> asteapta apasare buton → incepeJoc() incepeJoc() └─> reseteaza lungime=1, viteza=600ms, scor=0 └─> genereazaSecventa() → arataSiAsteapta() arataSiAsteapta() └─> afiseaza nivel + viteza pe LCD └─> aprinde LED-urile pe rand cu sunet (secventa) └─> pentru fiecare element din secventa: asteaptaButon() └─> corect: feedback LED+sunet, continua └─> gresit: gameOver() └─> dupa secventa completa: animatieVictorie() └─> dificultate adaptiva: scade viteza (creste dificultatea) └─> bonus daca 3 consecutive corecte └─> genereazaSecventa() + arataSiAsteapta() (nivel urmator) gameOver() └─> dificultate adaptiva: creste viteza (scade dificultatea) └─> verifica si salveaza high score in EEPROM └─> afisare LCD "Game Over + Scor + Best" └─> asteaptaStart()
Validarea s-a realizat in mai multe etape:
1. Testare LED-uri individual:
// Cod de test: fiecare buton aprinde LED-ul corespunzator if (digitalRead(butoane[i]) == LOW) digitalWrite(leduri[i], HIGH);
2. Validare prin Serial Monitor: La fiecare eveniment (nivel, apasare buton, corect/gresit) se afiseaza mesaje pe Serial Monitor la 9600 baud:
=== Nivel: 3 | Viteza: 540ms === -> ROSU -> VERDE -> ALBASTRU Randul tau! Apasat: ROSU -> Corect! Apasat: VERDE -> Corect! Apasat: ALBASTRU -> Corect! BONUS VITEZA! 3 consecutive corecte!
3. Testare EEPROM: Dupa game over cu scor nou, s-a verificat ca la resetare hardware scorul persista (afisat pe LCD la pornire).
Proiectul functioneaza conform specificatiilor:
Proiectul Simon Says a fost implementat cu succes pe placa ATmega328P Xplained Mini, demonstrand utilizarea GPIO, I2C, EEPROM si timer-e in cadrul framework-ului Arduino.
Principalele provocari intampinate: