
المقدمة #
ايسبوت-ESP32-CAM-V1.0 هي وحدة الكاميرا الصغيرة الأكثر تنافسية في الصناعة، والتي يمكنها العمل بشكل مستقل كأصغر نظام.
يمكن استخدام ACEBOTT-ESP32-CAM-V1.0 على نطاق واسع في تطبيقات إنترنت الأشياء المختلفة، ومناسب للأجهزة الذكية المنزلية، والتحكم اللاسلكي الصناعي، والمراقبة اللاسلكية، والتعريف اللاسلكي QR، وإشارات نظام تحديد المواقع اللاسلكي وتطبيقات إنترنت الأشياء الأخرى.
يعتمد ACEBOTT-ESP32-CAM-V1.0 على حزمة DIP، والتي يمكن استخدامها مباشرة عند إدخالها في اللوحة السفلية لتحقيق الإنتاج السريع للمنتجات، وتزويد العملاء باتصال عالي الموثوقية، وتسهيل التطبيق في مختلف المناسبات الطرفية لأجهزة إنترنت الأشياء.
شرح المميزات: #
وحدة SoC Wi-Fi 802.11b/g/n صغيرة الحجم للغاية
يمكن استخدام وحدة المعالجة المركزية ثنائية النواة 32 بت منخفضة الطاقة كمعالج للتطبيق
التردد الرئيسي يصل إلى 240 ميجا هرتز، قوة حوسبة تصل إلى 600 DMIPS
ذاكرة SRAM مدمجة بحجم 520 كيلو بايت، وذاكرة PSRAM خارجية بحجم 8 ميجا بايت
دعم واجهات UART / SPI / I2C / PWM / ADC / DAC
دعم لكاميرات OV2640 وOV7670، مع فلاش مدمج
دعم تحميل الصور عبر WiFI
يدعم أوضاع الخمول المتعددة
Lwip و FreeRTOS
يدعم وضع العمل STA / AP / STA + AP
دعم شبكة التوزيع بنقرة واحدة Smart Config / AirKiss
المواصفات #
| المعاملات | القيمة / الوصف |
|---|---|
| المقاس | 27.1 × 47.1 (مم) |
| التغليف | تراجع 20 |
| مزود الطاقة | نوع ج |
| واجهة الدعم | UART/SPI/I2C/PWM |
| عدد منافذ الإدخال والإخراج | 10 |
| المنفذ التسلسلي معدل الباود | دعم 110 ~ 4608000 بت في الثانية، الافتراضي 115200 بت في الثانية |
| SPI فلاش | الافتراضي 32 ميغابت |
| تنسيق إخراج الصورة | JPEG (مدعوم بواسطة OV2640 فقط)، BMP، GRAYSCALE |
| نطاق الطيف | 2400 ~ 2483.5MHz |
| شكل هوائي | هوائي PCB خارجي، مكسب 2 ديسيبل |
| استهلاك الطاقة | أوقف تشغيل الفلاش: 180mA @ 5V |
| قم بتشغيل ضوء الفلاش وضبط السطوع إلى الحد الأقصى: 310 مللي أمبير عند 5 فولت | |
| النوم العميق: يمكن أن يصل أدنى استهلاك للطاقة إلى 6 مللي أمبير عند 5 فولت | |
| مودرم-سليب: الحد الأدنى للمستوى هو 20 مللي أمبير عند 5 فولت | |
| النوم الخفيف: يمكن أن تصل القيمة الدنيا إلى 6.7 مللي أمبير عند 5 فولت | |
| أمن | WEP / WPA-PSK / WPA2-PSK |
| نطاق امدادات الطاقة | 4.75-5.25V |
| درجة حرارة التشغيل | -20 درجة مئوية ~ 70 درجة مئوية |
| بيئة التخزين | -40 درجة مئوية ~ 1250 درجة مئوية،<90%رطوبة نسبية |


كود عينة #
قم بتوصيل اللوحة بالكمبيوتر باستخدام كابل بيانات Type-C: حدد "ESP32" -> "ESP32 Dev Module" من قائمة الأدوات > اللوحة. اختر المنفذ المناسب. وقم بتحميله إلى اللوحة باستخدام زر التحميل.
مخطط الأسلاك #

كود عينة #
#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);
}
نتيجة الاختبار #
بعد تحميل البرنامج، سيتم عرض تأثير التصوير على نهاية الويب. أولاً، يجب توصيل الجهاز الطرفي بشبكة WiFi الصادرة عن وحدة الكاميرا.

تَلمِيح!
يمكن تخصيص اسم WiFi وكلمة المرور في البرنامج.

عنوان IP لوحدة الكاميرا في وضع AP هو: 192.168.4.1، ثم أدخل عنوان IP في شريط العنوان في متصفح المحطة الطرفية للوصول إلى صفحة الويب الخاصة بصورة الكاميرا. من خلال تحريك اتجاه الكاميرا، يمكنك رؤية تأثير التصوير المباشر لوحدة الكاميرا على صفحة الويب.
