Arduino 入门学习笔记(二十八):CAMERA_WEBSERVER 实验
Arduino CAMERA_WEBSERVER 实验,开发板:正点原子ESP32S3,记录学习过程。
Arduino 入门学习笔记(二十八):CAMERA_WEBSERVER 实验
开发板:正点原子ESP32S3
没有LCD屏可以用串口打印进行测试
例程源码在文章顶部可免费下载
目前多次测试代码,每次网址均连接失败,有测试成功的朋友可以留一下言,看看是啥问题。
1. CAMERA_WEBSERVER 介绍
本实验跟之前相关实验原理上是相似的,所以不再讲解原理了。本实验的网页主要就是针对摄像头做的显示界面,可以对摄像头进行设置。本实验介绍到的函数可在以下文件中找到:
C:\Users\ 用户名 \AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.11\tools\sdk\esp32s3\esp_http_server.h
接下来,我们介绍一下本实验所用到的用到的函数。
startCameraServer 函数,该函数功能是自动将摄像头数据馈送到 IP 地址访问的网页。
void startCameraServer()
无参数;
无返回值。
startCameraServer 函数主要就是调用 httpd_start 函数,该函数功能是启动 Web 服务器。
esp_err_t httpd_start(httpd_handle_t *handle, const httpd_config_t *config)
参数 handle 为 HTTP 服务器句柄;
参数 config 为 Web 服务器的配置参数结构体指针;
返回值为 esp_err_t 类型。 ESP_OK 表示启动成功; ESP_ERR_INVALID_ARG 表示参数无效; ESP_ERR_HTTPD_ALLOC_MEM 表示申请内存失败; ESP_ERR_HTTPD_TASK 表示启动服务器任务失败。
2. 硬件设计
2.1 例程功能
程序下载完成, ESP32-S3 尝试连接程序设定的 WIFI 网络,连接上后 LCD 显示 ESP32-S3的 IP。终端浏览器(计算机、手机)也要接入一样的 WIFI 网络,在浏览器中输入 ESP32-S3 的IP 地址,访问 ESP32-S3 CAMERA Web 服务器。 通过 WEB 查看当前摄像头拍摄的图像数据并且可以对摄像头参数进行修改。
2.2 硬件资源
- LED 灯
LED-IO1 - USART0
U0TXD-IO43
U0RXD-IO44 - XL9555
IIC_SDA-IO41
IIC_SCL-IO42 - SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在 P5 端口,使用跳线帽将 IO_SET 和 LCD_DC 相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555) - CAMERA
OV_SCL-IO38
OV_SDA- IO39
VSYNC- IO47
HREF- IO48
PCLK- IO45
D0- IO4
D1- IO5
D2- IO6
D3- IO7
D4- IO15
D5- IO16
D6- IO17
D7- IO18
RESET-IO0_5(XL9555)
PWDN-IO0_4(XL9555) - ESP32-S3 内部 WIFI
2.3 原理图
这里的原理图请参考摄像头实验。
3. 软件设计
3.1 程序流程图
下面看看本实验的程序流程图:
3.2 程序解析
CAMERA WEBSERVER 实现的代码主要是 app_httpd.cpp 和 06_camera_webserver.ino。app_httpd.cpp 牵扯比较多的内容,学有余力可自行了解学习。 这里主要讲解06_camera_webserver.ino 文件内容。
06_camera_webserver.ino 代码
在 06_camera_webserver.ino 里面编写如下代码:
#include "uart.h"
#include "led.h"
#include "led.h"
#include "uart.h"
#include "xl9555.h"
#include "spilcd.h"
#include "camera.h"
#include "esp_camera.h"
#include <WiFi.h>
char* ssid = "ALIENTEK-YF"; /* 要连接网络名称 */
char* password = "15902020353"; /* 要连接网络密码 */
void startCameraServer();
/**
* @brief 当程序开始执行时,将调用 setup()函数,通常用来初始化变量、函数等
* @param 无
* @retval 无
*/
void setup()
{
char ip_buf[20];
led_init(); /* LED 初始化 */
uart_init(0, 115200); /* 串口 0 初始化 */
xl9555_init(); /* IO 扩展芯片初始化 */
lcd_init(); /* LCD 初始化 */
camera_init(); /* 摄像头初始化 */
lcd_show_string(30, 50, 200, 16, LCD_FONT_16, "ESP32-S3", RED);
lcd_show_string(30, 70, 200, 16, LCD_FONT_16, "CAMERA WEB SERVER TEST",RED);
lcd_show_string(30, 90, 200, 16, LCD_FONT_16, "ATOM@ALIENTEK", RED);
WiFi.begin(ssid, password);
WiFi.setSleep(false);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
lcd_show_string(30,110,200,16,LCD_FONT_16,"waitting to connectwifi",RED);
}
lcd_show_string(30,110,200,16,LCD_FONT_16, "wifi connected ", RED);
startCameraServer(); /* 自动开始将摄像头馈送流至可通过板的 IP 地址访问的网页 */
lcd_show_string(30, 130, 200, 16, LCD_FONT_16, "Camera Ready!", RED);
lcd_show_string(0, 150, 200, 16, LCD_FONT_16, "Use 'http://", RED);
sprintf(ip_buf, "%s", WiFi.localIP().toString().c_str());
lcd_show_string(96, 150, 200, 16, LCD_FONT_16, ip_buf, BLUE);
lcd_show_string(216, 150, 200, 16, LCD_FONT_16, "' to connect", RED);
}
/**
* @brief 循环函数,通常放程序的主体或者需要不断刷新的语句
* @param 无
* @retval 无
*/
void loop()
{
LED_TOGGLE();
delay(500);
}
在 setup 函数中,调用 led_init 函数完成 LED 初始化,调用 key_init 函数完成 KEY 初始化,调用 uart_init 函数完成串口初始化,调用 xl9555_init 函数完成 XL9555 初始化,调用 lcd_init 函数完成 LCD 屏初始化,调用 camera_init 完成摄像头初始化,调用 WiFi.begin 函数连接网络,最后通过 startCameraServer 函数启动 camera web 服务器。接下来就是在同一个网络上的设备通过浏览器打开 ESP32-S3 的 IP 地址访问网页。
在 loop 函数中,主要就是对 LED 灯进行翻转。而在网页的操作会跳转到对应的回调函数中执行。 设置回调函数已经在 startCameraServer 函数中实现了。
4. 下载验证
程序下载成功后,我们可以看到 LCD 显示已经连接上 WiFi, 显示当前 ESP32-S3 的 IP, 如下图所示:
将移动端设备,比如手机也连接该 WiFi,然后在浏览器中输入 ESP32-S3 的 IP“192.168.2.0”回车访问网页,需要稍等片刻,如下图所示:
注意:需要显示出图像,需要我们点击“Start Stream”按钮,按下以后,该按钮会显示“StopStream”。
其他选项卡,大家可以自行去操作一下。
更多推荐



所有评论(0)