3.ESP32-CAM 简介

ESP32-CAM是一个非常小的摄像头模块,带有ESP32-S芯片,成本不到10美元。您可以阅读 ESP32-CAM 入门指南,了解如何使用视频流和人脸识别示例。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6SgdKenO-1644497165666)(https://i1.wp.com/randomnerdtutorials.com/wp-content/uploads/2019/03/ESP32-CAM-camera.jpg?resize=750%2C421&quality=100&strip=all&ssl=1)]

视频流服务器

按照以下步骤,使用 ESP32-CAM 构建视频流 Web 服务器,您可以在本地网络上访问该服务器。

1. 安装 ESP32 附加组件

在这个例子中,我们使用 Arduino IDE 对 ESP32-CAM 开发板进行编程。因此,您需要安装 Arduino IDE 以及 ESP32 附加组件。请按照以下教程之一安装 ESP32 附加组件(如果尚未安装):

  • 在 Arduino IDE 中安装 ESP32 开发板(Windows 指令)
  • 在 Arduino IDE 中安装 ESP32 开发板(Mac 和 Linux 说明)

2. 视频流网络服务器代码

之后,将以下代码复制到您的Arduino IDE。

/*********Rui SantosComplete project details at https://RandomNerdTutorials.com/esp32-cam-video-streaming-web-server-camera-home-assistant/IMPORTANT!!! - Select Board "AI Thinker ESP32-CAM"- GPIO 0 must be connected to GND to upload a sketch- After connecting GPIO 0 to GND, press the ESP32-CAM on-board RESET button to put your board in flashing modePermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files.The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.
*********/#include "esp_camera.h"
#include <WiFi.h>
#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"//Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";#define PART_BOUNDARY "123456789000000000000987654321"// This project was tested with the AI Thinker Model, M5STACK PSRAM Model and M5STACK WITHOUT PSRAM
#define CAMERA_MODEL_AI_THINKER
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WITHOUT_PSRAM// Not tested with this model
//#define CAMERA_MODEL_WROVER_KIT#if defined(CAMERA_MODEL_WROVER_KIT)#define PWDN_GPIO_NUM    -1#define RESET_GPIO_NUM   -1#define XCLK_GPIO_NUM    21#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      19#define Y4_GPIO_NUM      18#define Y3_GPIO_NUM       5#define Y2_GPIO_NUM       4#define VSYNC_GPIO_NUM   25#define HREF_GPIO_NUM    23#define PCLK_GPIO_NUM    22#elif defined(CAMERA_MODEL_M5STACK_PSRAM)#define PWDN_GPIO_NUM     -1#define RESET_GPIO_NUM    15#define XCLK_GPIO_NUM     27#define SIOD_GPIO_NUM     25#define SIOC_GPIO_NUM     23#define Y9_GPIO_NUM       19#define Y8_GPIO_NUM       36#define Y7_GPIO_NUM       18#define Y6_GPIO_NUM       39#define Y5_GPIO_NUM        5#define Y4_GPIO_NUM       34#define Y3_GPIO_NUM       35#define Y2_GPIO_NUM       32#define VSYNC_GPIO_NUM    22#define HREF_GPIO_NUM     26#define PCLK_GPIO_NUM     21#elif defined(CAMERA_MODEL_M5STACK_WITHOUT_PSRAM)#define PWDN_GPIO_NUM     -1#define RESET_GPIO_NUM    15#define XCLK_GPIO_NUM     27#define SIOD_GPIO_NUM     25#define SIOC_GPIO_NUM     23#define Y9_GPIO_NUM       19#define Y8_GPIO_NUM       36#define Y7_GPIO_NUM       18#define Y6_GPIO_NUM       39#define Y5_GPIO_NUM        5#define Y4_GPIO_NUM       34#define Y3_GPIO_NUM       35#define Y2_GPIO_NUM       17#define VSYNC_GPIO_NUM    22#define HREF_GPIO_NUM     26#define PCLK_GPIO_NUM     21#elif defined(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
#else#error "Camera model not selected"
#endifstatic 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};//Serial.printf("Starting web server on port: '%d'\n", config.server_port);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 detectorSerial.begin(115200);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_sscb_sda = SIOD_GPIO_NUM;config.pin_sscb_scl = SIOC_GPIO_NUM;config.pin_pwdn = PWDN_GPIO_NUM;config.pin_reset = RESET_GPIO_NUM;config.xclk_freq_hz = 20000000;config.pixel_format = PIXFORMAT_JPEG; if(psramFound()){config.frame_size = FRAMESIZE_UXGA;config.jpeg_quality = 10;config.fb_count = 2;} else {config.frame_size = FRAMESIZE_SVGA;config.jpeg_quality = 12;config.fb_count = 1;}// Camera initesp_err_t err = esp_camera_init(&config);if (err != ESP_OK) {Serial.printf("Camera init failed with error 0x%x", err);return;}// Wi-Fi connectionWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected");Serial.print("Camera Stream Ready! Go to: http://");Serial.print(WiFi.localIP());// Start streaming web serverstartCameraServer();
}void loop() {delay(1);
}

查看原始代码

在上传代码之前,您需要在以下变量中插入您的网络凭据:

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

然后,确保选择正确的相机模块。在这种情况下,我们使用的是AI-THINKER模型。

如果您使用相同的相机模块,则无需更改代码上的任何内容。

#define CAMERA_MODEL_AI_THINKER

现在,您可以将代码上传到 ESP32-CAM 开发板。

3. 上传代码

使用 FTDI 编程器将 ESP32-CAM 板连接到计算机。按照下一个逻辑示意图进行操作:

许多FTDI编程器都有一个跳线,允许您选择3.3V或5V。确保跳线位于正确的位置以选择5V。

重要: GPIO 0 要连接 GND 才能上传代码

ESP32-CAM FTDI Programmer
GND GND
5V VCC (5V)
U0R TX
U0T RX
GPIO 0 GND

要上传代码,请按照以下步骤操作:

1) 转到工具>,然后选择 AI-Thinker ESP32-CAM

2) 转到**“工具”**>端口",然后选择 ESP32 连接到的 COM 端口。

3)然后,单击上传按钮以上传代码。

4) 当您开始在调试窗口中看到这些点(如下所示)时,请按 ESP32-CAM 板载 RST 按钮。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pqloSI0-1644497165672)(https://i0.wp.com/randomnerdtutorials.com/wp-content/uploads/2019/12/dots-uploading-code.png?resize=828%2C75&quality=100&strip=all&ssl=1)]

几秒钟后,代码应成功上传到您的开发板。

获取 IP 地址

上传代码后,断开连接GPIO 0从加拿大国民民主盾.以波特率为115200打开串行显示器。按 ESP32-CAM 板载复位按钮。

ESP32 IP 地址应打印在串行监视器中。

访问视频流服务器

现在,您可以在本地网络上访问摄像机流服务器。打开浏览器并输入 ESP32-CAM IP 地址。应加载包含当前视频流的页面。

在浏览器中输入IP即可访问

ESP32-CAM视频流相关推荐

  1. esp32 cam 配网 实现视频传输

    esp32 cam 1.实现配网 1.1.WiFiManager使用 2.视频传输 2.1 .修改代码 2.2 .配网操作 2.3 .查看视频   实现功能首先默认连接代码里面写入的WiFi信息,如果 ...

  2. esp32 cam工作电流_我如何在家工作:Cam的生产力之痛

    esp32 cam工作电流 Telecommuting is becoming more and more common these days, with many tech writers (mys ...

  3. ESP32 CAM与服务器(python)UDP视频传输

    ESP32 CAM Arduino代码 #include "esp_camera.h" #include <WiFi.h> #include "AsyncUD ...

  4. esp32 cam 从安装、烧录到成为webcam详细教程

    前言:本教程仅适用于ESP32-CAM开发板且带下载主板的这种情况. 一.安装arduino 1.arduino下载地址: ''' https://www.arduino.cc/en/Main/Sof ...

  5. esp32 cam接入homekit苹果家庭app

    mac平台esp32 cam接入homekit苹果家庭app 一.准备: 1.esp32-cam模块,串口工具 2.brew 二.开始吧 1.安装一些工具 sudo easy_install pip ...

  6. esp32 cam 1.44寸TFT彩屏 ST7735S驱动 TFT_eSPI库驱动

    ESP32 CAM引脚与TFT1.44(ST7735S)引脚接线 ESP32 CAM TFT 1.44 5V VCC GND GND GND NC NC 5V BLC D14 SCL D15 SDA ...

  7. ESP32 CAM下载程序踩过的吭

    最近几天想玩一下ESP32 CAM,做个简单的摄像头,今天终于不再报错了,特别记录一下,方便自己也方便他人. 说明一下cam自闪光灯是4号IO口,高电平亮 digitalWrite(4, HIGH); ...

  8. 基于ESP32 CAM的人脸识别考勤系统

    概述:使用 ESP32 CAM 的人脸识别考勤系统 本教程介绍了使用ESP32 CAM 模组的人脸识别考勤系统.我们将为此应用程序使用OpenCV和Visual Studio .OpenCV 是一个开 ...

  9. 自行编译micropython固件刷入ESP32 cam,并测试拍照及图传

    一.环境准备 1.Ubuntu20.04LTS 2.ESP-IDF 3.micropython 操作步骤 1.安装基于Windows的linux子系统 适用于 Linux 的 Windows 子系统安 ...

  10. stm32/esp32/cam智能安防系统远程视频监控物联网远程传输视频图像GSM短信报警

    系统实现了智能安防报警系统设计,人体感应报警,烟雾报警,GSM短信报警,同时支持远程视频监控功能,安卓端app端远程查看视频流.实物展示视频 ​​​​​​基于stm32单片机ESP32智能安防系统远程 ...

最新文章

  1. python画柱状图代码-python绘制双柱形图代码实例
  2. 如何使用echo.js实现图片的懒加载(整理)
  3. 【计算理论】计算复杂性 ( 非确定性图灵机的时间复杂度 | 非确定性图灵机 与 确定性图灵机 的时间复杂度 之间的关系 )
  4. 2018年中国研究生数学建模竞赛C题 二等奖 赛题论文
  5. Django(part32)--一对一映射
  6. Android应用开发—FragmentManager如何管理fragments
  7. Codeforces 436D Pudding Monsters
  8. 数据科学包12-实例1:股票数据分析
  9. hdu 1251(字典树)
  10. 在iPhone任何界面截图完整图文教程
  11. 移动网站建设应注意哪些问题?
  12. 【ONE·Linux || 权限 】
  13. SpringBoot 与 Kotlin 完美交融
  14. mysql触发器——NEW与OLD aes_encrypt AES_DECRYPT
  15. 目标检测yolo, voc, coco的BBox格式转换
  16. 微服务-高并发-思路
  17. 我是云南的云南怒江的是什么梗 我是云南的云南怒江的梗出处
  18. 微信小程序与后端Java接口交互-图书搜索实现
  19. 红米4手机(其它小米应该一样)adb 调试(usb ,tcp)
  20. css template download

热门文章

  1. Unity进阶课程【一】Input Field 组件的失焦和使用
  2. 鼠标的光标变成了下划线
  3. android 百度定位 封装,百度定位SDK使用V4.0
  4. Python---面向对象---龟鱼游戏
  5. Java设计模式——适配器模式
  6. 较早版本OAI ENB启动问题解决
  7. [USACO 1.2.1] Milking Cows
  8. 三个人的友谊显的有些拥挤了...
  9. php机房图形资产管理系统,机房资产管理系统(CMDB)
  10. 【python】HTTP压力测试过程中遇到的问题与解决方案