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”。
其他选项卡,大家可以自行去操作一下。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐