This is an old revision of the document!
Tamagotchi Circuits este un proiect individual care combină embedded cu o interfață hardware interactivă pe ESP32.
Ideea principală: o fantomă (Ghost Boo) afișată pe un ecran OLED devine tristă în timp. Pentru a o menține fericită, utilizatorul trebuie să joace minigame-uri — unele dintre ele implică construirea unor circuite electronice reale pe breadboard, pe care ESP32 le validează și le grafică pe un al doilea ecran OLED dedicat minigame-urilor.
Scopul proiectului este de a oferi un sistem de recompensă concret (menținem fantoma fericită) prin construirea și înțelegerea unor circuite electronice, învățând astfel concepte de bază din electronică și fizică:
Abstractizarea generală a conceptului de „circuit minigame” ca struct `minigame_t` este implementată: fiecare minigame expune `init`, `deinit`, `run` și un `mood_reward`, toate înregistrate într-un registry cu progresie liniară.
Am pornit de la ideea de a face un personaj tip Tamagotchi care devine fericit când este încălzit (senzor de temperatură extern) și am ajuns la un sistem complet de minigame-uri de electronică.
Proiectul este util pentru că stimulează dorința de a învăța electronică și de a construi circuite corecte, într-un mod interactiv și vizual.
| # | Minigame | Descriere | GPIO-uri | Status |
|---|---|---|---|---|
| 0 | Potentiometer | Wiperul unui potențiometru; menții zona țintă random 3s | GPIO32 (ADC1 CH4) | ✓ Implementat |
| 1 | RC circuit (6 config.) | Construiești R+C pe breadboard; ESP măsoară τ prin least-squares pe ln(V) | GPIO25 out, GPIO34 ADC | ✓ Implementat |
| 2 | Voltage divider | Doi rezistori în serie; ESP validează raportul de tensiune | GPIO25 out, GPIO34 ADC | TODO |
| 3 | RC low/high-pass filter | R+C; ESP măsoară răspunsul în frecvență la PWM | GPIO25 PWM, GPIO34 ADC | TODO |
| 4 | Diode rectifier | Diodă + condensator pe semnal PWM redresat | GPIO25 PWM, GPIO34 ADC | TODO |
| 5 | Capacitor buffer | Condensatorul menține tensiunea după tăierea GPIO-ului | GPIO25 out, GPIO34 ADC | TODO |
| 6 | Transistor switch | NPN; ESP conduce baza, măsoară colectorul | GPIO25 out (bază), GPIO34 ADC (colector) | TODO |
| 7 | LM-35 temperature | Senzor temperatură extern, output direct pe ADC | GPIO35 (ADC1 CH7) | TODO |
| 8 | Deadbeet rhythm | ESP redă o secvență de LED-uri; utilizatorul o repetă pe butoane | GPIO13/12/14 out, GPIO15/4/5 in | TODO |
| 9 | Metronome | Două potențiometre (BPM + duty cycle) + buzzer pasiv | GPIO32, GPIO35 ADC; GPIO23 PWM | TODO |
Games 1–6 partajează GPIO25 și GPIO34 — circuitul de pe breadboard se schimbă între ele, nu pinii.
Modulele principale și interacțiunile dintre ele:
| Display | Diagonală | Rol | Bus I2C | SDA | SCL | Adresă |
|---|---|---|---|---|---|---|
| SH1106 | 1.3” | Ghost — permanent activ | I2C0 (I2C_NUM_0) | GPIO21 | GPIO22 | 0x3C |
| SSD1306 | 0.96” | Minigame support | I2C1 (I2C_NUM_1) | GPIO26 | GPIO27 | 0x3C |
Ambele display-uri au adresa 0x3C — menținute pe bus-uri separate pentru a evita conflictul.
| # | Minigame | Circuit | Pini |
|---|---|---|---|
| 0 | Potentiometer | Wiper pot la ADC | GPIO32 (ADC1 CH4) |
| 1 | RC circuit | R + C la GND | GPIO25 out, GPIO34 ADC |
| 2 | Voltage divider | Doi rezistori în serie | GPIO25 out, GPIO34 ADC |
| 3 | RC low/high-pass filter | R+C, măsurare răspuns frecvență | GPIO25 PWM, GPIO34 ADC |
| 4 | Diode rectifier | Diodă + cap pe PWM redresat | GPIO25 PWM, GPIO34 ADC |
| 5 | Capacitor buffer | Cap menține tensiunea după GPIO cut | GPIO25 out, GPIO34 ADC |
| 6 | Transistor switch | NPN bază drive, măsurare colector | GPIO25 out (bază), GPIO34 ADC (colector) |
| 7 | Temperature LM-35 | Output LM-35 la ADC | GPIO35 (ADC1 CH7) |
| 8 | Deadbeet rhythm | LED-uri secvență, butoane repetă | GPIO13/12/14 out (LED), GPIO15/4/5 in (butoane) |
| 9 | Metronome | Două pot-uri + buzzer pasiv | GPIO32 ADC (BPM), GPIO35 ADC (duty), GPIO23 PWM |
| Pin | Rol |
|---|---|
| GPIO33 | BTN_A — buton principal (ISR, falling edge, debounce 300ms) |
| GPIO23 | Buzzer PWM (metronome) |
| # | Componentă | Cantitate | Observații |
|---|---|---|---|
| 1 | ESP-32 Devkit V1 (DOIT) | 1 | Microcontroller principal |
| 2 | Ecran OLED SH1106 1.3”, 128×64, I2C | 1 | SDA→GPIO21, SCL→GPIO22; display fantomă |
| 3 | Ecran OLED SSD1306 0.96”, 128×64, I2C | 1 | SDA→GPIO26, SCL→GPIO27; display minigame |
| 4 | Senzor temperatură LM-35 | 1 | ADC→GPIO35 |
| 5 | Butoane tactile | 4 | 3× deadbeet rhythm + 1× BTN_A principal |
| 6 | LED-uri | 3 | Deadbeet rhythm game |
| 7 | Buzzer pasiv | 1 | Metronome minigame (PWM GPIO23) |
| 8 | Potențiometre | 2 | 1× potentiometer minigame (GPIO32), 1× metronome BPM |
| 9 | Rezistențe, condensatoare, diode, tranzistoare | asortate | Pentru circuit minigame-uri (RC, divider, filter, rectifier, switch) |
| 10 | Fire de breadboard + breadboard | — | Conectică generală |
RC circuit (GPIO25 → R → nod → C → GND, GPIO34 la nod): ✓ Realizat
TODO: Schemă electrică pentru voltage divider minigame
TODO: Schemă electrică pentru RC low/high-pass filter
TODO: Schemă electrică pentru diode rectifier
TODO: Schemă electrică pentru capacitor buffer
TODO: Schemă electrică pentru transistor switch (NPN, ESP conduce baza, măsoară colectorul)
TODO: Schemă electrică pentru LM-35 temperature sensor
TODO: Schemă electrică pentru deadbeet rhythm game (3 butoane + 3 LED-uri)
TODO: Schemă electrică pentru metronome minigame (2 potențiometre + buzzer pasiv)
RC circuit minigame — curba de descărcare: ✓ Afișată live pe SSD1306 ca osciloscop (V pe axa Y, timp pe axa X). τ măsurat suprapus cu τ țintă pe ecranul de rezultate.
TODO: Diagramă semnal pentru deadbeet rhythm game — secvența ESP vs. secvența introdusă de utilizator
Validarea se face pe hardware real. Valorile R și C pot fi verificate în prealabil cu Falstad Circuit Simulator.
Două task-uri FreeRTOS:
Abstractizare minigame (`minigame_t`):
typedef struct { const char *name; // afișat pe SH1106 „NEXT:" esp_err_t (*init)(void); // configurare GPIO/ADC void (*deinit)(void); // restaurare GPIO safe state bool (*run)(void); // loop blocant; true = pass uint8_t mood_reward; // puncte mood la PASS } minigame_t;
Registry (`minigame_registry.c`): progresie liniară; `registry_advance()` apelat indiferent de rezultat (pass sau abort).
Ghost state machine: 5 stări — NEUTRAL, SAD, HAPPY, CELEBRATING, MEASURING. Decay de mood dependent de bandă (mai rapid la mood scăzut). Animații 2-frame per stare pe SH1106.
Buton (`g_minigame_btn`): ISR pe GPIO33 (falling edge, debounce 300ms). Când un minigame este activ, apăsările sunt rutate prin `g_minigame_btn` — fiecare minigame își gestionează propria logică de stop/avans.
6 configurații modulare, toți parametrii derivați din `tau_ms`:
| Config | R | C | τ | Concept |
|---|---|---|---|---|
| RC 100ms | 1kΩ | 100µF | 100ms | Rezistență mică → descărcare rapidă |
| RC 200ms | 2kΩ | 100µF | 200ms | R dublu → τ dublu |
| RC 500ms | 10kΩ | 2×100µF serie | 500ms | C serie reduce capacitatea |
| RC 1s | 10kΩ | 100µF | 1s | Configurație de bază |
| RC 2s | 10kΩ | 2×100µF paralel | 2s | C paralel dublează capacitatea |
| RC 4s | 20kΩ (2× serie) | 2×100µF paralel | 4s | Compus — τ = R×C scalează cu ambii |
TODO: De completat după finalizarea proiectului.
TODO: Arhivă cu sursele finale, README și instrucțiuni de compilare/flash.