Tutorial ESP32 44/55 - Servidor Web de Cámara ESP32 Transmisión de Video por Wifi CAM-2 | Kit ESP32 de SunFounder
En este tutorial, crearemos una estación meteorológica en tiempo real utilizando el ESP32 y su extensión de cámara. Este proyecto permitirá al ESP32 mostrar datos meteorológicos como la temperatura y la humedad en una pantalla LCD, mientras transmite video a través de Wi-Fi. Al final de este tutorial, tendrás una estación meteorológica totalmente funcional que se actualiza cada 10 segundos, proporcionando información valiosa sobre el clima al alcance de tu mano. Para más claridad, consulta el video (en el video a las 00:00).
Hardware Explicado
Los componentes principales de este proyecto incluyen el microcontrolador ESP32, una pantalla LCD y un módulo de cámara. El ESP32 es un microcontrolador potente que cuenta con capacidades integradas de Wi-Fi y Bluetooth, lo que le permite conectarse a Internet y comunicarse con otros dispositivos. El módulo de cámara permite la transmisión de video, mientras que la pantalla LCD presenta información meteorológica al usuario.
El LCD utilizado en este proyecto es una pantalla de 20x4 caracteres, que puede mostrar una cantidad significativa de información a la vez. Está conectado al ESP32 para mostrar la temperatura, la humedad y otros datos meteorológicos obtenidos de una API en línea. El ESP32 también incluye un sistema de gestión de batería, lo que le permite funcionar de forma inalámbrica.
Detalles de la hoja de datos
| Fabricante | Espressif |
|---|---|
| Número de parte | ESP32-WROOM-32 |
| Voltaje de lógica/entrada-salida | 3.3 V |
| Tensión de suministro | 3.0 - 3.6 V |
| Corriente de salida (por GPIO) | 12 mA |
| Corriente de pico (por GPIO) | 40 mA |
| Orientación sobre la frecuencia PWM | 1 kHz |
| Umbrales de lógica de entrada | 0.3 * VDD a 0.7 * VDD |
| Caída de tensión / RDS(on)/ saturación | 0.1 V (típ.) |
| Límites térmicos | 125 °C |
| Paquete | QFN48 |
| Notas / variantes | Incluye opciones de PSRAM |
- Asegúrese de un suministro de energía adecuado (3.0 - 3.6 V).
- Utilice disipadores de calor para aplicaciones de alta corriente.
- Ten cuidado con los límites de corriente de GPIO (12 mA por pin).
- Conecta la LCD y la cámara correctamente para evitar una mala comunicación.
- Verifica las credenciales de Wi-Fi y las claves de API para problemas de conectividad.
Instrucciones de cableado
Para conectar el ESP32 con el módulo LCD y la cámara, comienza conectando los pines de alimentación y tierra. Conecta el pin de tierra del ESP32 a la tierra del LCD y la cámara. Luego, conecta el pin de 5V del ESP32 al VCC del LCD. Para la cámara, conecta el cable marrón a la tierra, el cable rojo a 5V, el cable amarillo a GPIO 21 y el cable naranja a GPIO 22. Asegúrate de que las conexiones sean seguras para evitar problemas durante la operación.
A continuación, conecta el LCD a los pines GPIO apropiados. Los pines específicos pueden variar según tu configuración, pero normalmente, conectarás los pines de control a los GPIO designados en el ESP32. Asegúrate de consultar la hoja de datos o el diagrama de pines para el modelo específico de tu LCD y confirmar el cableado correcto. Después de completar estas conexiones, verifica todas las conexiones por si hay algún cable suelto o incorrecto.
Ejemplos de código y guía paso a paso
En el código, primero incluimos las bibliotecas necesarias para manejar las funcionalidades de la cámara y Wi-Fi. Se declaran los identificadores esenciales, incluyendossidypasswordpara las credenciales de Wi-Fi. La configuración de la cámara se realiza utilizando elcamera_config_testructura, donde definimos varios parámetros como el formato de píxel y el tamaño del fotograma.
const char* ssid = "SSID";
const char* password = "PASSWORD";
void setup() {
Serial.begin(115200);
camera_config_t config;
// ... (configuration settings)
esp_err_t err = esp_camera_init(&config);
// Check for errors
}Este fragmento inicializa la cámara y verifica si hay errores durante la configuración. Si la cámara no se inicializa, se imprime un mensaje de error en el monitor serie.
A continuación, manejamos la conexión Wi-Fi y comenzamos el servidor de la cámara. El bucle de conexión continúa hasta que se establece una conexión Wi-Fi exitosa, lo cual es crucial para obtener datos meteorológicos de la API.
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
startCameraServer();En esta sección, iniciamos la conexión Wi-Fi e imprimimos puntos en el monitor serie hasta que se establezca la conexión. Una vez conectado, se inicia el servidor de la cámara, lo que permite la transmisión de video.
El código completo se cargará debajo del artículo, donde podrás ver cómo todas las partes se unen.
Demostración / Qué esperar
Una vez que todo esté cableado y el código esté subido, puedes esperar que el ESP32 se conecte a la red Wi-Fi y comience a obtener datos del clima cada 10 segundos. Las lecturas de temperatura y humedad se mostrarán en la pantalla LCD. Además, la cámara transmitirá video a través de Wi-Fi, que se puede acceder mediante la dirección IP local impresa en el monitor serial. Si la conexión Wi-Fi falla, el ESP32 te notificará a través de la salida serial (en el video a las 10:00).
Tiempos de video
- 00:00 Inicio
- 1:42 Introducción al ESP32-Cam
- 4:30 Código de Arduino explicado
- 7:35 Seleccionando la placa ESP32 y el puerto COM en Arduino IDE
- 9:17 Demostración
- 12:06 Demostración en Teléfono Móvil
#include "esp_camera.h"
#include <WiFi.h>
// ¡¡¡Advertencia!!! Se requiere un IC PSRAM para la resolución UXGA y alta calidad JPEG
// Asegúrese de que esté seleccionado el módulo ESP32 Wrover o otra placa con PSRAM.
// Se transmitirán imágenes parciales si la imagen excede el tamaño del búfer.
// Debes seleccionar un esquema de partición del menú de la placa que tenga al menos 3 MB de espacio para la APP.
// El reconocimiento facial está DESACTIVADO para ESP32 y ESP32-S2, porque ocupa a partir de 15
// segundos para procesar un solo fotograma. La Detección de Caras está HABILITADA si PSRAM también está habilitado.
// ===================
// Seleccionar modelo de cámara
// ===================
// #define MODELO_CÁMARA_WROVER_KIT // Tiene PSRAM
// #define CAMERA_MODEL_ESP_EYE // Tiene PSRAM
// #define CAMERA_MODEL_ESP32S3_EYE // Tiene PSRAM
// #define CAMERA_MODEL_M5STACK_PSRAM // Tiene PSRAM
// #define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera versión B tiene PSRAM
// #define CAMERA_MODEL_M5STACK_WIDE // Tiene PSRAM
// #define CAMERA_MODEL_M5STACK_ESP32CAM // Sin PSRAM
// #define CAMERA_MODEL_M5STACK_UNITCAM // Sin PSRAM
#define CAMERA_MODEL_AI_THINKER // Tiene PSRAM
// #define CAMERA_MODEL_TTGO_T_JOURNAL // Sin PSRAM
// #define MODELO_CÁMARA_XIAO_ESP32S3 // Tiene PSRAM
// ** Placas Internas de Espressif **
// #define CAMERA_MODEL_ESP32_CAM_BOARD
// #define CAMERA_MODEL_ESP32S2_CAM_BOARD
// #define CAMERA_MODEL_ESP32S3_CAM_LCD
#include "camera_pins.h"
// Reemplace las siguientes variables con su combinación de SSID/Contraseña.
const char* ssid = "SSID";
const char* password = "PASSWORD";
void startCameraServer();
void setupLedFlash(int pin);
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sccb_sda = SIOD_GPIO_NUM;
config.pin_sccb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.frame_size = FRAMESIZE_UXGA;
config.pixel_format = PIXFORMAT_JPEG; // para transmisión
// config.pixel_format = PIXFORMAT_RGB565; // para detección/reconocimiento facial
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
config.fb_location = CAMERA_FB_IN_PSRAM;
config.jpeg_quality = 12;
config.fb_count = 1;
// si hay un IC de PSRAM presente, inicializar con resolución UXGA y mayor calidad JPEG
// para un búfer de fotogramas preasignado más grande.
if(config.pixel_format == PIXFORMAT_JPEG){
if(psramFound()){
config.jpeg_quality = 10;
config.fb_count = 2;
config.grab_mode = CAMERA_GRAB_LATEST;
} else {
// Limita el tamaño del marco cuando PSRAM no esté disponible.
config.frame_size = FRAMESIZE_SVGA;
config.fb_location = CAMERA_FB_IN_DRAM;
}
} else {
// Mejor opción para detección/reconocimiento facial
config.frame_size = FRAMESIZE_240X240;
#if CONFIG_IDF_TARGET_ESP32S3
config.fb_count = 2;
#endif
}
#if defined(CAMERA_MODEL_ESP_EYE)
pinMode(13, INPUT_PULLUP);
pinMode(14, INPUT_PULLUP);
#endif
// inicialización de cámara
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
sensor_t * s = esp_camera_sensor_get();
// Los sensores iniciales están invertidos verticalmente y los colores están un poco saturados.
if (s->id.PID == OV3660_PID) {
s->set_vflip(s, 1); // devuélvelo
s->set_brightness(s, 1); // sube un poco el brillo
s->set_saturation(s, -2); // bajar la saturación
}
// bajar el tamaño del marco para una tasa de cuadros inicial más alta
if(config.pixel_format == PIXFORMAT_JPEG){
s->set_framesize(s, FRAMESIZE_QVGA);
}
#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
s->set_vflip(s, 1);
s->set_hmirror(s, 1);
#endif
#if defined(CAMERA_MODEL_ESP32S3_EYE)
s->set_vflip(s, 1);
#endif
// Configura el parpadeo de LED si el pin LED está definido en camera_pins.h
#if defined(LED_GPIO_NUM)
setupLedFlash(LED_GPIO_NUM);
#endif
WiFi.begin(ssid, password);
WiFi.setSleep(false);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
startCameraServer();
Serial.print("Camera Ready! Use 'http: // ");
Serial.print(WiFi.localIP());
Serial.println("' to connect");
}
void loop() {
// No hagas nada. Todo se hace en otra tarea por el servidor web.
delay(10000);
}
Common Course Links
Common Course Files
Recursos y referencias
-
Documentación
Archivos📁
No hay archivos disponibles.