This shows you the differences between two versions of the page.
pm:prj2025:fstancu:maria.popescu0411 [2025/05/27 21:12] maria.popescu0411 [Lista de componente] |
pm:prj2025:fstancu:maria.popescu0411 [2025/05/30 00:52] (current) maria.popescu0411 [Lista de componente] |
||
---|---|---|---|
Line 201: | Line 201: | ||
{{:pm:prj2025:fstancu:breadboard1.jpg?300|}} {{:pm:prj2025:fstancu:breadboard2.jpg?300|}} | {{:pm:prj2025:fstancu:breadboard1.jpg?300|}} {{:pm:prj2025:fstancu:breadboard2.jpg?300|}} | ||
+ | {{ :pm:prj2025:fstancu:carcasa.jpg?nolink&300 |}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | === Descrierea codului aplicaţiei === | ||
- | <note tip> | + | * Mediu de dezvoltare: proiectul a fost dezvoltat folosind mediul de programare **Arduino IDE**, utilizând limbajul C++ specific microcontrolerelor compatibile cu Arduino. Testele au fost realizate direct pe placă, folosind atât afișajele fizice cât și Serial Monitor pentru depanare și verificare a stărilor interne. |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * Biblioteci utilizate: |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | * **LiquidCrystal.h** – pentru afișarea mesajelor text pe un LCD 16x2, controlat în mod paralel. |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * **EEPROM.h** – pentru salvarea persistentă a modului de joc preferat de utilizator, astfel încât selecția să fie reținută și după oprirea alimentării. |
- | * (etapa 3) surse şi funcţii implementate | + | * **Arduino.h** – biblioteca implicită ce furnizează funcționalitățile de baza |
- | </note> | + | ==== Structura aplicației ==== |
+ | Codul aplicației este structurat în jurul a două componente principale: | ||
+ | |||
+ | * **Interfața utilizatorului** – compusă din butoane fizice, LCD și buzzer. Utilizatorul poate naviga prin modurile de joc, poate porni partida, schimba tura, reseta jocul sau pune pauză. | ||
+ | | ||
+ | * **Controlul afișajelor și timpului** – două afișaje cu 4 cifre (7 segmente) sunt folosite pentru a arăta timpul fiecărui jucător în format MM:SS. Timpul este decrementat în funcție de tură, iar logica internă se ocupă de comutarea între jucători și semnalizarea stărilor prin buzzer și LCD. | ||
+ | |||
+ | Logica principală se bazează pe funcțiile standard Arduino: `setup()` (inițializare) și `loop()` (execuție continuă). În cadrul `loop()`, se gestionează evenimentele produse de butoane și se actualizează timpul și afișajele în mod continuu, în funcție de starea curentă a jocului. | ||
+ | |||
+ | ==== Algoritmi și structuri implementate ==== | ||
+ | |||
+ | Aplicația implementează următoarele funcționalități software relevante: | ||
+ | |||
+ | * **Selectarea modului de joc** – utilizatorul navighează între modurile Blitz (5 minute), Rapid (10 minute) și Classic (30 minute) folosind două butoane. La selecție, modul este salvat în EEPROM pentru a fi reîncărcat automat la o repornire viitoare. | ||
+ | | ||
+ | * **Cronometru decremental** – timpul fiecărui jucător este decrementat o dată pe secundă, folosind funcția `millis()` pentru a asigura temporizare fără a bloca execuția restului codului. | ||
+ | | ||
+ | * **Multiplexare afișaj 7 segmente** – fiecare dintre cele două afișaje este controlat direct, fără un driver dedicat. Pentru a reduce numărul de pini utilizați și a menține afișajul stabil, s-a implementat o rutină de multiplexare rapidă a celor 4 cifre. | ||
+ | | ||
+ | * **Debounce software pentru butoane** – toate butoanele sunt gestionate cu o întârziere software de 200 ms, pentru a preveni detectarea accidentală a unor apăsări multiple cauzate de rebond mecanic. | ||
+ | | ||
+ | * **Gestionarea logicii de joc** – cronometrul rulează doar pentru jucătorul activ. La apăsarea butonului propriu, jucătorul oprește timpul său și pornește timpul adversarului. Dacă timpul unui jucător expiră, jocul se oprește automat și este declanșată o alarmă sonoră. | ||
+ | |||
+ | ==== Funcții importante implementate în cod ==== | ||
+ | |||
+ | ^ Funcție ^ Descriere ^ | ||
+ | | `setup()` | Configurează pinii, initializează LCD-ul, încarcă modul salvat din EEPROM și pregătește componentele pentru execuția logicii principale. | | ||
+ | | `loop()` | Gestionează selecția modului de joc, desfășurarea partidei, schimbarea turelor, decrementarea timpului și actualizarea afișajelor. Toate sunt controlate de un state machine simplificat. | | ||
+ | | `updateDisplay(...)`| Actualizează valorile de timp pe afișajul 7 segmente prin multiplexare. Activează fiecare cifră pe rând cu un delay scurt pentru a simula refresh continuu. | | ||
+ | | `showDigit(...)` | Afișează o cifră pe una dintre cele patru poziții ale unui afișaj. Activează doar segmentele necesare. | | ||
+ | | `playSwitchBeep()` | Redă un sunet scurt prin buzzer la schimbarea de tură. | | ||
+ | | `playAlarm()` | Declanșează o secvență sonoră repetitivă când timpul unui jucător a expirat. | | ||
+ | |||
+ | ==== Utilizarea memoriei EEPROM ==== | ||
+ | |||
+ | Pentru a îmbunătăți experiența utilizatorului și a evita selecția repetată a modului de joc la fiecare pornire, proiectul folosește EEPROM pentru a salva indexul modului de joc selectat. | ||
+ | |||
+ | * La pornirea sistemului, valoarea este citită de la adresa 0 folosind `EEPROM.read(0)` și validată. | ||
+ | * Dacă este validă, aceasta este folosită ca mod implicit. | ||
+ | * După selectarea unui mod nou, valoarea este salvată cu `EEPROM.update(0, currentMode)` pentru a evita uzura memoriei EEPROM. | ||
+ | |||
+ | |||
+ | ==== Cod sursă ==== | ||
+ | |||
+ | Codul complet al aplicației poate fi consultat în repository-ul public de pe GitHub: | ||
+ | https://github.com/biancapopescu0411/arduino-digital-chess-clock | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | <html> |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Acesta este un video demonstrativ cu functionalitatea proiectului: |
- | </note> | + | <iframe width="560" height="315" src="https://youtube.com/embed/BtILUhTNpQM" |
+ | frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" | ||
+ | allowfullscreen></iframe> | ||
+ | </html> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | ===== Download ===== | + | Proiectul realizat este un ceas digital de sah complet functional, care permite selectarea modului de joc, afisarea timpului pentru fiecare jucator si semnalizarea sonora in momentele importante. Am folosit un LCD pentru interfata cu utilizatorul, doua afisaje cu 7 segmente pentru a afisa timpii si mai multe butoane pentru interactiune directa. |
+ | |||
+ | Pe parcursul implementarii am aplicat notiuni invatate la mai multe laboratoare, cum ar fi lucrul cu afisaje digitale, butoane, semnalizare cu buzzer si salvarea datelor in EEPROM. Proiectul a fost o ocazie buna de a pune in practica teoria si de a intelege mai bine cum functioneaza un sistem embedded complet. | ||
- | <note warning> | + | Am facut inclusiv lucru manual, construind si o carcasa pentru a proteja componentele si pentru a oferi un aspect mai profesional. Pe viitor, as putea adauga si alte functii, cum ar fi increment de timp sau salvarea scorurilor. |
- | 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**. | + | In final, proiectul mi-a oferit o experienta completa si m-a ajutat sa inteleg mai bine ce inseamna sa construiesti un dispozitiv electronic real, de la idee pana la testare. |
- | </note> | + | |
- | ===== Jurnal ===== | ||
- | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
- | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== |