Picochi - Digital Pet

Introducere

Picochi este un proiect de tip virtual pet, conceput pentru a simula comportamentul unui animăluț digital care reacționează la schimbările din mediul înconjurător și la interacțiunile utilizatorului. Inspirat de jucăriile clasice Tamagotchi, Picochi utilizează componente fizice și senzori pentru a oferi o experiență interactivă și captivantă.

Animalul virtual este afișat pe un ecran OLED de dimensiuni reduse și poate efectua diverse acțiuni, precum dormitul, joaca sau cererea de hrană. Aceste comportamente sunt declanșate fie prin comenzi directe din partea utilizatorului (apăsare de buton), fie pe baza valorilor preluate de senzori. De exemplu, când lumina ambientală scade, Picochi intră automat în modul de somn, imitând un comportament natural. Când lumina revine, acesta se „trezește” și își reia activitatea normală.

Descriere generală

Schema Bloc

Descrierea Modulelor:

  • User Input (Butoane):
    Trei butoane permit utilizatorului să interacționeze cu animalul virtual: unul pentru a-l hrăni, unul pentru a se juca cu el și unul pentru a reseta starea acestuia.

  • Input Handler (GPIO):
    Citește starea butoanelor folosind intrări digitale și transmite informația către unitatea principală de logică.

  • Light Sensor (ADC):
    Măsoară continuu lumina ambientală și o convertește într-o valoare analogică. Această valoare este interpretată pentru a decide dacă este zi sau noapte.

  • Light Handler Module:
    Compară valoarea senzorului de lumină cu un prag prestabilit. Dacă lumina este prea slabă, animalul virtual intră în modul somn. În caz contrar, acesta rămâne activ.

  • Pet State Manager:
    Reprezintă componenta centrală a programului. Gestionează starea de spirit, nivelul de energie, gradul de foame și starea de somn a animalului. Primește date atât de la utilizator, cât și de la modulul de lumină.

  • Display Controller (OLED - I2C):
    Actualizează ecranul OLED cu animații, pictograme și mesaje în funcție de starea actuală a animalului. Utilizează protocolul de comunicație I2C.

  • Sound Feedback (Buzzer - PWM):
    Redă sunete simple folosind PWM atunci când sunt apăsate butoanele sau când animalul își schimbă starea (de exemplu, devine trist sau fericit).

  • Hardware Design

    Descrierea funcționalității hardware

    Proiectul este realizat pe baza unei plăci Arduino Uno, care coordonează toate intrările și ieșirile. Scopul este simularea unui animal virtual care răspunde la interacțiunea utilizatorului (prin butoane) și la condițiile de lumină ambientală (prin senzor), afișându-și starea pe un ecran OLED și oferind feedback sonor printr-un buzzer.

    Lista de Componente

  • 1x Placă compatibilă Arduino Uno R3
  • 1x OLED 0.96” I2C - Display 128x64, SSD1306
  • 3x Push Buttons
  • 1x Ambient Light Sensor TEMT6000
  • 1x Buzzer pasiv
  • 3x Pull-down Resistors (≈10kΩ)
  • Bill of Materials

    Schema Circuit

    Schemă Electrică

    Componente utilizate și rolul lor:

    - Arduino Uno – Microcontrolerul principal care citește semnalele de la senzori și butoane, procesează logica stărilor și controlează afișajul și buzzerul.

    - Display OLED 128×64 (I2C) – Afișează starea animalului virtual (fericit, flămând, somnoros etc.). Este conectat la interfața I2C a plăcii Arduino (SDA la A4, SCL la A5).

    - Senzor de lumină TEMT6000 – Generează o tensiune analogică proporțională cu luminozitatea ambientală. Ieșirea sa este conectată la pinul analogic A0. Dacă lumina scade sub un prag prestabilit, animalul virtual „adoarme”.

    - Buzzer pasiv – Conectat la pinul D6 (compatibil PWM), este utilizat pentru a reda tonuri scurte atunci când animalul își schimbă starea sau când utilizatorul interacționează cu el.

    - 3 butoane push – Conectate la pinii digitali D7, D8 și D9, fiecare cu o rezistență de 10kΩ spre GND (configurație pull-down). Sunt folosite pentru: hrănirea animalului, joacă, resetarea stării

    Toate componentele sunt alimentate de la 5V și GND.

    Interfețe utilizate:

    I2C – pentru comunicarea cu ecranul OLED (pinii A4 și A5)

    ADC (convertor analog-digital) – pentru citirea valorii de la senzorul de lumină (pinul A0)

    PWM (modulare a lățimii impulsului) – pentru redarea de sunete prin buzzer (pinul D6)

    GPIO – pentru citirea butoanelor (pinii D7, D8, D9)

    Pini Folositi

    Componentă Pin Arduino Motivul alegerii
    OLED Display A4 (SDA), A5 (SCL) Pini dedicați pentru interfața I2C
    TEMT6000 A0 Citire analogică a nivelului de lumină
    Buzzer D6 Pin digital compatibil PWM pentru `tone()`
    Button 1–3 D7, D8, D9 Pini digitali disponibili, ușor de gestionat în cod

    Dovada Functionare

    Software Design

    Mediu de Dezvoltare

    Proiectul este dezvoltat în Arduino IDE, utilizând limbajul C++. Arduino IDE oferă un mediu prietenos pentru programare, testare și încărcare rapidă a codului pe placă. Am folosit bibliotecile standard Arduino, precum și unele biblioteci externe pentru controlul componentelor I2C și OLED.

    Testarea și depanarea au fost realizate prin monitorul serial și feedback vizual/audio.

    Stadiul actual al implementării software

    Funcționalități Implementate
    • Sistem de afișare animat pe OLED SSD1306
    • Interfață grafică completă cu animații pentru toate stările
    • Sistem de management stări (baby/adult cu tranziție automată)
    • Interacțiune prin butoane (Play, Feed, Reset cu debounce)
    • Senzor de lumină ambientală cu detecție automată zi/noapte
    • Feedback audio prin buzzer pentru toate acțiunile
    • Sistem de bare de progres pentru hunger și happiness
    • Timer de evoluție (baby → adult după 3 minute, pentru testare, dar cu posibilitatea de a extinde durata)
    • Sistem de warning audio pentru stări critice
    • Funcționalitate de reset cu confirmare prin apăsare lungă, pentru a nu apăsa din greșeală
    • Mini Game pentru funcționalitatea de Play, pentru a reduce monotonia
    Arhitectura Software

    Proiectul folosește o arhitectură bazată pe state machine cu următoarele componente:

    Main Loop

    ├── Sleep Detection (Light Sensor)

    ├── Button Handling (Debounced)

    ├── State Management

    │ ├── Intro State

    │ ├── Egg Animation State

    │ ├── Baby/Adult Idle State

    │ ├── Sleep State

    │ └── Evolution State

    ├── Status Updates (Hunger/Happiness)

    └── Audio Feedback System

    Motivarea alegerii bibliotecilor

    Adafruit_SSD1306 și Adafruit_GFX

    Folosite pentru controlul ecranului OLED prin I2C. Oferă funcții pentru afișarea de text, pictograme și animații simple.

    Funcții principale utilizate:

    • display.begin(): inițializează ecranul
    • display.clearDisplay(): șterge conținutul ecranului
    • display.print(): pentru afișare de text
    • drawBitmap(): pentru afișarea pictogramelor

    Elementul de noutate al proiectului

    Principala inovație a proiectului PICOCHI constă în integrarea inteligentă a unui senzor de lumină ambientală care transformă experiența statică tradițională într-una dinamică și reactivă la mediul real. Spre deosebire de implementările clasice Tamagotchi care funcționează pe baza unor timere fixe și predictibile, PICOCHI răspunde organic la schimbările de lumină din mediul înconjurător, creând o experiență mai naturală și imersivă. Când senzorul detectează scăderea luminii sub pragul calibrat, personajul virtual intră automat în starea de somn, însoțită de o melodie liniștitoare și animații specifice somnului. Această tranziție nu este doar cosmetică - în timpul somnului, metabolismul virtual se încetinește, făcând ca degradarea parametrilor de foame și fericire să se producă într-un ritm redus. Când lumina revine, personajul se trezește natural, reluându-și activitatea normală.

    Justificarea folosirii funcționalităților de laborator

    Funcționalități integrate:

    I2C

    • Aplicare: comunicația cu display-ul OLED SSD1306
    • Avantaje: doar 2 fire pentru date și clock, protocol robust
    • Implementare: Wire.begin() pentru inițializare, transfer automat prin bibliotecă

    GPIO

    • Butoane: citire digitală cu digitalRead() și debounce software
    • Configurare: pinMode() pentru INPUT

    ADC

    • Senzor lumină: conversie analog-digitală a intensității luminoase
    • Rezoluție: 10-bit (0-1023) pentru precizie suficientă
    • Procesare: conversie la procent pentru logică simplificată

    PWM

    • Buzzer: generare tonuri diferite cu tone() pentru feedback sonor și oprire cu noTone()

    Scheletul Proiectului și Interacțiunea Funcționalităților

    Arhitectura Principală

    Proiectul folosește o mașină de stări centralizată în loop(), cu următoarele componente:

    Inițializare și Intro

    showIntro() → animateEgg() → animateEggExplosion() → starea principală

    Starea Principală (gestionată prin flag-uri boolean):
    • checkSleepCondition(): monitorizează senzorul de lumină
    • animateIdle(): animația de bază când animalul este treaz
    • animateSleep(): animația de somn când este întuneric
    Sistem de Evenimente:
    • triggerHappyAnimation() + runHappyAnimation() + runMiniGame(): răspuns la butonul PLAY
    • triggerEatAnimation() + runEatAnimation(): răspuns la butonul FEED
    • updateHungerAndHappiness(): degradare automată a parametrilor la 30s

    Fluxul Principal de Execuție

    setup()showIntro()

    • Zi: animateIdle() + verificare butoane + update status
    • Noapte: animateSleep() + melodie când “adoarme”

    Modul de Validare a Funcționalităților

    Testare unitară pe componente:
    • Fiecare animație testată individual cu delay-uri controlate
    • Butoanele testate cu Serial Monitor pentru debug
    • Senzorul calibrat în condiții diferite de lumină
    Testare integrată:
    • Sesiuni complete de 5+ minute pentru verificarea evoluției
    • Test de rezistență cu apăsări rapide pentru debounce
    • Validare tranziții zi/noapte cu acoperire/descoperire senzor

    Calibrarea Elementelor de Senzoristică

    Senzorul TEMT6000

    Proces de calibrare experimentală:
    • Măsurători în condiții normale de cameră: ~300-500 (valori ADC)
    • Măsurători în întuneric: ~10-50
    • Prag stabilit: 2% din scala completă (≈20 valori ADC)
    Justificarea pragului:
    • Suficient de sensibil pentru detectarea întunericului natural
    • Rezistent la variații mici de lumină (umbre, mișcări)
    • Testat în diferite condiții: cameră luminoasă, lumină directă de la o lanternă, întuneric complet

    Optimizări Realizate

    Optimizări de Performanță

    Cea mai importantă schimbare a fost înlocuirea funcției delay() cu millis() pentru gestiunea timing-ului. Această abordare permite sistemului să rămână responsiv în timp ce execută animațiile, evitând blocarea celorlalte funcționalități. De exemplu, în timp ce rulează animația de idle, sistemul poate în continuare să detecteze apăsările de butoane sau să monitorizeze senzorul de lumină. Pentru economisirea memoriei, bitmap-urile pentru animații au fost stocate în memoria flash prin directiva PROGMEM, eliberând astfel memoria RAM pentru variabilele active. Această optimizare a fost esențială având în vedere că Arduino Uno are doar 2KB de RAM, iar bitmap-urile pot ocupa rapid acest spațiu. De asemenea, buffer-ul display-ului este reutilizat pentru toate animațiile prin apelarea clearDisplay() și display(), evitând necesitatea mai multor buffere.

    Optimizări de Cod și Arhitectură

    Structura codului a fost organizată modular, separând clar logica de animație de managementul stărilor. Funcția drawCenteredBitmap() este un exemplu de reutilizabilitate - calculează automat poziția centrată pentru orice bitmap, eliminând duplicarea codului și reducând șansele de erori. Această abordare face codul mai ușor de întreținut și extins. Toate variabilele sunt declarate static în scope-ul global sau local, evitând complet alocările dinamice de memorie care ar putea cauza fragmentarea heap-ului pe un microcontroller cu resurse limitate. Utilizarea cuvântului cheie const pentru datele care nu se modifică permite compilatorului să facă optimizări suplimentare și ajută la documentarea intenției codului. Această arhitectură asigură un sistem stabil, responsiv și ușor de extins pentru funcționalități viitoare.

    Optimizări de UX

    Pentru îmbunătățirea experienței utilizatorului, am implementat un sistem de debounce care previne activările accidentale ale butoanelor. Intervalul de 200ms între apăsări s-a dovedit optim după testare - suficient pentru a preveni dublele apăsări, dar nu atât de lung încât să creeze o experiență lentă. Funcția de reset necesită o apăsare lungă de 3 secunde, oferind protecție împotriva resetărilor accidentale care ar distruge progresul jucătorului. Sistemul audio a fost optimizat pentru a nu bloca execuția principală. Melodia de somn se execută progresiv, note cu note, verificând la fiecare ciclu al loop()-ului dacă este timpul pentru următoarea notă. Această abordare permite animalului să continue să doarmă în timp ce muzica se redă în fundal, fără întreruperi în animația de somn. Actualizările parametrilor vitali (foame și fericire) au fost calibrate la 30 de secunde, oferind un echilibru între provocare și jucabilitate. Sistemul de warning-uri emite sunetele doar o dată per episod critic, evitând sunetele repetitive enervante care ar putea să distragă de la experiența de joc.

    Rezultate Obţinute

    Proiectul Picochi a fost finalizat cu succes, rezultând într-un joc funcțional și distractiv care recreează experiența clasică Tamagotchi cu elemente moderne. Am reușit să creez un animal virtual care reacționează natural la mediul înconjurător, adoarme când se întunecă și se trezește la lumină, oferind o experiență mai realistă decât jocurile similare. Sistemul funcționează stabil timp îndelungat fără erori, butoanele răspund prompt la comenzi, iar animațiile sunt fluide și atractive. Prin acest proiect am învățat să lucrez cu multiple componente hardware simultan, să optimizez codul pentru performanță, și să calibrez senzori pentru funcționare optimă.

    https://youtu.be/w-dy4ar_Ra4?si=V-8LC7MzfvqlPeFS

    Demo cu mini game: https://youtube.com/shorts/y88nRnVo5h0?si=fG_Q-Cwj3rChF7mN

    Concluzii

    Realizarea proiectului Picochi a fost o experiență interesantă și chiar distractivă, mai ales în timpul procesului final de testare. Am reușit să experimentez cu diverse arii, de la asamblarea hardware la realizarea animațiilor grafice și dezvoltarea software. Cel mai valoros aspect a fost învățarea să gândesc în termeni de resurse limitate - să optimizez fiecare bucată de cod și să fac compromisuri între funcționalitate și performanță. Procesul de debugging a fost în sine o lecție importantă, mai ales când trebuia să identific de ce senzorul de lumină nu răspundea consistent sau de ce animațiile se opreau neașteptat, dificultăți pe care am reușit să le rezolv într-un final.

    Download

    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.

    Jurnal

    03/05 - Am creat pagina și am adăugat descrierea proiectului

    09/05 - Am comandat piesele principale

    18/05 - Am completat partea de documentatie hardware

    19/05 - Am ridicat toate componentele si am asamblat circuitul fizic

    20/05 - Am testat functionalitatea componentelor

    22/05 - M-am ocupat de partea grafică, inițial căutând online spritesheet, mai apoi prelucrând imaginile

    23/05 - Am implementat prima succesiune de animații și interacțiuni

    24/05 - Am rezolvat problemele de memorie și am adăugat starea “adult”

    25/05 - Am lucrat la calibrarea senzorului de lumină

    Bibliografie/Resurse

    pm/prj2025/avaduva/stefania.draghici.txt · Last modified: 2025/05/28 18:48 by stefania.draghici
    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