This shows you the differences between two versions of the page.
|
pm:prj2026:alexandru.jipa2803:florin.badilas [2026/05/19 22:58] florin.badilas [State Machine] |
pm:prj2026:alexandru.jipa2803:florin.badilas [2026/05/24 17:23] (current) florin.badilas [Prototip] |
||
|---|---|---|---|
| Line 5: | Line 5: | ||
| ===== Introducere ===== | ===== Introducere ===== | ||
| - | MoodPet este un companion virtual embedded inspirat de jocurile de tip Tamagotchi și de consolele portabile retro. Proiectul este bazat pe microcontrollerul ATmega328P-XMINI și combină senzori de mediu, afișare grafică și interacțiune hardware pentru a crea un sistem interactiv cu personalitate proprie. | + | MoodPet este un companion virtual embedded inspirat de jocurile de tip Tamagotchi. Proiectul este bazat pe microcontrollerul ATmega328P-XMINI și combină senzori de mediu, afișare pe LCD, interacțiune prin butoane, feedback vizual prin LED RGB și feedback sonor prin buzzer. |
| - | Scopul proiectului este realizarea unui animal virtual capabil să reacționeze la mediul înconjurător și la acțiunile utilizatorului prin animații, sunete, schimbări de stare și efecte vizuale. | + | Scopul proiectului este realizarea unui animal virtual care reacționează la mediul înconjurător și la acțiunile utilizatorului. MoodPet are nume propriu, stări interne, nivel de foame, energie, fericire, XP și level. |
| - | + | ||
| - | MoodPet monitorizează temperatura, umiditatea și lumina ambientală și își modifică comportamentul în funcție de valorile detectate. Utilizatorul poate interacționa cu companionul virtual folosind butoane dedicate pentru navigare, hrănire, joacă și gestionarea stărilor pet-ului. | + | |
| - | + | ||
| - | Proiectul include un sistem de emoții, energie, foame, experiență și nivel, precum și un sistem de salvare a progresului în memoria EEPROM. În versiunea finală, MoodPet va utiliza un display OLED pentru afișarea unui companion virtual animat și a meniurilor interactive. | + | |
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| - | MoodPet funcționează pe baza unei mașini de stări care controlează comportamentul companionului virtual și actualizează periodic informațiile afișate pe ecran. | + | La pornire, utilizatorul intră în meniul de alegere a numelui. Numele este introdus literă cu literă folosind cele patru butoane. |
| - | Sistemul utilizează senzori pentru citirea mediului și generează reacții vizuale și sonore în funcție de condițiile detectate și de interacțiunea utilizatorului. | + | Funcționalitatea butoanelor în meniul de nume: |
| - | Stările principale ale companionului virtual sunt: | + | * Buton 1 - crește litera curentă |
| + | * Buton 2 - scade litera curentă | ||
| + | * Buton 3 - adaugă litera în nume | ||
| + | * Buton 4 - confirmă numele | ||
| - | * HAPPY | + | După confirmarea numelui, MoodPet intră în meniul principal de informații. Aici sunt afișate mai multe pagini cu informații despre pet și despre mediul înconjurător. |
| - | * CALM | + | |
| - | * HUNGRY | + | |
| - | * SLEEPY | + | |
| - | * SAD | + | |
| - | * ANGRY | + | |
| - | Utilizatorul va putea interacționa cu MoodPet folosind patru butoane: | + | În meniul principal: |
| - | * UP | + | |
| - | * DOWN | + | |
| - | * LEFT | + | |
| - | * RIGHT | + | |
| - | Acestea vor fi utilizate pentru: | + | * Buton 1 - intră în meniul de hrănire |
| - | * navigarea prin meniuri | + | * Buton 2 - pornește mini-game-ul de dexteritate |
| - | * selectarea opțiunilor | + | * Buton 4 - schimbă pagina de informații |
| - | * hrănirea companionului virtual | + | |
| - | * activarea modului sleep | + | |
| - | * pornirea mini-game-urilor | + | |
| MoodPet își modifică starea în funcție de: | MoodPet își modifică starea în funcție de: | ||
| + | |||
| * temperatura detectată | * temperatura detectată | ||
| * umiditatea ambientală | * umiditatea ambientală | ||
| * nivelul de lumină | * nivelul de lumină | ||
| - | * nivelul de energie | ||
| * nivelul de foame | * nivelul de foame | ||
| + | * nivelul de energie | ||
| * nivelul de fericire | * nivelul de fericire | ||
| - | * timpul petrecut în anumite stări | + | * interacțiunea utilizatorului |
| + | |||
| + | Stările principale sunt: | ||
| + | |||
| + | * HAPPY | ||
| + | * CALM | ||
| + | * HUNGRY | ||
| + | * SLEEPY | ||
| + | * SAD | ||
| + | * ANGRY | ||
| - | Sistemul include: | ||
| - | * sistem de emoții și stări | ||
| - | * sistem de energie și foame | ||
| - | * sistem de experiență și nivel | ||
| - | * mod zi/noapte | ||
| - | * sistem de animații și sprite-uri | ||
| - | * mini-game-uri interactive | ||
| - | * sistem de meniuri | ||
| - | * efecte sonore și vizuale | ||
| - | * salvarea progresului în EEPROM | ||
| ===== Schema bloc ===== | ===== Schema bloc ===== | ||
| Line 68: | Line 55: | ||
| {{ :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 și buzzer. | + | ==== Video demonstrativ ==== |
| + | |||
| + | [[https://github.com/FlorinBadilas/MoodPet/blob/main/demo/moodpet_hardware.mp4|MoodPet - video demonstrativ hardware]] | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| Line 76: | Line 65: | ||
| ^ Componentă ^ Model ^ Rol ^ | ^ Componentă ^ Model ^ Rol ^ | ||
| | Microcontroller | ATmega328P-XMINI | Unitate centrală de control | | | Microcontroller | ATmega328P-XMINI | Unitate centrală de control | | ||
| - | | Display LCD | LCD 16x2 I2C | Afișare stare și informații | | + | | Display LCD | LCD 16x2 I2C | Afișare meniu, status și informații | |
| | Senzor temperatură | DHT11 | Detectare temperatură și umiditate | | | Senzor temperatură | DHT11 | Detectare temperatură și umiditate | | ||
| | Senzor lumină | TEMT6000 | Detectare lumină ambientală | | | Senzor lumină | TEMT6000 | Detectare lumină ambientală | | ||
| - | | LED RGB | CJMCU RGB LED Module | Feedback vizual pentru stări | | + | | LED RGB | CJMCU RGB LED Module | Feedback vizual pentru stări și joc | |
| | Buzzer | Active Buzzer 5V | Feedback sonor | | | Buzzer | Active Buzzer 5V | Feedback sonor | | ||
| - | | Butoane | Push Button 6x6x6 | Interacțiune utilizator | | + | | Butoane | Push Button 6x6x6 | Control meniu și interacțiune | |
| | Breadboard | 830 puncte | Prototipare | | | Breadboard | 830 puncte | Prototipare | | ||
| | Fire jumper | Dupont wires | Conexiuni | | | Fire jumper | Dupont wires | Conexiuni | | ||
| - | | Display OLED | SSD1306 128x64 I2C | Afișare grafică și animații | | ||
| - | | Butoane | Push Button 6x6x6 | Control și navigare | | ||
| ==== Conexiuni principale ==== | ==== Conexiuni principale ==== | ||
| Line 94: | Line 81: | ||
| * RGB GREEN → PD6 | * RGB GREEN → PD6 | ||
| * RGB BLUE → PD7 | * RGB BLUE → PD7 | ||
| - | * Buton UP → PB0 | + | * Buton 1 → PB0 |
| - | * Buton DOWN → PB1 | + | * Buton 2 → PB1 |
| - | * Buton LEFT → PB2 | + | * Buton 3 → PB2 |
| - | * Buton RIGHT → PB3 | + | * Buton 4 → PB3 |
| * TEMT6000 OUT → PC0 / A0 | * TEMT6000 OUT → PC0 / A0 | ||
| - | * OLED SDA → PC4 / SDA | + | * LCD SDA → PC4 / SDA |
| - | * OLED SCL → PC5 / SCL | + | * LCD SCL → PC5 / SCL |
| ===== Software Design ===== | ===== Software Design ===== | ||
| Line 114: | Line 101: | ||
| ^ Periferic ^ Utilizare ^ | ^ Periferic ^ Utilizare ^ | ||
| | ADC | Citire senzor TEMT6000 | | | ADC | Citire senzor TEMT6000 | | ||
| - | | GPIO | Butoane și LED RGB | | + | | GPIO | Butoane, LED RGB și buzzer | |
| | TWI / I2C | Comunicare LCD | | | TWI / I2C | Comunicare LCD | | ||
| - | | EEPROM | Salvare progres și stare | | + | | Timer / millis | Actualizare stări și joc | |
| - | | Timer | Actualizare stări și evenimente | | + | | DHT library | Citire temperatură și umiditate | |
| ==== Structura software ==== | ==== Structura software ==== | ||
| - | * Citirea periodică a senzorilor | + | 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. |
| - | * Gestionarea mașinii de stări | + | |
| - | * Calcularea mood-ului companionului virtual | + | Fluxul principal al aplicației este: |
| - | * Controlul sistemului de animații | + | |
| - | * Gestionarea meniurilor interactive | + | * citirea periodică a senzorilor |
| - | * Controlul display-ului OLED | + | * actualizarea statisticilor companionului |
| - | * Controlul LED-ului RGB | + | * calcularea mood-ului |
| - | * Generarea efectelor sonore | + | * aplicarea efectelor vizuale și sonore |
| - | * Gestionarea mini-game-urilor | + | * gestionarea meniului activ |
| - | * Salvarea și încărcarea progresului din EEPROM | + | * afișarea informațiilor pe LCD |
| + | |||
| + | 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. | ||
| + | |||
| + | ==== 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 ===== | ||
| + | |||
| + | ==== Meniul de nume ==== | ||
| + | |||
| + | La pornire, utilizatorul alege numele companionului virtual. | ||
| + | |||
| + | * Buton 1 - litera următoare | ||
| + | * Buton 2 - litera anterioară | ||
| + | * Buton 3 - adaugă litera selectată | ||
| + | * Buton 4 - confirmă numele | ||
| + | |||
| + | ==== Meniul principal ==== | ||
| + | |||
| + | Pagini afișate: | ||
| + | |||
| + | * nume + mood | ||
| + | * temperatură, umiditate și lumină | ||
| + | * food, energy și happiness | ||
| + | * level, XP și timp de funcționare | ||
| + | |||
| + | ==== Meniul de hrănire ==== | ||
| + | |||
| + | * Buton 2 - scade porția | ||
| + | * Buton 3 - crește porția | ||
| + | * Buton 4 - confirmă hrănirea | ||
| + | |||
| + | ==== Mini-game de dexteritate ==== | ||
| + | |||
| + | Mini-game-ul este pornit cu Butonul 2 din meniul principal. | ||
| + | |||
| + | Utilizatorul trebuie să reacționeze rapid după aprinderea LED-ului verde pentru a primi bonus de happiness și XP. | ||
| ===== State Machine ===== | ===== State Machine ===== | ||
| - | MoodPet utilizează o mașină de stări pentru gestionarea comportamentului companionului virtual și a interacțiunii cu utilizatorul. | + | MoodPet utilizează două mașini de stări: |
| - | Flux principal: | + | Prima controlează meniurile principale: |
| - | * HAPPY → CALM | + | * NAME_MENU |
| - | * CALM → HUNGRY | + | * INFO_MENU |
| - | * HUNGRY → ANGRY | + | * FEED_MENU |
| - | * HAPPY → PLAYING | + | * PLAY_MENU |
| - | * PLAYING → HAPPY | + | |
| - | * HAPPY → SLEEPY | + | |
| - | * SLEEPY → HAPPY | + | |
| - | * SAD → ANGRY | + | |
| - | ===== Rezultate așteptate ===== | + | |
| - | Rezultatul final va fi un companion digital interactiv capabil să reacționeze la mediu și la utilizator prin efecte vizuale, sonore și modificări de comportament. | + | A doua controlează mini-game-ul: |
| - | MoodPet va combina senzori, periferice și logică embedded pentru realizarea unui sistem interactiv și creativ bazat pe microcontroller. | + | * PLAY_START |
| + | * PLAY_WAIT | ||
| + | * PLAY_SIGNAL | ||
| + | |||
| + | Această abordare permite separarea logicii și organizarea mai clară a codului. | ||
| + | |||
| + | ===== Rezultate obținute ===== | ||
| + | |||
| + | Până în acest stadiu, proiectul permite: | ||
| + | |||
| + | * alegerea numelui companionului virtual | ||
| + | * afișarea mai multor pagini pe LCD | ||
| + | * citirea temperaturii și umidității cu DHT11 | ||
| + | * citirea luminii ambientale cu TEMT6000 | ||
| + | * controlul LED-ului RGB în funcție de mood | ||
| + | * feedback sonor prin buzzer | ||
| + | * meniuri interactive bazate pe butoane | ||
| + | * mini-game de dexteritate | ||
| + | * sistem de mood, food, energy și happiness | ||
| + | * sistem de XP și level | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | Proiectul urmărește dezvoltarea unui sistem embedded interactiv care combină senzori și periferice pentru simularea comportamentului unui companion virtual. MoodPet evidențiază utilizarea practică a microcontrollerului pentru citirea mediului, procesarea datelor și controlul dispozitivelor externe. | + | 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 machine, debounce software, actualizare non-blocking cu millis() și control hardware prin GPIO și ADC. |
| ===== Download ===== | ===== Download ===== | ||
| - | * Cod sursă - va fi adăugat ulterior | + | * [[https://github.com/FlorinBadilas/MoodPet|Cod sursă MoodPet - GitHub]] |
| + | * [[https://github.com/FlorinBadilas/MoodPet/blob/main/demo/moodpet_hardware.mp4|Video demonstrativ]] | ||
| * Schema bloc - disponibilă în secțiunea Schema bloc | * Schema bloc - disponibilă în secțiunea Schema bloc | ||
| * Imagini prototip - disponibile în secțiunea Prototip | * Imagini prototip - disponibile în secțiunea Prototip | ||
| + | |||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| * 09.05.2026 - Alegerea temei și stabilirea componentelor necesare | * 09.05.2026 - Alegerea temei și stabilirea componentelor necesare | ||
| * 10.05.2026 - Crearea paginii OCW și realizarea schemei bloc | * 10.05.2026 - Crearea paginii OCW și realizarea schemei bloc | ||
| - | * 11.05.2026 - Configurarea proiectului în PlatformIO și testarea plăcii | ||
| * 11.05.2026 - Testarea componentelor principale și realizarea prototipului inițial | * 11.05.2026 - Testarea componentelor principale și realizarea prototipului inițial | ||
| + | * 12.05.2026 - Implementarea meniului de nume, meniului de hrănire și mini-game-ului de dexteritate | ||
| ===== Bibliografie / Resurse ===== | ===== Bibliografie / Resurse ===== | ||