Código de búsqueda

Tutorial ESP32 44/55 - Servidor Web de Cámara ESP32 Transmisión de Video por Wifi CAM-2 | Kit ESP32 de SunFounder

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).

extension_bopard_camera

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

Imágenes

ESP32-40-micro-sd-card-2
ESP32-40-micro-sd-card-2
extension_bopard_camera
extension_bopard_camera
845-ESP32 Tutorial 44/55- Arduino code for camera web sever
Idioma: C++
#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);
}

Recursos y referencias

Archivos📁

No hay archivos disponibles.