BONGO
CAT

ESP32 + OLED + BUZZER — 2026

ESP32 OLED 0.91" 2× BTN BUZZER
PROBAR EN WOKWI
La ideaBongo cat :B

Todo empezó con el clásico meme de Bongo Cat

presionas dos botones y el gato anima sus brazos en una pantalla OLED, sincronizado con notas musicales en un buzzer.

El proyecto combina animación por bitmaps en OLED de 128×32px, detección de botones y generación de tonos vía PWM

WhatsApp Image 2026-06-18 at 10.27.38 PM.jpeg

HardwareBILL OF MATERIALS

MCU
ESP32
Display
OLED 0.91"
Input
2× BTN
Audio
Buzzer
#ComponenteEspecificaciónCantidad
01ESP32 DevKitDual-core 240MHz · WiFi+BT · 3.3V lógica×1
02OLED SSD13060.91" · 128×32px · I2C · 3.3V×1
03Push ButtonMomentáneo · 4 pines · PCB mount×2
04Buzzer PiezoeléctricoPasivo · TMB12A05 · 5V compatible×1
05Resistencias10kΩ pull-up para botones×2
06PCB personalizadoKiCad · 2 capas · fabricado JLCPCB×1
esquematico
Voltajes

Todos los componentes necesitan voltajes compatibles. La entrada es USB 5V y el ESP32 regula internamente a 3.3V.

5V
Alimentación principal por USB (VIN)
ENTRADA → ESP32
3.3V
Lógica interna del ESP32 de señales GPIO
REGULADO INTERNO → OLED + BOTONES
3.3V
Alimentación del OLED SSD1306 vía pin VCC
BUS I2C A 3.3V — 400kHz
3.3V
Buzzer pasivo recibe señal PWM del GPIO25
ESP32 → BUZZER /div>
0–3.3
Botones con pull-up interno: HIGH en reposo, LOW al presionar
GPIO18, GPIO19 → INPUT_PULLUP
CRITICO — El ESP32 NO es tolerante a 5V en sus GPIOs. Nunca conectar señales de 5V sin divisor de voltaje. Daño permanente al chip.
PinesPINOUT COMPLETO

ESP32 → OLED
GND──▶GND
3V3──▶VCC
GPIO 21──▶SDA
GPIO 22──▶SCK
ESP32 → Botones
GND──▶GND (BTN1)
GPIO 18──▶S (BTN1)
GND──▶GND (BTN2)
GPIO 19──▶S (BTN2)
ESP32 → Buzzer
GND──▶GND (BUZ)
GPIO 25──▶+ (BUZ)
INFO RAPIDA
Protocolo OLEDI2C
Pull-up BTNInterno ESP32
Buzzer tipoPasivo PWM
LibreríaAdafruit SSD1306
PCB & 3DKICAD

El PCB fue diseñado en KiCad — 5 unidades, 2 capas, El diseño es compacto, con los botones en los extremos laterales para que sea natural tocarlos como bongos de verdad.

PCB top view

PCB TOP VIEW — KICAD

render 3D

VISTA 3D — KICAD

Diseño CADCAJA / ENCLOSURE

La caja fue diseñada para que el OLED quede visible al frente, los botones sobresalgan a los lados — cómodo para tocar con ambas manos.

CAD 3D PLA
CAD diseño
EnsamblajePASO A PASO

1
Imprimir la caja 3D, tapa superior con ventana OLED + huecos de botones, base inferior con ranura USB.
2
Soldar el PCBESP32 en su socket, conector del OLED (I2C), botones laterales, y buzzer. Verificar orientación del buzzer — el pin positivo está marcado.
3
Conectar el OLEDGND→GND · VCC→3V3 · SDA→GPIO21 · SCL→GPIO22. El display encaja en la ventana frontal de la caja con un pequeño bisel.
4
Flashear el firmwareArduino IDE o PlatformIO. Instalar librerías: Adafruit SSD1306 y Adafruit GFX. Compilar y cargar por USB.
5
Probar antes de cerrarVerificar OLED con animación, botones que responden, buzzer con notas. Monitor Serial para debug si algo falla.
6
Ensamblar en la cajaPCB en la base → OLED alineado con ventana → botones en huecos laterales → cerrar con tornillos M3 o snap fit. Done.
CodigoARDUINO / C++ — ESP32

Adafruit_SSD1306 Adafruit_GFX Wire.h ledcWriteTone()
bongo_cat.ino
// ═══════════════════════════════════════════════════
//   BONGO CAT — ESP32 + OLED 0.91" + Buzzer Pasivo
//   Arduino Framework · 2026
// ═══════════════════════════════════════════════════

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// ─── PANTALLA ───
#define SCREEN_WIDTH   128
#define SCREEN_HEIGHT   32
#define OLED_RESET     -1
#define SCREEN_ADDR    0x3C

// ─── PINES ───
#define BTN_L      18
#define BTN_R      19
#define BUZZER     25
#define BUZ_CH     0

// ─── NOTAS ───
#define NOTE_A4  440
#define NOTE_D5  587

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ─── ESTADO ───
bool lUp = false, rUp = false;
unsigned long lastHit = 0;
const int BEAT = 150;

// ─── BITMAPS DEL GATO (generados con image2cpp) ───
// 4 frames: neutral, brazo izq, brazo der, ambos
const unsigned char PROGMEM catNeutral[] = {
  0x00,0x00,0x07,0xE0,0x00,0x00,0x00,0x00,
  /* ... 248 bytes total para 64x32 bitmap ... */
};
const unsigned char PROGMEM catLeftUp[]  = { /* ... */ };
const unsigned char PROGMEM catRightUp[] = { /* ... */ };
const unsigned char PROGMEM catBothUp[]  = { /* ... */ };

// ─── SETUP ───
void setup() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDR)) {
    for(;;);  // halt si falla el OLED
  }
  display.clearDisplay();
  display.display();

  pinMode(BTN_L, INPUT_PULLUP);
  pinMode(BTN_R, INPUT_PULLUP);

  // LEDC para PWM del buzzer (ESP32 native)
  ledcSetup(BUZ_CH, 2000, 8);
  ledcAttachPin(BUZZER, BUZ_CH);

  splashScreen();
}

// ─── LOOP ───
void loop() {
  bool btnL = (digitalRead(BTN_L) == LOW);
  bool btnR = (digitalRead(BTN_R) == LOW);
  unsigned long now = millis();

  if (btnL && !lUp) { lUp = true; lastHit = now; ledcWriteTone(BUZ_CH, NOTE_A4); }
  if (btnR && !rUp) { rUp = true; lastHit = now; ledcWriteTone(BUZ_CH, NOTE_D5); }

  if (now - lastHit > BEAT) {
    lUp = rUp = false;
    ledcWriteTone(BUZ_CH, 0);
  }

  drawCat();
  delay(10);
}

// ─── RENDER ───
void drawCat() {
  display.clearDisplay();

  const unsigned char* frame = catNeutral;
  if      (lUp && rUp) frame = catBothUp;
  else if (lUp)        frame = catLeftUp;
  else if (rUp)        frame = catRightUp;

  display.drawBitmap(32, 0, frame, 64, 32, WHITE);

  if (lUp || rUp) {
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(2, 4);  display.print("♪");
    display.setCursor(108, 6); display.print("♫");
  }

  display.display();
}

void splashScreen() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(20, 8);  display.println("BONGO CAT :3");
  display.setCursor(16, 20); display.println("tap to play!");
  display.display();
  delay(2000);
}
Resultado FinalFUNCIONANDO

BONGO CAT v1.0
128×32 OLED SSD1306

PRESIONA LOS BOTONES


Estado
DONE
Simulacion.
Wokwi
Frames
4
Notas
A4 + D5
PROBAR SIMULACION EN WOKWI
Foto del ProyectoEL RESULTADO FISICO

El proyecto terminado, ensamblado y funcionando. Sube tus fotos del hardware real aquí.

foto principal

FOTO PRINCIPAL

detalle lateral PCB interior