Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:alexandru.jipa2803:florin.badilas [2026/05/24 17:19]
florin.badilas [Prototip]
pm:prj2026:alexandru.jipa2803:florin.badilas [2026/05/24 17:23] (current)
florin.badilas [Prototip]
Line 54: Line 54:
  
 {{ :​pm:​prj2026:​alexandru.jipa2803:​moodpet_prototip.png?​700 |MoodPet - prototip initial }} {{ :​pm:​prj2026:​alexandru.jipa2803:​moodpet_prototip.png?​700 |MoodPet - prototip initial }}
- 
-Prototipul inițial MoodPet: ATmega328P-XMINI,​ LCD I2C, senzor DHT11, senzor de lumină TEMT6000, LED RGB, buzzer și butoane. 
  
 ==== Video demonstrativ ==== ==== Video demonstrativ ====
Line 105: Line 103:
 | GPIO | Butoane, LED RGB și buzzer | | GPIO | Butoane, LED RGB și buzzer |
 | TWI / I2C | Comunicare LCD | | TWI / I2C | Comunicare LCD |
-| Timer / millis | Actualizare stări, joc și evenimente ​|+| Timer / millis | Actualizare stări și joc |
 | DHT library | Citire temperatură și umiditate | | DHT library | Citire temperatură și umiditate |
  
 ==== Structura software ==== ==== Structura software ====
 +
 +Software-ul proiectului este organizat modular, fiecare componentă importantă fiind controlată prin funcții separate. Logica principală este implementată în jurul unei mașini de stări (state machine), care gestionează atât meniurile, cât și comportamentul companionului virtual.
 +
 +Fluxul principal al aplicației este:
  
   * citirea periodică a senzorilor   * citirea periodică a senzorilor
-  * calcularea stării ​companionului ​virtual +  * actualizarea statisticilor ​companionului 
-  * gestionarea meniului de nume +  * calcularea mood-ului 
-  * gestionarea meniului principal de informații +  * aplicarea efectelor vizuale și sonore 
-  * gestionarea meniului ​de hrănire +  * gestionarea meniului ​activ 
-  * implementarea mini-game-ului de dexteritate +  * afișarea informațiilor pe LCD 
-  * controlul ​LED-ului RGB + 
-  * generarea efectelor sonore +Pentru actualizarea periodică a sistemului a fost folosit millis() în locul unor delay-uri mari. Această abordare permite rularea simultană a mai multor sisteme fără blocarea programului ​principal
-  * sistem ​de XP și level+ 
 +==== Implementarea meniurilor ==== 
 + 
 +Interfața utilizatorului este organizată sub forma mai multor meniuri: 
 + 
 +  * NAME_MENU 
 +  * INFO_MENU 
 +  * FEED_MENU 
 +  * PLAY_MENU 
 + 
 +Fiecare meniu are propriul comportament și propriile funcții asociate butoanelor. 
 + 
 +În meniul de nume, utilizatorul poate construi numele companionului literă cu literă folosind cele patru butoane. Litera curentă este modificată incremental,​ iar confirmarea finalizează procesul și trece în meniul principal. 
 + 
 +În meniul principal sunt afișate mai multe pagini ​de informații ​deoarece LCD-ul de 16x2 caractere nu permite afișarea simultană a tuturor datelor. Navigarea între pagini este realizată folosind Butonul 4. 
 + 
 +==== Debounce pentru butoane ==== 
 + 
 +Pentru butoane a fost implementat debounce software. 
 + 
 +Butoanele mecanice produc oscilații electrice foarte scurte în momentul apăsării, ceea ce poate genera mai multe detectări pentru o singură apăsare. 
 + 
 +Pentru a evita această problemă, fiecare apăsare este verificată astfel: 
 + 
 +  * se detectează tranziția HIGH → LOW 
 +  * se aplică un delay scurt 
 +  * se verifică din nou starea butonului 
 +  * doar apoi apăsarea este considerată validă 
 + 
 +Astfel sunt eliminate apăsările multiple accidentale. 
 + 
 +==== Calcularea mood-ului ==== 
 + 
 +Mood-ul companionului nu este bazat pe o singură condiție, ci pe un sistem intern ​de scor. 
 + 
 +Scorul este influențat de: 
 + 
 +  * nivelul de foame 
 +  * energia rămasă 
 +  * temperatura 
 +  * umiditatea 
 +  * lumina ambientală 
 +  * nivelul de happiness 
 + 
 +Fiecare factor aplică penalizări sau bonusuri asupra scorului total. Această abordare produce un comportament mai natural și mai variat decât folosirea unor praguri fixe. 
 + 
 +Exemple: 
 + 
 +  * temperatură foarte mare → scade scorul 
 +  * foame ridicată → scade scorul 
 +  * lumină redusă și energie mică → SLEEPY 
 +  * happiness mare și condiții bune → HAPPY 
 + 
 +==== Sistemul de statistici ==== 
 + 
 +MoodPet utilizează mai multe statistici interne: 
 + 
 +  * hunger 
 +  * energy 
 +  * happiness 
 +  * XP 
 +  * level 
 + 
 +Aceste valori sunt actualizate periodic. 
 + 
 +Foamea crește automat în timp, energia scade, iar happiness-ul este influențat atât de mediul exterior, cât și de interacțiunea utilizatorului. 
 + 
 +Hrănirea companionului reduce foamea și oferă bonus de happiness și XP. O porție mai mare oferă bonus mai mare, dar reduce puțin energia. 
 + 
 +==== Mini-game de dexteritate ​==== 
 + 
 +Mini-game-ul este implementat folosind o a doua mașină de stări: 
 + 
 +  * PLAY_START 
 +  * PLAY_WAIT 
 +  * PLAY_SIGNAL 
 + 
 +La pornirea jocului: 
 + 
 +  * LED-ul RGB este stins 
 +  * sistemul generează un timp random folosind random() 
 +  * după expirarea timpului, LED-ul devine verde 
 +  * utilizatorul trebuie să apese rapid Butonul 1 
 + 
 +Timpul ​de reacție este măsurat folosind millis(). 
 + 
 +În funcție de timpul de reacție: 
 + 
 +  * utilizatorul primește happiness și XP 
 +  * sau pierde happiness dacă reacționează prea târziu ori prea devreme 
 + 
 +==== Controlul LED-ului RGB și buzzerului ==== 
 + 
 +LED-ul RGB oferă feedback vizual pentru mood și pentru mini-game. 
 + 
 +Exemple: 
 + 
 +  * verde → HAPPY 
 +  * albastru → SLEEPY 
 +  * roșu → ANGRY 
 +  * verde aprins → semnal pentru joc 
 + 
 +Buzzerul este folosit pentru: 
 + 
 +  * confirmări de meniu 
 +  * level up 
 +  * erori 
 +  * feedback în mini-game
  
 ===== Meniuri implementate ===== ===== Meniuri implementate =====
Line 124: Line 233:
 ==== Meniul de nume ==== ==== Meniul de nume ====
  
-La pornire, utilizatorul alege numele companionului virtual. Numele poate fi introdus literă cu literă folosind butoanele.+La pornire, utilizatorul alege numele companionului virtual.
  
   * Buton 1 - litera următoare   * Buton 1 - litera următoare
Line 132: Line 241:
  
 ==== Meniul principal ==== ==== Meniul principal ====
- 
-După alegerea numelui, MoodPet afișează informații despre companion și despre mediu. 
  
 Pagini afișate: Pagini afișate:
Line 143: Line 250:
  
 ==== Meniul de hrănire ==== ==== Meniul de hrănire ====
- 
-Meniul de hrănire permite alegerea unei porții de mâncare. 
  
   * Buton 2 - scade porția   * Buton 2 - scade porția
   * Buton 3 - crește porția   * Buton 3 - crește porția
   * Buton 4 - confirmă hrănirea   * Buton 4 - confirmă hrănirea
- 
-După hrănire, nivelul de foame scade, iar happiness și XP cresc. O porție mai mare oferă un bonus mai mare de happiness, dar scade puțin energia. 
  
 ==== Mini-game de dexteritate ==== ==== Mini-game de dexteritate ====
  
-Mini-game-ul este pornit ​din meniul principal ​cu Butonul 2.+Mini-game-ul este pornit cu Butonul 2 din meniul principal.
  
-Funcționare:​ +Utilizatorul ​trebuie să reacționeze rapid după aprinderea ​LED-ului verde pentru a primi bonus de happiness și XP.
- +
-  * LED-ul RGB se stinge +
-  * utilizatorul ​trebuie să aștepte +
-  * după un timp aleator, ​LED-ul devine ​verde +
-  * utilizatorul trebuie să apese rapid Butonul 1 +
-  * timpul ​de reacție influențează recompensa +
- +
-Dacă utilizatorul apasă prea devreme sau prea târziu, happiness scade. Dacă reacționează rapid, ​happiness și XP cresc.+
  
 ===== State Machine ===== ===== State Machine =====
  
-MoodPet utilizează ​mașină de stări ​pentru meniuri și comportament.+MoodPet utilizează ​două mașini de stări:
  
-Meniuri ​principale:+Prima controlează meniurile ​principale:
  
   * NAME_MENU   * NAME_MENU
Line 177: Line 272:
   * PLAY_MENU   * PLAY_MENU
  
-Stări de joc:+A doua controlează mini-game-ul:
  
   * PLAY_START   * PLAY_START
Line 183: Line 278:
   * PLAY_SIGNAL   * PLAY_SIGNAL
  
-Mood-ul companionului este calculat pe baza unui scor intern influențat de foame, energie, fericire, temperatură, umiditate ​și lumină.+Această abordare permite separarea logicii ​și organizarea mai clară a codului.
  
 ===== Rezultate obținute ===== ===== Rezultate obținute =====
Line 190: Line 285:
  
   * alegerea numelui companionului virtual   * alegerea numelui companionului virtual
-  * afișarea mai multor pagini ​de informații ​pe LCD+  * afișarea mai multor pagini pe LCD
   * citirea temperaturii și umidității cu DHT11   * citirea temperaturii și umidității cu DHT11
   * citirea luminii ambientale cu TEMT6000   * citirea luminii ambientale cu TEMT6000
-  * controlul LED-ului RGB în funcție de stare+  * controlul LED-ului RGB în funcție de mood
   * feedback sonor prin buzzer   * feedback sonor prin buzzer
-  * hrănirea pet-ului printr-un meniu interactiv +  * meniuri interactive bazate pe butoane 
-  * mini-game de dexteritate ​pentru creșterea happiness și XP +  * mini-game de dexteritate 
-  * sistem de mood, food, energyhappinessXP și level+  * sistem de mood, food, energy ​și happiness 
 +  * sistem de XP și level
  
 ===== Concluzii ===== ===== Concluzii =====
  
-MoodPet este un sistem embedded interactiv care transformă datele citite de la senzori ​într-un comportament ​virtual. Proiectul ​nu se limitează la afișarea unor valorici implementează un companion digital cu meniuristări, reacții, sunete ​și interacțiune ​prin butoane.+MoodPet este un sistem embedded interactiv care combină senzori, meniuri și logică software pentru a simula comportamentul unui companion ​virtual. Proiectul ​utilizează tehnici de programare embedded precum state machinedebounce softwareactualizare non-blocking cu millis() ​și control hardware ​prin GPIO și ADC.
  
 ===== Download ===== ===== Download =====
pm/prj2026/alexandru.jipa2803/florin.badilas.1779632395.txt.gz · Last modified: 2026/05/24 17:19 by florin.badilas
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0