This is an old revision of the document!


Tamagotchi Circuits

Introducere

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ă:

  1. Voltage divider
  2. RC circuit — utilizatorul primește un τ țintă, fantoma grafică curba de descărcare pe osciloscop live
  3. RC high-pass / low-pass filter — fantoma devine fericită dacă filtrul funcționează corect
  4. Diode half-wave rectifier
  5. Capacitor as power buffer — ESP taie GPIO-ul, ADC-ul măsoară cât timp condensatorul menține tensiunea
  6. Transistor switch — ESP conduce baza, măsoară colectorul

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.

Descriere Generală

Minigame-uri

# 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.

Schema bloc

Modulele principale și interacțiunile dintre ele:

  • ESP-32 Devkit V1 — nucleul sistemului; orchestrează toate minigame-urile, conduce ambele OLED-uri și perifericele
  • OLED SH1106 1.3” — afișează fantoma permanent și starea ei (fericită / tristă / măsurând / celebrând)
  • OLED SSD1306 0.96” — display dedicat minigame-urilor: instrucțiuni, bare de progres, osciloscop live
  • Buzzer pasiv (PWM) — folosit în metronome minigame
  • LED-uri — folosite în deadbeet rhythm game
  • Butoane tactile — input pentru deadbeet rhythm game + butonul principal BTN_A (GPIO33)
  • ADC GPIO34 — măsurare circuite RC, voltage divider, filter, etc.
  • ADC GPIO35 — senzor temperatură LM-35
  • ADC GPIO32 — potențiometru minigame / BPM metronome

Hardware Design

Pinout

Display-uri

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.

Pini minigame-uri

# 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

Pini ficși

Pin Rol
GPIO33 BTN_A — buton principal (ISR, falling edge, debounce 300ms)
GPIO23 Buzzer PWM (metronome)

Listă de piese

# 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ă

Scheme electrice

RC circuit (GPIO25 → R → nod → C → GND, GPIO34 la nod): ✓ Realizat

Schema RC circuit (PDF)

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)

Diagrame de semnal

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

Rezultatele simulării

Validarea se face pe hardware real. Valorile R și C pot fi verificate în prealabil cu Falstad Circuit Simulator.

Software Design

Mediu de dezvoltare

  • PlatformIO + ESP-IDF v5.x (framework-espidf)
  • Toolchain: xtensa-esp-elf
  • Librării third-party: niciuna — drivere custom pentru SH1106 și SSD1306, ADC oneshot (ESP-IDF built-in)

Arhitectură

Două task-uri FreeRTOS:

  • `ghost_task` — 8KB stack, rulează permanent la 50ms tick; gestionează animațiile fantomei, decayul de mood și spawn-ul minigame_task
  • `minigame_task` — 4KB stack, spawnat on-demand la apăsarea butonului; distrus la finalul minigame-ului

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.

RC Minigame — detalii algoritm

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
  • `charge_ms = 6 × τ` (încărcare la 99.75% din Vs)
  • `sample_interval_ms = 5τ / 128` (128 sample-uri acoperă 5τ)
  • τ ≥ 500ms → osciloscop live (flush per sample); τ < 500ms → batch (toate sample-urile, un singur flush)
  • τ calculat prin least-squares pe ln(V(t)) cu timestamps reale (`esp_timer_get_time()`)
  • Toleranță ±35% pentru a acomoda toleranța componentelor electronice (condensatoare ±20%)

TODO Software

  • Voltage divider minigame
  • RC low/high-pass filter minigame
  • Diode rectifier minigame
  • Capacitor buffer minigame
  • Transistor switch minigame
  • LM-35 temperature minigame
  • Deadbeet rhythm game
  • Metronome minigame

Rezultate Obținute

  • Fantomă animată pe SH1106 cu 5 stări și decay de mood funcțional
  • Sistem de abstractizare minigame complet (minigame_t, registry, două task-uri FreeRTOS)
  • Potentiometer minigame funcțional: target random, progress bar, hold 3s
  • RC circuit minigame funcțional: 6 configurații, osciloscop live pe SSD1306, τ măsurat prin least-squares

Concluzii

TODO: De completat după finalizarea proiectului.

Download

TODO: Arhivă cu sursele finale, README și instrucțiuni de compilare/flash.

Jurnal

  • 11 aprilie — prima comandă: breadboard, SSD1306 (OLED 0.96” I2C), LM-35
  • 6 mai — a doua comandă: ESP-32, SH1106 (OLED 1.3” I2C)
  • 10 mai — primul demo funcțional: fantoma animată pe OLED, circuit RC pe breadboard, grafic al curbei de descărcare afișat pe ecran
  • 16 mai — implementat sistem complet de abstractizare minigame (minigame_t, registry, două task-uri FreeRTOS); potentiometer minigame funcțional pe SSD1306
  • 16 mai — RC circuit minigame: osciloscop live pe SSD1306, τ prin least-squares cu timestamps reale, 6 configurații modulare (τ = 100ms … 4s, toți parametrii derivați din tau_ms)

Bibliografie/Resurse

pm/prj2026/theodor_ioan.buliga/ioan.sabou.1779086179.txt.gz · Last modified: 2026/05/18 09:36 by ioan.sabou
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