P2 PDS video portero con esp32
1. MÓDULO PUERTA (ESP32-CAM) CON AUDIO I2S
┌─────────────────────────────────────────────────────────────┐ │ ESP32-CAM (AI-THINKER) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ ╔═════════════════════════════════════════════╗ │ │ │ │ ║ CÁMARA OV2640 ║ │ │ │ │ ╚═════════════════════════════════════════════╝ │ │ │ │ │ │ │ │ CONECTORES LATERALES: │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ GND 5V UOR UOT IO14 IO12 IO13 │ │ │ │ │ │ ○ ○ ○ ○ ○ ○ ○ │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ PARTE TRASERA: │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ IO16 IO4 IO2 IO14 GND 3.3V IO15 │ │ │ │ │ │ ○ ○ ○ ○ ○ ○ ○ │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ╔══════════════════════════════════════════════════════════════╗ ║ CONEXIONES DETALLADAS ║ ╚══════════════════════════════════════════════════════════════╝ ┌─────────────────────────────────────────────────────────────────┐ │ MICRÓFONO DIGITAL INMP441 (I2S) │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ INMP441 │ │ ESP32-CAM │ │ │ │ │ │ │ │ │ │ VDD ───────────┼──────────┤ 3.3V │ │ │ │ GND ───────────┼──────────┤ GND │ │ │ │ SCK ───────────┼──────────┤ GPIO14 (I2S_SCK) │ │ │ │ WS ───────────┼──────────┤ GPIO15 (I2S_WS) │ │ │ │ SD ───────────┼──────────┤ GPIO13 (I2S_SD) │ │ │ │ L/R ───────────┼──────────┤ GND (Canal izquierdo) │ │ │ └─────────────────────┘ └─────────────────────────┘ │ │ │ │ NOTA: Conectar L/R a GND para canal izquierdo │ │ o a 3.3V para canal derecho │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ AMPLIFICADOR MAX98357 (I2S - Para bocina en puerta) │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ MAX98357 │ │ ESP32-CAM │ │ │ │ │ │ │ │ │ │ VIN ───────────┼──────────┤ 5V │ │ │ │ GND ───────────┼──────────┤ GND │ │ │ │ BCLK ───────────┼──────────┤ GPIO12 (I2S_BCK) │ │ │ │ LRC ───────────┼──────────┤ GPIO14 (I2S_LRC) │ │ │ │ DIN ───────────┼──────────┤ GPIO13 (I2S_DOUT) │ │ │ │ GAIN ───────────┼──────────┤ GND (Ganancia 15dB) │ │ │ └──────────┬──────────┘ └─────────────────────────┘ │ │ │ │ │ ┌────┴─────┐ │ │ │ Bocina │ │ │ │ 4Ω - 3W │ │ │ │ [+] [-]│ │ │ └────┬─────┘ │ │ │ │ │ ┌────┴─────┐ │ │ │ GND │ │ │ └──────────┘ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ BOTONES Y LED │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ Botón TIMBRE │ │ ESP32-CAM │ │ │ │ ┌─────────┐ │ │ │ │ │ │ │ │ │ │ │ GPIO2 ───────────────┼───┘ │ │ └───┼─────┘ │ │ │ │ │ │ │ │ 3.3V ──────┐ │ │ │ ║ 10kΩ ║ │ │ │ │ │ │ │ │ │ │ GND ──────┼─────────┘ │ │ GND │ │ │ │ │ │ │ │ │ Resistencia pull-down │ │ └─────────────┴───────┘ └─────────────────────────┘ │ │ │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ Botón INTERCOM │ │ ESP32-CAM │ │ │ │ ┌─────────┐ │ │ │ │ │ │ │ │ │ │ │ GPIO4 ───────────────┼───┘ │ │ └───┼─────┘ │ │ │ │ │ │ │ │ 3.3V ──────┐ │ │ │ ║ 10kΩ ║ │ │ │ │ │ │ │ │ │ │ GND ──────┼─────────┘ │ │ GND │ │ │ │ │ │ │ │ │ Resistencia pull-down │ │ └─────────────┴───────┘ └─────────────────────────┘ │ │ │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ LED INDICADOR │ │ ESP32-CAM │ │ │ │ ┌────┐ │ │ │ │ │ │ │ LED│───[220Ω]───┼──────────┤ GPIO16 │ │ │ │ └────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ GND │ │ GND │ │ │ └─────────────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘
2. MÓDULO CASA (ESP32) CON PANTALLA TFT Y AUDIO I2S
┌─────────────────────────────────────────────────────────────────┐ │ ESP32 (NodeMCU-32S) │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │ │ │ │ │EN │ │VP │ │VN │ │D34│ │D35│ │D32│ │D33│ │D25│ │ │ │ │ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ │ │ │ │ │ │ │ │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │ │ │ │ │D26│ │D27│ │D14│ │D12│ │D13│ │D9 │ │D10│ │D11│ │ │ │ │ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ │ │ │ │ │ │ │ │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │ │ │ │ │5V │ │GND│ │D23│ │D22│ │TX │ │RX │ │D21│ │D19│ │ │ │ │ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ╔════════════════════════════════════════════════════════════════╗ ║ CONEXIONES DETALLADAS CASA ║ ╚════════════════════════════════════════════════════════════════╝ ┌─────────────────────────────────────────────────────────────────┐ │ PANTALLA TFT 2.4" IL9341 (SPI) │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ TFT IL9341 │ │ ESP32 │ │ │ │ │ │ │ │ │ │ VCC ───────────┼──────────┤ 3.3V │ │ │ │ GND ───────────┼──────────┤ GND │ │ │ │ CS ───────────┼──────────┤ GPIO15 │ │ │ │ RESET ───────────┼──────────┤ GPIO4 │ │ │ │ DC ───────────┼──────────┤ GPIO2 │ │ │ │ MOSI ───────────┼──────────┤ GPIO23 │ │ │ │ SCK ───────────┼──────────┤ GPIO18 │ │ │ │ LED ───────────┼──────────┤ 3.3V (Retroiluminación) │ │ │ │ MISO ───────────┼──────────┤ GPIO19 (Opcional) │ │ │ └─────────────────────┘ └─────────────────────────┘ │ │ │ │ ┌───────────────────────────────────────────────────────────┐ │ │ │ IMPORTANTE: Conectar LED a 3.3V con resistencia 220Ω │ │ │ │ para controlar brillo, o directamente a 3.3V para máximo │ │ │ │ brillo fijo │ │ │ └───────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ MICRÓFONO DIGITAL INMP441 (I2S - Para hablar desde casa) │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ INMP441 │ │ ESP32 │ │ │ │ │ │ │ │ │ │ VDD ───────────┼──────────┤ 3.3V │ │ │ │ GND ───────────┼──────────┤ GND │ │ │ │ SCK ───────────┼──────────┤ GPIO25 (I2S_SCK) │ │ │ │ WS ───────────┼──────────┤ GPIO32 (I2S_WS) │ │ │ │ SD ───────────┼──────────┤ GPIO33 (I2S_SD) │ │ │ │ L/R ───────────┼──────────┤ GND (Canal izquierdo) │ │ │ └─────────────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ AMPLIFICADOR MAX98357 (I2S - Para bocina en casa) │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ MAX98357 │ │ ESP32 │ │ │ │ │ │ │ │ │ │ VIN ───────────┼──────────┤ 5V │ │ │ │ GND ───────────┼──────────┤ GND │ │ │ │ BCLK ───────────┼──────────┤ GPIO26 (I2S_BCK) │ │ │ │ LRC ───────────┼──────────┤ GPIO27 (I2S_LRC) │ │ │ │ DIN ───────────┼──────────┤ GPIO14 (I2S_DOUT) │ │ │ │ GAIN ───────────┼──────────┤ GND (Ganancia 15dB) │ │ │ └──────────┬──────────┘ └─────────────────────────┘ │ │ │ │ │ ┌────┴─────┐ │ │ │ Bocina │ │ │ │ 4Ω - 3W │ │ │ │ [+] [-]│ │ │ └────┬─────┘ │ │ │ │ │ ┌────┴─────┐ │ │ │ GND │ │ │ └──────────┘ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ MÓDULO RELÉ (Control cerradura eléctrica 12V) │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ RELÉ 1 CANAL │ │ ESP32 │ │ │ │ │ │ │ │ │ │ VCC ───────────┼──────────┤ 5V │ │ │ │ GND ───────────┼──────────┤ GND │ │ │ │ IN ───────────┼──────────┤ GPIO12 │ │ │ └──────────┬──────────┘ └─────────────────────────┘ │ │ │ │ │ ┌────┴───────────────────────────────────────────────┐ │ │ │ CONEXIONES CERRAJURA ELÉCTRICA │ │ │ │ ┌─────────┐ ┌─────────────────────┐ │ │ │ │ │ RELÉ │ │ Fuente 12V │ │ │ │ │ │ COM ──┼──────┤ (+) │ │ │ │ │ │ NO ──┼──────┤ Cerradura (+) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ GND ───────────────┼───┐ │ │ │ │ └─────────┘ │ Fuente (-) │ │ │ │ │ │ └─────────────────────┘ │ │ │ │ │ │ │ │ │ │ Cerradura 12V │ │ │ │ │ ┌──────────────────┐ │ │ │ │ │ │ (+) ────────────┼────────────┘ │ │ │ │ │ (-) ────────────┼───────────────────┘ │ │ │ └──────────────────┘ │ │ └─────────────────────────────────────────────────────────┘│ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ BOTÓN Y LED │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ Botón ABRIR │ │ ESP32 │ │ │ │ ┌─────────┐ │ │ │ │ │ │ │ │ │ │ │ GPIO13 ──────────────┼───┘ │ │ └───┼─────┘ │ │ │ │ │ │ │ │ 3.3V ──────┐ │ │ │ ║ 10kΩ ║ │ │ │ │ │ │ │ │ │ │ GND ──────┼─────────┘ │ │ GND │ │ │ │ │ │ │ │ │ Resistencia pull-down │ │ └─────────────┴───────┘ └─────────────────────────┘ │ │ │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ LED INDICADOR │ │ ESP32 │ │ │ │ ┌────┐ │ │ │ │ │ │ │ LED│───[220Ω]───┼──────────┤ GPIO19 │ │ │ │ └────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ GND │ │ GND │ │ │ └─────────────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ BUZZER (Opcional) │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ BUZZER │ │ ESP32 │ │ │ │ ┌─────────┐ │ │ │ │ │ │ │ (+) ────────┼──────────┤ GPIO5 │ │ │ │ │ (-) ────────┼──────────┤ GND │ │ │ │ └─────────┘ │ │ │ │ │ └─────────────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘
3. DIAGRAMA DE ALIMENTACIÓN
╔════════════════════════════════════════════════════════════════╗ ║ SISTEMA DE ALIMENTACIÓN ║ ╚════════════════════════════════════════════════════════════════╝ ┌─────────────────────────────────────────────────────────────────┐ │ MÓDULO PUERTA │ │ │ │ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Fuente 5V │──────┬────┤ ESP32-CAM │ │ │ │ 3A │ │ │ (Consumo ~500mA) │ │ │ │ Impermeable │ │ └─────────────────────┘ │ │ └─────────────┘ │ │ │ │ ├────┤ MAX98357 (50mA) │ │ │ │ │ INMP441 (1mA) │ │ │ │ │ LED (20mA) │ │ │ │ └───────────────────────────────────┘│ │ │ │ │ │ └──────────────┴─────── 5V común │ │ │ │ IMPORTANTE: Usar fuente impermeable IP67 para exterior │ │ Cables de al menos 0.5mm² │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ MÓDULO CASA │ │ │ │ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Fuente 5V │──────┬────┤ ESP32 │ │ │ │ 3A │ │ │ (Consumo ~300mA) │ │ │ └─────────────┘ │ └─────────────────────┘ │ │ │ │ │ │ │ ├────┤ MAX98357 (50mA) │ │ │ │ │ INMP441 (1mA) │ │ │ │ │ TFT (80mA) │ │ │ │ │ LED (20mA) │ │ │ │ │ Relé (70mA) │ │ │ │ └───────────────────────────────────┘│ │ │ │ │ │ └──────────────┴─────── 5V común │ │ │ │ ┌─────────────┐ │ │ │ Fuente 12V │────┬───── Relé (COM) │ │ │ 2A │ │ │ │ └─────────────┘ └───── Cerradura eléctrica (1.5A) │ │ │ │ IMPORTANTE: No compartir GND entre 5V y 12V si no es necesario │ │ Usar diodo 1N4007 en paralelo a la cerradura │ │ para proteger el relé │ └─────────────────────────────────────────────────────────────────┘
4. DIAGRAMA DE PROTECCIÓN PARA CERRAJURA
┌─────────────────────────────────────────────────────────────────┐ │ PROTECCIÓN DEL RELÉ │ │ │ │ ┌───┤├───┐ │ │ │ 1N4007 │ │ │ └───┬───┬─┘ │ │ │ │ │ │ ┌─────┴───┴─────┐ │ │ │ Cerradura │ │ │ │ Eléctrica │ │ │ │ 12V │ │ │ └───────┬───────┘ │ │ │ │ │ ┌──────┴───────┐ │ │ │ GND 12V │ │ │ └──────────────┘ │ │ │ │ ┌─────┐ ┌───────────────────────────────────────┐ │ │ │Relé │ │ Explicación: │ │ │ │ COM ┼──────┤ El diodo en paralelo elimina el pico │ │ │ │ NO ┼──────┤ de tensión inversa cuando se desconecta│ │ │ └─────┘ │ la cerradura, protegiendo el relé │ │ │ └───────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘
5. TABLA RESUMEN DE CONEXIONES
MÓDULO PUERTA (ESP32-CAM)
| Componente | Pin ESP32-CAM | Cable color sugerido |
|---|---|---|
| INMP441 VDD | 3.3V | Rojo |
| INMP441 GND | GND | Negro |
| INMP441 SCK | GPIO14 | Amarillo |
| INMP441 WS | GPIO15 | Azul |
| INMP441 SD | GPIO13 | Verde |
| INMP441 L/R | GND | Negro |
| MAX98357 VIN | 5V | Rojo grueso |
| MAX98357 GND | GND | Negro |
| MAX98357 BCLK | GPIO12 | Naranja |
| MAX98357 LRC | GPIO14 | Amarillo |
| MAX98357 DIN | GPIO13 | Verde |
| MAX98357 GAIN | GND | Negro |
| Bocina + | MAX98357 OUT+ | Blanco |
| Bocina – | MAX98357 OUT- | Negro |
| Botón Timbre | GPIO2 | Marrón |
| Botón Intercom | GPIO4 | Gris |
| LED Indicador | GPIO16 | Rosa |
MÓDULO CASA (ESP32)
| Componente | Pin ESP32 | Cable color sugerido |
|---|---|---|
| TFT VCC | 3.3V | Rojo |
| TFT GND | GND | Negro |
| TFT CS | GPIO15 | Naranja |
| TFT RESET | GPIO4 | Amarillo |
| TFT DC | GPIO2 | Verde |
| TFT MOSI | GPIO23 | Azul |
| TFT SCK | GPIO18 | Violeta |
| TFT LED | 3.3V (220Ω) | Rosa |
| INMP441 VDD | 3.3V | Rojo |
| INMP441 GND | GND | Negro |
| INMP441 SCK | GPIO25 | Amarillo |
| INMP441 WS | GPIO32 | Azul |
| INMP441 SD | GPIO33 | Verde |
| MAX98357 VIN | 5V | Rojo grueso |
| MAX98357 GND | GND | Negro |
| MAX98357 BCLK | GPIO26 | Naranja |
| MAX98357 LRC | GPIO27 | Amarillo |
| MAX98357 DIN | GPIO14 | Verde |
| Relé VCC | 5V | Rojo |
| Relé GND | GND | Negro |
| Relé IN | GPIO12 | Blanco |
| Botón Abrir | GPIO13 | Marrón |
| LED Indicador | GPIO19 | Rosa |
| Buzzer | GPIO5 (opc) | Gris |
6. DIAGRAMA FÍSICO DE INSTALACIÓN
┌─────────────────────────────────────────────────────────────────┐ │ INSTALACIÓN FÍSICA │ │ │ │ EXTERIOR INTERIOR │ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ │ │ │ │ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ │ │ │ CÁMARA │ │ │ │ TFT 2.4" │ │ │ │ │ │ OV2640 │ │ │ │ PANTALLA │ │ │ │ │ └───────────────┘ │ │ └───────────────┘ │ │ │ │ │ │ │ │ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ │ │ │ MICRÓFONO │ │ │ │ MICRÓFONO │ │ │ │ │ │ INMP441 │ │ │ │ INMP441 │ │ │ │ │ └───────────────┘ │ │ └───────────────┘ │ │ │ │ │ │ │ │ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ │ │ │ BOCINA │ │ │ │ BOCINA │ │ │ │ │ │ 3W │ │ │ │ 3W │ │ │ │ │ └───────────────┘ │ │ └───────────────┘ │ │ │ │ │ │ │ │ │ │ ┌───┐ ┌───┐ │ │ ┌───────────────┐ │ │ │ │ │TIM│ │INT│ │ │ │ BOTÓN │ │ │ │ │ │BRE│ │COM│ │ │ │ ABRIR │ │ │ │ │ └───┘ └───┘ │ │ └───────────────┘ │ │ │ └─────────────────────┘ └──────────┬──────────┘ │ │ │ │ │ │ │ │ │ │ │ ESP-NOW (Sin WiFi) │ │ │ │◄──────────────────────────────►│ │ │ │ Alcance: ~100m │ │ │ │ │ │ │ │ │ │ │ ┌─────────────────────┐ ┌──────────┴──────────┐ │ │ │ CAJA ESTANCA │ │ CAJA INTERIOR │ │ │ │ IP65 │ │ ESP32 + RELÉ │ │ │ │ ESP32-CAM │ │ │ │ │ └─────────────────────┘ └─────────────────────┘ │ │ │ │ │ ┌──────┴──────┐ │ │ │ CERRADURA │ │ │ │ ELÉCTRICA │ │ │ │ 12V │ │ │ └─────────────┘ │ └─────────────────────────────────────────────────────────────────┘
LISTA DE VERIFICACIÓN FINAL
✅ Módulo Puerta:
-
ESP32-CAM fijado en caja estanca
-
INMP441 conectado (SCK=14, WS=15, SD=13)
-
MAX98357 conectado (BCK=12, LRC=14, DIN=13)
-
Bocina conectada al amplificador
-
Botón timbre (GPIO2) con pull-down
-
Botón intercom (GPIO4) con pull-down
-
LED indicador (GPIO16) con resistencia
-
Fuente 5V 3A impermeable
-
Agujeros sellados con silicona
✅ Módulo Casa:
-
TFT 2.4″ conectado por SPI
-
INMP441 conectado (SCK=25, WS=32, SD=33)
-
MAX98357 conectado (BCK=26, LRC=27, DIN=14)
-
Bocina conectada
-
Relé conectado (GPIO12)
-
Cerradura 12V con diodo de protección
-
Botón abrir (GPIO13) con pull-down
-
LED indicador (GPIO19)
-
Fuente 5V 3A
-
Fuente 12V 2A
Módulo Puerta (ESP32-CAM) con Audio I2S
// VideoPortero_ESPNow_Puerta_I2S.ino #include "esp_camera.h" #include <esp_now.h> #include <WiFi.h> #include <driver/i2s.h> // Pines I2S para INMP441 (Micrófono) #define I2S_WS 15 #define I2S_SD 13 #define I2S_SCK 14 // Pines I2S para MAX98357 (Bocina - opcional en puerta) #define I2S_BCK 12 #define I2S_LRC 11 #define I2S_DOUT 10 // Botones y LED #define PIN_BOTON1 2 // Timbre (GPIO2 en ESP32-CAM) #define PIN_BOTON2 4 // Intercom (GPIO4) #define PIN_LED 16 // LED indicador // MAC del módulo casa uint8_t macCasa[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}; // Estructuras de datos typedef struct { uint8_t tipo; // 0:timbre, 1:audio, 2:video, 3:comando uint16_t len; // Longitud de datos uint8_t data[240]; // Datos (max 240 bytes por ESP-NOW) } paqueteESPNow; typedef struct { uint8_t comando; // 0:abrir, 1:hablar, 2:colgar uint8_t parametro; } comandoCasa; paqueteESPNow paqueteEnviar; paqueteESPNow paqueteRecibir; comandoCasa cmdRecibido; // Buffer de audio int16_t audioBuffer[512]; bool intercomActivo = false; // Callback datos recibidos void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) { memcpy(&paqueteRecibir, incomingData, sizeof(paqueteESPNow)); if(paqueteRecibir.tipo == 3) { // Comando memcpy(&cmdRecibido, paqueteRecibir.data, sizeof(comandoCasa)); switch(cmdRecibido.comando) { case 0: // Abrir puerta (relé en casa, no en puerta) Serial.println("Comando abrir puerta recibido"); digitalWrite(PIN_LED, HIGH); delay(500); digitalWrite(PIN_LED, LOW); break; case 1: // Activar intercom (alguien habla desde casa) intercomActivo = true; digitalWrite(PIN_LED, HIGH); break; case 2: // Desactivar intercom intercomActivo = false; digitalWrite(PIN_LED, LOW); break; } } if(paqueteRecibir.tipo == 1 && intercomActivo) { // Audio desde casa // Reproducir audio por bocina de puerta size_t bytes_written; i2s_write(I2S_NUM_1, paqueteRecibir.data, paqueteRecibir.len, &bytes_written, portMAX_DELAY); } } void setup() { Serial.begin(115200); // Configurar pines pinMode(PIN_BOTON1, INPUT_PULLUP); pinMode(PIN_BOTON2, INPUT_PULLUP); pinMode(PIN_LED, OUTPUT); // Inicializar I2S para micrófono INMP441 i2s_config_t i2s_mic_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX), .sample_rate = 16000, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, .communication_format = I2S_COMM_FORMAT_I2S, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, .dma_buf_count = 8, .dma_buf_len = 512 }; i2s_pin_config_t i2s_mic_pins = { .bck_io_num = I2S_SCK, .ws_io_num = I2S_WS, .data_out_num = I2S_PIN_NO_CHANGE, .data_in_num = I2S_SD }; i2s_driver_install(I2S_NUM_0, &i2s_mic_config, 0, NULL); i2s_set_pin(I2S_NUM_0, &i2s_mic_pins); // Inicializar I2S para bocina MAX98357 (opcional) i2s_config_t i2s_speaker_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), .sample_rate = 16000, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, .communication_format = I2S_COMM_FORMAT_I2S, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, .dma_buf_count = 8, .dma_buf_len = 512 }; i2s_pin_config_t i2s_speaker_pins = { .bck_io_num = I2S_BCK, .ws_io_num = I2S_LRC, .data_out_num = I2S_DOUT, .data_in_num = I2S_PIN_NO_CHANGE }; i2s_driver_install(I2S_NUM_1, &i2s_speaker_config, 0, NULL); i2s_set_pin(I2S_NUM_1, &i2s_speaker_pins); // Inicializar cámara (configuración igual que antes) camera_config_t config; // ... (misma configuración de cámara) // Inicializar ESP-NOW WiFi.mode(WIFI_STA); esp_now_init(); esp_now_register_recv_cb(OnDataRecv); esp_now_peer_info_t peerInfo; memcpy(peerInfo.peer_addr, macCasa, 6); peerInfo.channel = 0; peerInfo.encrypt = false; esp_now_add_peer(&peerInfo); Serial.println("Módulo puerta listo"); } void loop() { // Botón timbre if(digitalRead(PIN_BOTON1) == LOW) { paqueteEnviar.tipo = 0; // Timbre paqueteEnviar.len = 1; paqueteEnviar.data[0] = 1; esp_now_send(macCasa, (uint8_t*)&paqueteEnviar, sizeof(paqueteESPNow)); digitalWrite(PIN_LED, HIGH); delay(200); digitalWrite(PIN_LED, LOW); delay(300); } // Botón intercom if(digitalRead(PIN_BOTON2) == LOW) { intercomActivo = !intercomActivo; paqueteEnviar.tipo = 3; // Comando comandoCasa cmd = {intercomActivo ? 1 : 2, 0}; memcpy(paqueteEnviar.data, &cmd, sizeof(comandoCasa)); paqueteEnviar.len = sizeof(comandoCasa); esp_now_send(macCasa, (uint8_t*)&paqueteEnviar, sizeof(paqueteESPNow)); digitalWrite(PIN_LED, intercomActivo ? HIGH : LOW); delay(300); } // Enviar audio si intercom activo if(intercomActivo) { size_t bytes_read; i2s_read(I2S_NUM_0, audioBuffer, sizeof(audioBuffer), &bytes_read, portMAX_DELAY); // Enviar en chunks int samples = bytes_read / 2; // 16 bits = 2 bytes for(int i = 0; i < samples; i += 120) { int chunk = min(120, samples - i); paqueteEnviar.tipo = 1; // Audio paqueteEnviar.len = chunk * 2; memcpy(paqueteEnviar.data, &audioBuffer[i], paqueteEnviar.len); esp_now_send(macCasa, (uint8_t*)&paqueteEnviar, sizeof(paqueteESPNow)); delay(5); } } delay(10); }
Módulo Casa (ESP32) con Audio I2S y Pantalla TFT
// VideoPortero_Casa_I2S_TFT.ino #include <esp_now.h> #include <WiFi.h> #include <driver/i2s.h> #include <Adafruit_GFX.h> #include <Adafruit_ILI9341.h> // Pines para pantalla TFT 2.4" #define TFT_CS 15 #define TFT_RST 4 #define TFT_DC 2 #define TFT_MOSI 23 #define TFT_MISO 19 #define TFT_SCLK 18 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); // Pines I2S para INMP441 (Micrófono) #define I2S_MIC_WS 32 #define I2S_MIC_SD 33 #define I2S_MIC_SCK 25 // Pines I2S para MAX98357 (Bocina) #define I2S_BCK 26 #define I2S_LRC 27 #define I2S_DOUT 14 // Botón y relé #define PIN_BOTON_ABRIR 13 #define PIN_RELE 12 // MAC del módulo puerta uint8_t macPuerta[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}; // Buffer para reconstruir video #define VIDEO_WIDTH 320 #define VIDEO_HEIGHT 240 uint8_t videoBuffer[VIDEO_WIDTH * VIDEO_HEIGHT * 2]; // RGB565 int videoOffset = 0; // Estructuras typedef struct { uint8_t tipo; // 0:timbre, 1:audio, 2:video, 3:comando uint16_t len; uint8_t data[240]; } paqueteESPNow; paqueteESPNow paqueteEnviar; paqueteESPNow paqueteRecibir; int16_t audioBuffer[512]; bool intercomActivo = false; void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) { memcpy(&paqueteRecibir, incomingData, sizeof(paqueteESPNow)); switch(paqueteRecibir.tipo) { case 0: // Timbre tft.fillScreen(ILI9341_RED); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(4); tft.setCursor(60, 100); tft.println("TIMBRE!"); tone(5, 2000, 500); delay(2000); break; case 1: // Audio if(intercomActivo) { size_t bytes_written; i2s_write(I2S_NUM_1, paqueteRecibir.data, paqueteRecibir.len, &bytes_written, portMAX_DELAY); } break; case 2: // Video chunk memcpy(&videoBuffer[videoOffset], paqueteRecibir.data, paqueteRecibir.len); videoOffset += paqueteRecibir.len; if(videoOffset >= VIDEO_WIDTH * VIDEO_HEIGHT * 2) { // Frame completo, mostrar en TFT tft.drawRGBBitmap(0, 0, (uint16_t*)videoBuffer, VIDEO_WIDTH, VIDEO_HEIGHT); videoOffset = 0; } break; case 3: // Comando uint8_t cmd = paqueteRecibir.data[0]; if(cmd == 1) { // Activar intercom desde puerta intercomActivo = true; tft.fillScreen(ILI9341_BLUE); tft.setTextColor(ILI9341_WHITE); tft.setCursor(50, 100); tft.println("HABLANDO..."); } else if(cmd == 2) { intercomActivo = false; } break; } } void setup() { Serial.begin(115200); // Configurar pines pinMode(PIN_BOTON_ABRIR, INPUT_PULLUP); pinMode(PIN_RELE, OUTPUT); digitalWrite(PIN_RELE, HIGH); // Inicializar TFT tft.begin(); tft.setRotation(1); tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2); tft.setCursor(20, 100); tft.println("Video Portero"); tft.setCursor(20, 130); tft.println("Esperando..."); // Inicializar I2S para micrófono i2s_config_t i2s_mic_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX), .sample_rate = 16000, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, .communication_format = I2S_COMM_FORMAT_I2S, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, .dma_buf_count = 8, .dma_buf_len = 512 }; i2s_pin_config_t i2s_mic_pins = { .bck_io_num = I2S_MIC_SCK, .ws_io_num = I2S_MIC_WS, .data_out_num = I2S_PIN_NO_CHANGE, .data_in_num = I2S_MIC_SD }; i2s_driver_install(I2S_NUM_0, &i2s_mic_config, 0, NULL); i2s_set_pin(I2S_NUM_0, &i2s_mic_pins); // Inicializar I2S para bocina i2s_config_t i2s_speaker_config = { .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX), .sample_rate = 16000, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, .communication_format = I2S_COMM_FORMAT_I2S, .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, .dma_buf_count = 8, .dma_buf_len = 512 }; i2s_pin_config_t i2s_speaker_pins = { .bck_io_num = I2S_BCK, .ws_io_num = I2S_LRC, .data_out_num = I2S_DOUT, .data_in_num = I2S_PIN_NO_CHANGE }; i2s_driver_install(I2S_NUM_1, &i2s_speaker_config, 0, NULL); i2s_set_pin(I2S_NUM_1, &i2s_speaker_pins); // Inicializar ESP-NOW WiFi.mode(WIFI_STA); esp_now_init(); esp_now_register_recv_cb(OnDataRecv); esp_now_peer_info_t peerInfo; memcpy(peerInfo.peer_addr, macPuerta, 6); peerInfo.channel = 0; peerInfo.encrypt = false; esp_now_add_peer(&peerInfo); } void loop() { // Botón abrir puerta if(digitalRead(PIN_BOTON_ABRIR) == LOW) { digitalWrite(PIN_RELE, LOW); // Activar cerradura delay(1000); digitalWrite(PIN_RELE, HIGH); tft.fillScreen(ILI9341_GREEN); tft.setTextColor(ILI9341_BLACK); tft.setCursor(30, 100); tft.println("PUERTA ABIERTA"); delay(1000); } // Enviar audio si intercom activo if(intercomActivo) { size_t bytes_read; i2s_read(I2S_NUM_0, audioBuffer, sizeof(audioBuffer), &bytes_read, portMAX_DELAY); int samples = bytes_read / 2; for(int i = 0; i < samples; i += 120) { int chunk = min(120, samples - i); paqueteEnviar.tipo = 1; paqueteEnviar.len = chunk * 2; memcpy(paqueteEnviar.data, &audioBuffer[i], paqueteEnviar.len); esp_now_send(macPuerta, (uint8_t*)&paqueteEnviar, sizeof(paqueteESPNow)); delay(5); } } delay(10); }
LISTA DE MATERIALES
Módulo Puerta (Exterior):
| Cantidad | Componente | Especificaciones | Precio |
|---|---|---|---|
| 1 | ESP32-CAM | AI-Thinker | |
| 1 | INMP441 (nuevo) | Micrófono digital I2S | |
| 1 | MAX98357 (nuevo) | Amplificador I2S | |
| 1 | Bocina 3W | 4Ω o 8Ω | |
| 2 | Botones impermeables | Para exterior | |
| 1 | Caja estanca IP65 | Para exterior | |
| 1 | Fuente 5V 3A | Impermeable |
Módulo Casa (Interior):
| Cantidad | Componente | Especificaciones | Precio |
|---|---|---|---|
| 1 | ESP32 | NodeMCU-32S | |
| 1 | Pantalla TFT 2.4″ (nuevo) | IL9341 SPI | |
| 1 | INMP441 | Micrófono digital | |
| 1 | MAX98357 | Amplificador I2S | |
| 1 | Bocina 3W | Para hablar | |
| 1 | Módulo relé | 1 canal 5V | |
| 1 | Cerradura eléctrica | 12V tipo solenoide | |
| 2 | Fuentes | 5V y 12V |
TOTAL CON AUDIO Y VIDEO: ~ €114
