Una versión propia creada en MediaLab_ del clásico tamagotchi. Está pensada para poder enseñar a los niños electrónica básica, sensores, respuestas y reacciones de una forma gráfica e interactiva.
La mascota es un pequeño pingüino animado que vive dentro de una pantalla OLED y que reacciona a distintas interacciones del usuario y también a las condiciones del entorno (como el CO₂).
Este proyecto se utiliza principalmente en talleres educativos de MediaLab_, donde los participantes montan el hardware y cargan el firmware en un ESP32.
Proyecto creado por:
José Escobedo Vázquez
Integrante de MediaLab_
GotchiLab es una mascota electrónica interactiva basada en un ESP32, una pantalla OLED y varios sensores.
El sistema muestra animaciones del pingüino y responde a diferentes acciones del usuario.
El ciclo de vida comienza con un huevo:
- Si hay sensor touch → nace al tocar el sensor
- Si NO hay sensor touch → nace automáticamente tras unos segundos
| Interacción | Acción |
|---|---|
| Tocar el sensor touch | El huevo se abre y nace el pingüino |
| Sin sensor touch | Nacimiento automático |
| Pulsar el botón | El pingüino come |
| Tocar el sensor touch | El pingüino recibe una caricia |
| Oscuridad | El pingüino se duerme |
| Vuelve la luz | El pingüino se despierta |
| CO₂ alto | El pingüino se pone enfermo |
| CO₂ normal | El pingüino se recupera |
| Pulsar muchas veces el botón | El pingüino explota y el juego reinicia |
| Sonidos | Expresa emociones |
El comportamiento del pingüino se basa en diferentes estados:
| Estado | Descripción |
|---|---|
| IDLE_EGG | Estado inicial, el pingüino está dentro del huevo |
| BIRTH | Animación de nacimiento |
| IDLE | Estado normal (sano) |
| IDLE_UNHEALTHY | Estado enfermo por CO₂ |
| TRANSITION_TO_UNHEALTHY | Transición a enfermo |
| TRANSITION_TO_HEALTHY | Transición a sano (animación invertida) |
| FEED | Animación de comer |
| PET | Animación de caricia |
| SLEEP | Animación de dormir |
| POP | El pingüino explota |
- El sistema inicia siempre en IDLE_EGG
- Con sensor touch → nace al tocar el sensor
- Sin sensor touch → nace automáticamente
- Después pasa a:
- IDLE (si CO₂ normal)
- IDLE_UNHEALTHY (si CO₂ alto)
- SLEEP (si está oscuro)
- Pulsar el botón activa FEED
- La animación no se interrumpe
- Al terminar vuelve al estado base (sano o enfermo)
- Tocar el sensor touch activa PET
- La animación siempre se completa
- Luego vuelve al estado base
- Oscuridad → SLEEP
- Se queda en un frame fijo mientras siga oscuro
- Al volver la luz → vuelve a IDLE o IDLE_UNHEALTHY
El sistema usa un sensor SCD30 conectado por I2C.
IDLE → TRANSITION_TO_UNHEALTHY → IDLE_UNHEALTHY
IDLE_UNHEALTHY → TRANSITION_TO_HEALTHY → IDLE
Notas:
- La transición a enfermo usa la animación
penguin_transition_unhealthy_anim - El estado enfermo usa la animación
penguin_idle_unhealthy_anim - Si el CO₂ baja, la animación de transición se reproduce al revés para volver al estado sano
- Puede comer, recibir caricias, etc. estando enfermo
- Pero volverá a estado enfermo después
Estas animaciones NO se pueden interrumpir:
- BIRTH
- FEED
- PET
- POP
- TRANSITIONS
Si el botón se pulsa muchas veces seguidas:
- el pingüino explota
- se reproduce animación POP
- se reproduce sonido
- el sistema se reinicia
Flujo:
POP → IDLE_EGG
| Componente | Cantidad |
|---|---|
| ESP32 DevKit | 1 |
| Pantalla OLED SSD1306 128x64 | 1 |
| Sensor touch | 1 |
| LDR (fotoresistencia) | 1 |
| Sensor CO₂ SCD30 | 1 |
| Resistencia 10kΩ | 1 |
| Buzzer pasivo | 1 |
| Botón | 1 |
| Protoboard | 1 |
| Cables Dupont | varios |
| Componente | Pin ESP32 |
|---|---|
| OLED SDA | GPIO 22 |
| OLED SCL | GPIO 21 |
| Botón | GPIO 33 |
| Sensor touch | GPIO 14 |
| Sensor de luz | GPIO 34 |
| Buzzer | GPIO 26 |
| SCD30 SDA | GPIO 22 |
| SCD30 SCL | GPIO 21 |
| OLED | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO 22 |
| SCL | GPIO 21 |
| SCD30 | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO 22 |
| SCL | GPIO 21 |
Comparte bus I2C con la pantalla.
| Botón | ESP32 |
|---|---|
| Pin 1 | GPIO 33 |
| Pin 2 | GND |
Configurado con INPUT_PULLUP.
| Sensor touch | ESP32 |
|---|---|
| Señal | GPIO 14 |
| VCC | 3.3V |
| GND | GND |
El sensor touch funciona como una entrada digital. Se conecta a su pin de señal, alimentación y tierra, y se utiliza tanto para iniciar el nacimiento como para detectar caricias.
Divisor de tensión:
3.3V | [LDR] | +------ GPIO 34 | [10kΩ] | GND
| Buzzer | ESP32 |
|---|---|
| + | GPIO 26 |
| - | GND |
Controlado con PWM (LEDC)
El proyecto permite activar o desactivar sensores y módulos desde código para que el sistema no falle si alguno no está conectado.
#define USE_BUTTON_SENSOR 1
#define USE_TOUCH_SENSOR 1
#define USE_LIGHT_SENSOR 1
#define USE_CO2_SENSOR 1
#define USE_BUZZER 1Si alguno está en 0, ese componente no se usa.
Comportamiento según la configuración:
- Sin botón → no podrá alimentarse
- Sin sensor touch → nacerá automáticamente y no se le podrá acariciar
- Sin sensor de luz → no dormirá
- Sin sensor de CO₂ → siempre estará sano
- Sin buzzer → no habrá sonido
Esto permite adaptar el montaje al hardware disponible sin romper el funcionamiento general del proyecto.
El sistema es robusto:
- Sin botón → no se activa la alimentación
- Sin sensor touch → nacimiento automático y sin caricias
- Sin luz → no duerme
- Sin CO₂ → siempre sano
- Sin buzzer → sin sonido
Firmware en C++ (Arduino)
Compatible con:
- PlatformIO
- Arduino IDE
Adafruit_GFX
Adafruit_SSD1306
Wire
SparkFun SCD30
- 15 frames por animación
- 128x64
- 1024 bytes/frame
- ~3 segundos
| Animación | Descripción |
|---|---|
| penguin_idle_egg | Huevo |
| penguin_birth | Nacimiento |
| penguin_idle | Pingüino sano |
| penguin_idle_unhealthy_anim | Pingüino enfermo |
| penguin_transition_unhealthy_anim | Cambio de estado sano/enfermo |
| penguin_feed | Comer |
| penguin_pet | Caricia |
| penguin_sleep | Dormir |
| penguin_pop | Explosión |
Script Python incluido:
python mp4_a_c_array_v2.py video.mp4 --base-name nombreGenera:
nombre.c
nombre.h
src/
main.cpp
config/
config.h
animations/
*.c
*.hEl proyecto permite enseñar:
- sensores
- microcontroladores
- lógica de estados
- animaciones
- interacción hardware/software
Permite:
- montar el circuito
- cargar firmware
- modificar animaciones
- añadir sensores
- ampliar comportamiento