This shows you the differences between two versions of the page.
pm:prj2025:rnedelcu:alexandru.lintmaier [2025/05/23 20:31] alexandru.lintmaier [Descriere generală] |
pm:prj2025:rnedelcu:alexandru.lintmaier [2025/05/28 12:33] (current) alexandru.lintmaier [Download] |
||
---|---|---|---|
Line 3: | Line 3: | ||
<note tip> | <note tip> | ||
- | Proiectul meu constă în realizarea unui joc de tip Spânzurătoarea, implementat pe o platformă cu microcontroler (ex: Arduino UNO). Utilizatorul are la dispoziție X de secunde pentru a ghici un cuvânt ales aleator dintr-o bază de date predefinită. Jocul este controlat cu ajutorul a două butoane: unul pentru navigarea prin literele alfabetului ('A'-'Z') și unul pentru selectarea literei curente. Dacă litera selectată se regăsește în cuvânt, se completează spațiile corespunzătoare și se aprinde un LED galben. La final, dacă jucătorul reușește să ghicească cuvântul, LED-ul devine verde; dacă timpul expiră, se aprinde LED-ul roșu. | + | Proiectul este o implementare fizică a celebrului joc de ghicit cuvinte „Spânzurătoarea", realizat cu microcontrollerul Arduino UNO și afișat pe un ecran LCD 16x2. Jucătorul navighează prin alfabet cu ajutorul a trei butoane și selectează litere pentru a ghici un cuvânt din categorii predefinite (Animale, Fructe, Țări, sau Aleator). |
- | De asemenea, proiectul are si urmatoarele optiuni: | + | Sistemul oferă feedback vizual prin LED-uri (verde pentru succes, roșu pentru eșec) și feedback sonor prin buzzer. Jocul include mai multe niveluri de dificultate (Ușor, Mediu, Greu) și permite jucătorului să facă maximum 6 greșeli înainte de a pierde. |
- | - sa pot tine apasat pe unul din butoate pentru a trece mai repede prin literele de la A la Z | + | Scopul proiectului este să combine concepte esențiale de programare embedded: interfațarea cu LCD prin I2C, gestionarea input-urilor prin butoane, feedback vizual/audio și implementarea unei logici de joc interactive. |
- | + | ||
- | - jucatorul isi poate introduce numele la inceputul jocului. Astfel, se salveaza numele si highscore-ul pe un card SD sau in memoria interna | + | |
- | + | ||
- | - mai multe nivele de dificultate din care se pote alege la inceput | + | |
- | + | ||
- | Am ales acest proiect pentru a îmbina concepte esențiale în lucrul cu microcontrolere: maparea butoanelor, utilizarea temporizatorului, afisarea pe LCD și interacțiunea utilizator-hardware. Proiectul este distractiv, ușor de extins și oferă o bază solidă pentru învățarea noțiunilor embedded. | + | |
</note> | </note> | ||
Line 24: | Line 18: | ||
- | Proiectul este alcătuit din următoarele module: | + | Sistemul se bazează pe microcontrollerul Arduino UNO (ATmega328P) care acționează ca unitate de control principală. Comunicarea cu LCD-ul se realizează prin protocolul I2C la adresa 0x27, reducând numărul de pini necesari. |
- | Control input (butoane) – pentru navigarea prin alfabet și selectarea literelor. | + | La pornire, jucătorul selectează categoria de cuvinte și nivelul de dificultate folosind butoanele LEFT/RIGHT pentru navigare și SELECT pentru confirmare. Sistemul alege aleator un cuvânt din categoria selectată și afișează numărul de litere. |
- | Display LCD – pentru afișarea cuvântului parțial ghicit și a timpului rămas. | + | În timpul jocului, jucătorul navighează prin alfabetul A-Z cu butoanele LEFT/RIGHT și selectează litere cu butonul SELECT. Fiecare literă ghicită corect este afișată pe pozițiile corespunzătoare, iar greșelile sunt contorizate și vizualizate prin desenarea progresivă a spânzurătorii pe LCD. |
- | LED RGB – pentru semnalizarea stării jocului: progres (galben), câștig (verde), pierdere (roșu). | + | Jocul se termină prin victorie (toate literele ghicite) sau înfrângere (6 greșeli), cu posibilitatea de restart automată. |
- | + | ||
- | Timer – pentru contorizarea timpului limită de joc (90 secunde). | + | |
- | + | ||
- | Memorie statică – cuvinte prestabilite (hardcoded în cod sau extrase din EEPROM/SD). | + | |
- | + | ||
- | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | + | |
</note> | </note> | ||
Line 42: | Line 30: | ||
<note tip> | <note tip> | ||
- | Componente folosite: | + | | Nume Componentă | Cantitate | Descriere | |
+ | |---|---|---| | ||
+ | | Arduino UNO R3 | 1 | Microcontroller ATmega328P | | ||
+ | | LCD 16x2 cu I2C | 1 | Display cu interfață I2C (adresa 0x27) | | ||
+ | | Butoane tactile | 3 | LEFT, SELECT, RIGHT | | ||
+ | | LED Verde | 1 | Feedback pozitiv | | ||
+ | | LED Roșu | 1 | Feedback negativ | | ||
+ | | Buzzer Pasiv | 1 | Feedback audio | | ||
+ | | Rezistențe 220Ω | 3 | Pentru LED-uri si Buzzer | | ||
+ | | Rezistențe 10kΩ | 3 | Pull-down pentru butoane | | ||
+ | | Breadboard | 1 | Montaj circuit | | ||
+ | | Fire de conectare | Diverse | Conexiuni | | ||
- | Microcontroler: Arduino UNO / ATmega328P | ||
- | 2 butoane (Select / Navigare) | + | **Funcționalitate hardware & conexiuni** |
- | LED RGB | + | 1. Arduino UNO |
+ | - Rol: controler principal cu microcontroller ATmega328P | ||
+ | - Alimentare: 5V prin USB sau alimentator extern | ||
- | LCD 16x2 (I2C sau paralel) | + | 2. LCD 16x2 cu I2C |
+ | - Rol: afișează starea jocului, meniurile și progresul | ||
+ | - Alimentare: 5V și GND | ||
+ | - Comunicare: SDA (A4), SCL (A5) - interfață I2C | ||
- | (Opțional) Card SD pentru salvare scoruri/nume | + | 3. Butoane |
+ | - Configurare: pull-down extern cu rezistențe de 10kΩ | ||
+ | - Stare default: LOW, HIGH la apăsare | ||
+ | - Debouncing: software cu delay de 200ms | ||
- | Rezistențe de pull-down pentru butoane | + | 4. LED-uri |
+ | - Verde (pin 8): feedback pentru litere corecte | ||
+ | - Roșu (pin 10): feedback pentru greșeli | ||
- | Sursă alimentare 5V | + | 5. Buzzer pasiv (pin 7) |
+ | - Emite tonuri diferite pentru success/fail/navigare | ||
+ | - Folosește funcția tone() pentru generarea frecvențelor | ||
- | Scheme electrice și semnale: | ||
- | Butoanele conectate la pini digitali cu întreruperi externe | ||
- | PWM pentru controlul culorii LED-ului RGB | + | **Tabel cu alocarea pinilor** |
- | LCD conectat prin interfață I2C pentru economie de pini | + | | Pin Arduino | Funcție | Nume Reg. MCU | Direcție | Motiv alegere | |
+ | |---|---|---|---|---| | ||
+ | | 2 | Buton LEFT | PD2 | IN | Navigare alfabet | | ||
+ | | 4 | Buton SELECT | PD4 | IN | Selecție literă | | ||
+ | | 6 | Buton RIGHT | PD6 | IN | Navigare alfabet | | ||
+ | | 7 | Buzzer | PD7 | OUT | Feedback audio | | ||
+ | | 8 | LED Verde | PB0 | OUT | Feedback pozitiv | | ||
+ | | 10 | LED Roșu | PB2 | OUT | Feedback negativ | | ||
+ | | A4 | SDA (I2C) | PC4 | OUT | Date către LCD | | ||
+ | | A5 | SCL (I2C) | PC5 | OUT | Ceas I2C | | ||
{{:pm:prj2025:rnedelcu:tinkercad3.png?200|}} | {{:pm:prj2025:rnedelcu:tinkercad3.png?200|}} | ||
Line 70: | Line 87: | ||
{{:pm:prj2025:rnedelcu:tinkercad4.png?200|}} | {{:pm:prj2025:rnedelcu:tinkercad4.png?200|}} | ||
- | {{:pm:prj2025:rnedelcu:poza_proiect.jpg?200|}} | + | {{:pm:prj2025:rnedelcu:pozaa.jpg?200|}} |
Line 79: | Line 96: | ||
<note tip> | <note tip> | ||
- | Medii și librării: | ||
- | Arduino IDE | + | **Biblioteci utilizate** |
- | Librărie LiquidCrystal_I2C pentru LCD | + | - LiquidCrystal_I2C.h: control LCD 16x2 prin I2C la adresa 0x27 |
- | TimerOne pentru contorizarea timpului | ||
- | EEPROM sau SD.h dacă se implementează salvare scoruri | + | **Structura software** |
+ | Programul este organizat în următoarele module functionale: | ||
- | Funcționalități software planificate: | + | 1. Inițializare (setup()) |
+ | - Configurare LCD și pini | ||
+ | - Crearea caracterelor personalizate pentru spânzurătoare | ||
+ | - Afișare mesaj de bun venit | ||
- | Interfață de navigare alfabet (cu accelerare la apăsare lungă) | + | 2. Selecția configurației (start()) |
+ | - Navigare prin categorii: Animale, Fructe, Țări, Aleator | ||
+ | - Selectare dificultate: Ușor, Mediu, Greu | ||
+ | - Alegerea aleatoare a cuvântului din setul corespunzător | ||
- | Afișare progres pe LCD (cu actualizări dinamice) | + | 3. Bucla principală (loop()) |
+ | - Gestionarea input-urilor de la butoane | ||
+ | - Navigarea prin alfabet (A-Z) | ||
+ | - Procesarea selecției de litere | ||
+ | - Actualizarea stării jocului | ||
- | Semnalizare stări cu LED RGB | + | 4. Afișare și feedback (drawGame(), drawHangman()) |
+ | - Desenarea progresului cuvântului | ||
+ | - Afișarea spânzurătorii progresive | ||
+ | - Feedback vizual/audio pentru acțiuni | ||
- | Cronometru integrat cu întreruperi | + | 5. Logica de joc (hasWon(), gameOver()) |
+ | - Verificarea condițiilor de victorie/înfrângere | ||
+ | - Gestionarea sfârșitului de joc și restart | ||
- | Niveluri de dificultate (opțional: număr de greșeli permise, lungimea cuvântului) | + | **Funcționalități implementate** |
- | Introducere nume utilizator pentru highscore (opțional) | + | - 4 categorii de cuvinte cu câte 6 cuvinte fiecare |
+ | - 3 niveluri de dificultate (2 cuvinte per nivel per categorie) | ||
+ | - Navigare prin alfabet cu butoane LEFT/RIGHT | ||
+ | - Selecție litere cu feedback audio/vizual | ||
+ | - Afișare progresivă a spânzurătorii (8 caractere personalizate) | ||
+ | - Contorizare greșeli (maximum 6) | ||
+ | - Detectare automată victorie/înfrângere | ||
+ | - Sistem de restart automat | ||
+ | - Debouncing software pentru butoane | ||
+ | |||
+ | **Algoritmi principali** | ||
+ | |||
+ | 1. Algoritm de navigare: | ||
+ | - Incrementare/decrementare ciclică prin alfabet (A-Z) | ||
+ | - Limitare la capetele intervalului | ||
+ | |||
+ | 2. Algoritm de verificare literă: | ||
+ | - Căutare în cuvântul țintă cu indexOf() | ||
+ | - Marcare literă ca ghicită în array boolean | ||
+ | - Actualizare progres și contorizare greșeli | ||
+ | |||
+ | 3. Algoritm de verificare victorie: | ||
+ | - Iterare prin toate literele cuvântului | ||
+ | - Verificare dacă toate sunt marcate ca ghicite | ||
+ | |||
+ | 4. Algoritm de afișare spânzurătoare: | ||
+ | - Afișare progresivă a 8 caractere personalizate | ||
+ | - Mapare numărul greșelilor la părțile corpului | ||
</note> | </note> | ||
Line 107: | Line 165: | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Proiectul a fost implementat cu succes, oferind o experiență de joc interactivă și intuitivă. Sistemul funcționează stabil, cu timp de răspuns rapid la input-uri și feedback clar pentru utilizator. |
+ | |||
+ | Caracteristici finale: | ||
+ | - 24 de cuvinte organizate în 4 categorii | ||
+ | - 3 niveluri de dificultate funcționale | ||
+ | - Interface LCD clar și responsive | ||
+ | - Feedback audio/vizual consistent | ||
+ | - Sistem de restart automat functional | ||
+ | |||
+ | Îmbunătățiri posibile: | ||
+ | - Adăugarea unui card SD pentru cuvinte suplimentare | ||
+ | - Implementarea unui sistem de scoruri | ||
+ | - Timer pentru limitarea timpului de joc | ||
+ | - Mai multe categorii de cuvinte | ||
</note> | </note> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul a demonstrat cu succes implementarea unui joc interactiv pe platformă Arduino, combinând multiple concepte de programare embedded: interfațarea I2C, gestionarea input-urilor, generarea de sunete și crearea unei interfețe utilizator intuitive. | ||
+ | |||
+ | Aspectele cele mai valoroase ale implementării: | ||
+ | - Utilizarea eficientă a caracterelor personalizate LCD pentru grafică | ||
+ | - Organizarea modulară a codului pentru ușurință în dezvoltare | ||
+ | - Implementarea unui sistem de feedback multi-modal (vizual/audio) | ||
+ | - Gestionarea corectă a stărilor de joc și tranziților | ||
+ | |||
+ | Proiectul oferă o bază solidă pentru dezvoltarea ulterioară și poate fi extins cu funcționalități suplimentare cum ar fi conectivitate, scoruri online sau AI pentru generarea dinamică de cuvinte. | ||
===== Download ===== | ===== Download ===== | ||
<note warning> | <note warning> | ||
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | Arhiva |
+ | {{:pm:prj2025:rnedelcu:spanzuratoarea.zip|}} | ||
</note> | </note> | ||