
Introducción #
ACEBOTT-ESP32-CAM-V1.0 es el módulo de cámara de tamaño pequeño más competitivo de la industria, que puede funcionar independientemente como el sistema más pequeño.
ACEBOTT-ESP32-CAM-V1.0 se puede utilizar ampliamente en diversas aplicaciones de Internet de las cosas, adecuado para dispositivos inteligentes domésticos, control inalámbrico industrial, monitoreo inalámbrico, identificación inalámbrica QR, señales del sistema de posicionamiento inalámbrico y otras aplicaciones de Internet de las cosas.
ACEBOTT-ESP32-CAM-V1.0 adopta el paquete DIP, que se puede usar directamente cuando se inserta en la placa inferior para lograr la producción rápida de productos, brindar a los clientes una conexión altamente confiable y facilitar la aplicación en varias ocasiones de terminales de hardware de Internet de las cosas.
Caracteristicas #
Módulo SoC Wi-Fi 802.11b/g/n de volumen ultrapequeño
La CPU de 32 bits de doble núcleo y bajo consumo se puede utilizar como procesador de aplicaciones.
Frecuencia principal hasta 240 MHz, potencia de cálculo hasta 600 DMIPS
SRAM de 520 KB incorporada, PSRAM externa de 8 MB
Soporte para interfaces UART / SPI / I2C / PWM / ADC / DAC
Soporte para cámaras OV2640 y OV7670, con flash incorporado
Admite carga de imágenes por WiFi
Admite múltiples modos de inactividad
Lwip y FreeRTOS
Admite el modo de trabajo STA/AP/STA+AP
Admite la red de distribución con un solo clic de Smart Config / AirKiss
Especificaciones #
| Parámetros | Valor / Descripción |
|---|---|
| Tamaño | 27.1 × 47.1 (milímetro) |
| La encapsulación | Dip 20 |
| Fuente de alimentación | Tipo-c |
| interfaz de soporte | UART/SPI/I2C/PWM |
| Número de puertos IO | 10 |
| Velocidad en baudios del puerto serie | Admite 110 ~ 4608000 bps, valor predeterminado 115200 bps |
| SPI Flash | Predeterminado 32Mbit |
| Formato de salida de imagen | JPEG (compatible solo con OV2640), BMP, ESCALA DE GRISES |
| Rango de espectro | 2400 ~ 2483.5MHz |
| Forma de antena | Antena PCB externa, ganancia 2 dBi |
| Consumo de energía | Apague el flash: 180mA@5V |
| Encienda la luz del flash y ajuste el brillo al máximo: 310 mA a 5 V. | |
| Suspensión profunda: el consumo de energía más bajo puede alcanzar 6 mA a 5 V | |
| Modo de suspensión moderado: el nivel mínimo es de 20 mA a 5 V | |
| Sueño ligero: el valor mínimo puede alcanzar 6.7 mA a 5 V | |
| Seguridad | WEP / WPA-PSK / WPA2-PSK |
| Rango de suministro de energía | 4.75-5.25V |
| Temperatura de funcionamiento | -20 ° C ~ 70 ° C |
| entorno de almacenamiento | -40 °C ~ 1250 °C, <90 % de humedad relativa |


Código de muestra #
Conecte la placa a la computadora mediante un cable de datos tipo C: seleccione “ESP32” -> “ESP32 Dev Module” en el menú Herramientas > Placa. Elija el puerto apropiado y cárguelo a la placa mediante el botón Cargar.
Diagrama de cableado #

Código de muestra #
#include "esp_camera.h"
#include
#include "esp_timer.h"
#include "img_converters.h"
#include "Arduino.h"
#include "fb_gfx.h"
#include "soc/soc.h" //disable brownout problems
#include "soc/rtc_cntl_reg.h" //disable brownout problems
#include "esp_http_server.h"
const char *ssid = "ESP32-CAM";
const char *password = "12345678";
WiFiServer server(100);
WiFiClient client;
#define PART_BOUNDARY "123456789000000000000987654321"
// #define CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
#define RXD2 14
#define TXD2 13
static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";
httpd_handle_t stream_httpd = NULL;
static esp_err_t stream_handler(httpd_req_t *req){
camera_fb_t * fb = NULL;
esp_err_t res = ESP_OK;
size_t _jpg_buf_len = 0;
uint8_t * _jpg_buf = NULL;
char * part_buf[64];
res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
if(res != ESP_OK){
return res;
}
while(true){
fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
res = ESP_FAIL;
} else {
if(fb->width > 400){
if(fb->format != PIXFORMAT_JPEG){
bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
esp_camera_fb_return(fb);
fb = NULL;
if(!jpeg_converted){
Serial.println("JPEG compression failed");
res = ESP_FAIL;
}
} else {
_jpg_buf_len = fb->len;
_jpg_buf = fb->buf;
}
}
}
if(res == ESP_OK){
size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
}
if(res == ESP_OK){
res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
}
if(res == ESP_OK){
res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
}
if(fb){
esp_camera_fb_return(fb);
fb = NULL;
_jpg_buf = NULL;
} else if(_jpg_buf){
free(_jpg_buf);
_jpg_buf = NULL;
}
if(res != ESP_OK){
break;
}
//Serial.printf("MJPG: %uB\n",(uint32_t)(_jpg_buf_len));
}
return res;
}
void startCameraServer(){
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
config.server_port = 80;
httpd_uri_t index_uri = {
.uri = "/",
.method = HTTP_GET,
.handler = stream_handler,
.user_ctx = NULL
};
if (httpd_start(&stream_httpd, &config) == ESP_OK) {
httpd_register_uri_handler(stream_httpd, &index_uri);
}
}
void setup() {
// WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
Serial.begin(115200);
Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
// Serial.setDebugOutput(false);
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; // for streaming
//config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
config.fb_location = CAMERA_FB_IN_PSRAM;
config.jpeg_quality = 12;
config.fb_count = 1;
// if PSRAM IC present, init with UXGA resolution and higher JPEG quality
// for larger pre-allocated frame buffer.
if(config.pixel_format == PIXFORMAT_JPEG){
if(psramFound()){
config.jpeg_quality = 10;
config.fb_count = 2;
config.grab_mode = CAMERA_GRAB_LATEST;
} else {
// Limit the frame size when PSRAM is not available
config.frame_size = FRAMESIZE_SVGA;
config.fb_location = CAMERA_FB_IN_DRAM;
}
} else {
// Best option for face detection/recognition
config.frame_size = FRAMESIZE_240X240;
#if CONFIG_IDF_TARGET_ESP32S3
config.fb_count = 2;
#endif
}
// camera init
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();
//drop down frame size for higher initial frame rate
//s->set_framesize(s, FRAMESIZE_SXGA); //Byte length sampling value:60000 #9 (High picture quality) 1280x1024
s->set_framesize(s, FRAMESIZE_SVGA); //Byte length sampling value:40000 #7 (Medium picture quality) 800x600
//s->set_framesize(s, FRAMESIZE_QVGA); //Byte length sampling value:10000 #4 (Poor picture quality) 320x240
s->set_vflip(s, 1); //Image orientation Settings (up and down)
s->set_hmirror(s, 1); //Image orientation Settings (left and right)
WiFi.setTxPower(WIFI_POWER_19_5dBm);
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password, 5);
// WiFi.softAP(ssid, password);
Serial.print("\r\n");
startCameraServer();
Serial.print("\r\n");
Serial.print("Camera Ready! Use 'http://");
Serial.print(WiFi.softAPIP());
Serial.println("' to connect");
server.begin(); // Starting the server
delay(100);
}
void loop() {
delay(1);
}
Resultado de la prueba #
Después de cargar el programa, el efecto de imagen se mostrará en el sitio web. En primer lugar, el dispositivo terminal debe estar conectado a la red WiFi emitida por el módulo de la cámara.

¡Pista!
El nombre y la contraseña de WiFi en el programa se pueden personalizar.

La dirección IP del módulo de la cámara en modo AP es: 192.168.4.1, y luego ingrese la dirección IP en la barra de direcciones del navegador del terminal para acceder a la página web de la imagen de la cámara. Al mover la cámara en la dirección correcta, puede ver el efecto de imagen en vivo del módulo de la cámara en la página web.

