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 face graficul 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ă.
Proiectul este finalizat cu 9 minigame-uri funcționale: potentiometer, RC circuit (6 configurații), voltage divider, diode rectifier, transistor switch, NPN amplifier, deadbeet rhythm, și metronome.
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ă.
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 | ✓ Implementat |
| 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 cosine 200Hz redresat; osciloscop live | GPIO25 DAC, GPIO34 ADC | ✓ Implementat |
| 5 | Capacitor buffer | Condensatorul menține tensiunea după tăierea GPIO-ului | GPIO25 out, GPIO34 ADC | TODO |
| 6 | Transistor switch | NPN în saturație (1kΩ bază); ESP conduce baza, măsoară Vc la colector | GPIO25 out (bază), GPIO34 ADC (colector) | ✓ Implementat |
| 6b | NPN Amplifier | NPN în regim activ (1MΩ bază); ESP măsoară β real (Ib=2.6µA fix) | GPIO25 out (bază), GPIO34 ADC (colector) | ✓ Implementat |
| 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 colorate | GPIO13/12/14 out (LED), GPIO19/17/16 in (R/G/B) | ✓ Implementat |
| 9 | Metronome | Două potențiometre (BPM + duty cycle) + buzzer pasiv; ține 3s pentru pass | GPIO32, GPIO35 ADC; GPIO23 PWM | ✓ Implementat |
Games 1–6b 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) | GPIO18 | GPIO5 | 0x3C |
| SSD1306 | 0.96” | Minigame support | I2C1 (I2C_NUM_1) | GPIO4 | GPIO15 | 0x3C |
Ambele display-uri au adresa 0x3C — menținute pe bus-uri separate pentru a evita conflictul. Ambele sunt cablate pe Side 1 al DevKit-ului pentru cablaj curat.
| # | 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 semnal cosine redresat | GPIO25 DAC, GPIO34 ADC |
| 5 | Capacitor buffer | Cap menține tensiunea după GPIO cut | GPIO25 out, GPIO34 ADC |
| 6 | Transistor switch | NPN saturație: 1kΩ bază, LED pe colector | GPIO25 out (bază 1kΩ), GPIO34 ADC (colector) |
| 6b | NPN Amplifier | NPN activ: 1MΩ bază, 1kΩ colector, β real | GPIO25 out (bază 1MΩ), GPIO34 ADC (colector) |
| 7 | Temperature LM-35 | Output LM-35 la ADC | GPIO35 (ADC1 CH7) |
| 8 | Deadbeet rhythm | LED-uri secvență, butoane colorate repetă | GPIO13/12/14 out (R/G/B LED), GPIO19/17/16 in (R/G/B buton) |
| 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→GPIO18, SCL→GPIO5; display fantomă |
| 3 | Ecran OLED SSD1306 0.96”, 128×64, I2C | 1 | SDA→GPIO4, SCL→GPIO15; display minigame |
| 4 | Senzor temperatură LM-35 | 1 | ADC→GPIO35 |
| 5 | Butoane tactile + set butoane colorate SYB-120 | 4+ | 3× deadbeet rhythm (R/G/B) + 1× BTN_A principal |
| 6 | LED-uri RGB | 3 | Deadbeet rhythm game (R/G/B) |
| 7 | Buzzer pasiv | 1 | Metronome minigame (PWM GPIO23) |
| 8 | Potențiometre | 2+ | 1× potentiometer minigame (GPIO32), 1× metronome duty (GPIO35); potențiometre colorate SYB-120 |
| 9 | Rezistențe, condensatoare, diode | asortate | Pentru circuit minigame-uri (RC, divider, filter, rectifier) |
| 10 | Tranzistoare NPN 2N2222 | 2+ | Transistor switch minigame (1kΩ bază) + NPN amplifier (1MΩ bază) |
| 11 | Kit breadboard SYB-120 (Optimus Digital) | 1 | 4 breadboard-uri, fire, butoane colorate, potențiometre |
| 12 | Fire de breadboard | — | Conectică generală |
Voltage divider, RC circuit diode rectifier, transistor switch, NPN amplifier, deadbeet rhythm, metronome: Vezi caietul cu ecuațiile și schemele pentru referință.
TODO: Schemă electrică pentru RC low/high-pass filter
TODO: Schemă electrică pentru capacitor buffer
TODO: Schemă electrică pentru LM-35 temperature sensor
Vezi caietul cu ecuațiile și schemele pentru referință.
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 |
Proiectul a atins obiectivul principal: 9 minigame-uri funcționale, fiecare cerând utilizatorului să construiască un circuit real pe breadboard și să îl valideze cu ESP32.
Abstractizarea `minigame_t` s-a dovedit robustă — fiecare joc nou a necesitat modificări în exact 3 fișiere (minigame nou, `minigame_registry.c`, `minigame_rewards.h`), fără a atinge codul existent.
Cea mai complexă măsurătoare: RC τ prin least-squares pe ln(V) cu timestamps reale, toleranță ±35% pentru componente reale. Cea mai vizuală: diode rectifier cu osciloscop live pe SSD1306 — 128 sample-uri la 200Hz, 2 cicluri complete pe ecran.
GPIO25 și GPIO34 sunt partajate de 7 jocuri (RC, voltage divider, rectifier, transistor switch, NPN amplifier) — breadboard-ul se schimbă între minigame-uri, pinii nu. Aceasta a simplificat semnificativ cablajul permanent.
Remaparea display-urilor pe Side 1 al DevKit-ului (SSD1306→GPIO4/15, SH1106→GPIO18/5) a eliminat firele lungi care traversau breadboard-ul.
Rămân de implementat: RC filter, capacitor buffer și LM-35 — fiecare necesită aproximativ aceeași structură ca jocurile existente.
TODO: Arhivă cu sursele finale, README și instrucțiuni de compilare/flash.