【花雕学编程】Arduino动手做(230)---德国 bitluni 比特鲁尼:ESP32-Cam 延时摄影

在这里插入图片描述

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ESP32-CAM 是一款非常小的摄像头模块,配备 ESP32-S 芯片。除了 OV2640 摄像头和几个用于连接外围设备的 GPIO 外,它还具有一个 microSD 卡插槽,可用于存储使用摄像头拍摄的图像或存储文件以提供给客户。包括乐鑫 ESP32-S Wifi + 蓝牙+BLE 芯片、2MP 摄像头模块 OV2640 和带有 CH340 UART 芯片的 USB 编程适配器。

ESP32-Cam 是一款运行在 ESP32-S 芯片上并使用 OV2640 摄像头的小型摄像头模块。ESP32_Cam 也可以 OV7670 摄像头,但 OV2640 更好(更高的分辨率和内置的 JPEG 编码,这消除了 ESP32-S 的处理任务)。

ESP-32 Cam 规格
ESP-32 系列
它支持 Wi-Fi (802.11b/g/n)
支持蓝牙 (4.2 带 BLE)
内置 LED 闪光灯
9 个 IO 端口
支持 UART、SPI、I2C 和 PWM
内置 micro SD 读卡器
输入电源:3.3V / 5V(据报道,5V 供电比 3.3V 更稳定)

OV2640 摄像头
2 百万像素
阵列尺寸:UXGA (1600 x 1200)
镜头尺寸:1/4 英寸(6.35 毫米)
最大图像传输速率:15 帧/秒

在这里插入图片描述

实验模块接线示意图

在这里插入图片描述
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
项目实验之十一:德国 bitluni 比特鲁尼:ESP32-Cam 延时摄影

下载ESP32CamTimeLapse库
链接:https://github.com/bitluni/ESP32CamTimeLapse

在这里插入图片描述
一个 ESP32 CAM 摄像头用于录制延时镜头。它通过 Web 界面进行控制,并将图像存储到 micro SD 卡中。ffmpeg 用于将 Jpeg 图像转换为 mp4 视频。虽然由于固定焦距,宏距摄影效果不佳,但风景摄影看起来不错。

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
  项目实验之十一:德国 bitluni 比特鲁尼:ESP32-Cam 延时摄影
*/

#include <WiFi.h> // 引入WiFi库
#include "file.h" // 引入文件系统库
#include "camera.h" // 引入摄像头库
#include "lapse.h" // 引入时间间隔处理库

const char* ssid = "zhz3"; // WiFi名称
const char* password = "z156721"; // WiFi密码

void startCameraServer(); // 声明启动摄像头服务器的函数

void setup()
{
  Serial.begin(115200); // 初始化串口通信,波特率为115200
  Serial.setDebugOutput(true); // 设置串口调试输出
  Serial.println(); // 打印空行
  initFileSystem(); // 初始化文件系统
  initCamera(); // 初始化摄像头
  Serial.println("ESP32-Cam 已经正确连接!");

  WiFi.begin(ssid, password); // 连接WiFi
  while (WiFi.status() != WL_CONNECTED) // 等待WiFi连接成功
  {
    delay(500); // 延迟500毫秒
    Serial.print("."); // 打印连接进度
  }
  Serial.println(""); // 打印空行
  Serial.println("WiFi连接"); // 打印WiFi连接成功信息
  startCameraServer(); // 启动摄像头服务器
  Serial.print("相机就绪!使用 'http://"); // 打印摄像头服务器地址前缀
  Serial.print(WiFi.localIP()); // 打印本地IP地址
  Serial.println("' 连接"); // 打印连接提示信息
}

void loop()
{
  unsigned long t = millis(); // 获取当前时间(毫秒)
  static unsigned long ot = 0; // 上一次时间
  unsigned long dt = t - ot; // 计算时间差
  ot = t; // 更新上一次时间
  processLapse(dt); // 处理时间间隔
}

实验串口返回情况

在这里插入图片描述

这里详细解释一下这段程序的每个部分及其功能:

1、引入库文件

#include <WiFi.h> // 引入WiFi库,用于连接WiFi网络
#include "file.h" // 引入文件系统库,用于文件操作
#include "camera.h" // 引入摄像头库,用于摄像头初始化和操作
#include "lapse.h" // 引入时间间隔处理库,用于处理时间间隔任务

这些库文件提供了程序所需的功能,例如WiFi连接、文件操作、摄像头控制和时间间隔处理。

2、定义WiFi名称和密码

const char* ssid = "zhz3"; // 定义WiFi名称
const char* password = "z156721"; // 定义WiFi密码

这里定义了WiFi网络的名称和密码,用于连接到指定的WiFi网络。

3、声明函数

void startCameraServer(); // 声明启动摄像头服务器的函数

声明了一个函数startCameraServer,该函数将在后面定义并用于启动摄像头服务器。

4、setup函数

void setup()
{
	Serial.begin(115200); // 初始化串口通信,设置波特率为115200
	Serial.setDebugOutput(true); // 启用串口调试输出
	Serial.println(); // 打印空行,分隔输出内容
	initFileSystem(); // 初始化文件系统,准备文件操作
	initCamera(); // 初始化摄像头,准备摄像头操作

	WiFi.begin(ssid, password); // 开始连接WiFi网络
	while (WiFi.status() != WL_CONNECTED) // 等待WiFi连接成功
	{
		delay(500); // 每500毫秒检查一次连接状态
		Serial.print("."); // 打印连接进度
	}
	Serial.println(""); // 打印空行,分隔输出内容
	Serial.println("WiFi connected"); // 打印WiFi连接成功信息
	startCameraServer(); // 启动摄像头服务器,准备视频流传输
	Serial.print("Camera Ready! Use 'http://"); // 打印摄像头服务器地址前缀
	Serial.print(WiFi.localIP()); // 打印ESP32-CAM的本地IP地址
	Serial.println("' to connect"); // 打印连接提示信息
}

Serial.begin(115200):初始化串口通信,设置波特率为115200。
Serial.setDebugOutput(true):启用串口调试输出。
initFileSystem():初始化文件系统,准备文件操作。
initCamera():初始化摄像头,准备摄像头操作。
WiFi.begin(ssid, password):开始连接WiFi网络。
while (WiFi.status() != WL_CONNECTED):等待WiFi连接成功,每500毫秒检查一次连接状态,并打印连接进度。
startCameraServer():启动摄像头服务器,准备视频流传输。
Serial.print(WiFi.localIP()):打印ESP32-CAM的本地IP地址,用户可以通过该地址访问摄像头视频流。

5、loop函数

void loop()
{
	unsigned long t = millis(); // 获取当前时间(毫秒)
	static unsigned long ot = 0; // 定义并初始化上一次时间变量
	unsigned long dt = t - ot; // 计算时间差
	ot = t; // 更新上一次时间变量
	processLapse(dt); // 处理时间间隔任务
}

unsigned long t = millis():获取当前时间(毫秒)。
static unsigned long ot = 0:定义并初始化上一次时间变量。
unsigned long dt = t - ot:计算时间差。
ot = t:更新上一次时间变量。
processLapse(dt):处理时间间隔任务。

6、总结
这段代码的主要功能是:
1、初始化串口通信、文件系统和摄像头。
2、连接到指定的WiFi网络。
3、启动摄像头服务器,使用户可以通过浏览器访问视频流。
4、在主循环中处理时间间隔任务。

在PC端浏览器上打开:http://192.168.28.22 (串口上给出的服务器地址)

在这里插入图片描述
画面分辨率可以调整

在这里插入图片描述
延时拍摄的照片

在这里插入图片描述
打开动态摄像流

在这里插入图片描述

在手机端浏览器上打开:http://192.168.28.22 (串口上给出的服务器地址)

在这里插入图片描述

打开动态摄像流

在这里插入图片描述

实验记录视频

  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
「雕爷编程Arduino动手做寻迹的实验可以使用TCRT5000红外反射光电开关寻迹传感器模块。这个传感器模块可以通过检测周围的光反射来进行寻迹操作。你可以将这个模块连接到mBot的主控板mCore V1.5的RJ25接口上,因为mBot的主控板兼容Arduino系统,所以你可以使用Arduino编程语言来控制mBot进行寻迹操作。请参考【Arduino】168种传感器模块系列实验中的实验六十六,该实验详细介绍了如何使用TCRT5000红外反射光电开关寻迹传感器模块进行寻迹。祝你成功完成实验!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【雕爷编程Arduino动手做(194)---makeblock mbot 主控板2](https://blog.csdn.net/weixin_41659040/article/details/132141677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [【雕爷编程Arduino动手做(65)---红外寻迹传感器](https://blog.csdn.net/weixin_41659040/article/details/106604080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值