P2 PDS video portero con esp32

1. MÓDULO PUERTA (ESP32-CAM) CON AUDIO I2S

text
┌─────────────────────────────────────────────────────────────┐
│                     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

text
┌─────────────────────────────────────────────────────────────────┐
│                         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

text
╔════════════════════════════════════════════════════════════════╗
║                    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

text
┌─────────────────────────────────────────────────────────────────┐
│                 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

text
┌─────────────────────────────────────────────────────────────────┐
│                    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

cpp
// 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

cpp
// 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *