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ă.
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.
- 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.
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)
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 |
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.
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
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:
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ă.
I2C
GPIO
ADC
PWM
Proiectul folosește o mașină de stări centralizată în loop(), cu următoarele componente:
showIntro() → animateEgg() → animateEggExplosion() → starea principală
setup() → showIntro() →
Senzorul TEMT6000
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.
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.
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.
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
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.
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.
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ă