【花雕学编程】Arduino动手做(230)--ESP32-CAM深度睡眠唤醒
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动手做(230)--ESP32-CAM深度睡眠唤醒
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
项目实验之十七:ESP32-CAM 深度睡眠触摸唤醒(这里设置T0唤醒)
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
项目实验之十七:ESP32-CAM 深度睡眠触摸唤醒(这里设置T0唤醒)
*/
#include <Arduino.h>
// 定义触摸阈值,数值越大,灵敏度更高
#define Threshold 40
// 使用RTC数据存储引导计数
RTC_DATA_ATTR int bootCount = 0;
touch_pad_t touchPin;
// 打印ESP32从睡眠中唤醒的原因
void print_wakeup_reason() {
// 获取唤醒原因
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
// 根据唤醒原因打印相应信息
switch (wakeup_reason) {
case ESP_SLEEP_WAKEUP_EXT0 :
Serial.println("使用 RTC_IO 的外部信号引起的唤醒");
break;
case ESP_SLEEP_WAKEUP_EXT1 :
Serial.println("使用 RTC_CNTL 的外部信号引起的唤醒");
break;
case ESP_SLEEP_WAKEUP_TIMER :
Serial.println("定时器引起的唤醒");
break;
case ESP_SLEEP_WAKEUP_TOUCHPAD :
Serial.println("触摸板引起的唤醒");
break;
case ESP_SLEEP_WAKEUP_ULP :
Serial.println("ULP 程序引起的唤醒");
break;
default :
Serial.printf("唤醒不是由深度睡眠引起的: %d\n", wakeup_reason);
break;
}
}
// 打印触摸板引起的唤醒原因
void print_wakeup_touchpad() {
// 获取触摸板唤醒状态
touchPin = esp_sleep_get_touchpad_wakeup_status();
// 根据触摸板唤醒状态打印相应信息
switch (touchPin) {
case 0: Serial.println("在 GPIO 0 上检测到触摸"); break;
case 1: Serial.println("在 GPIO 1 上检测到触摸"); break;
case 2: Serial.println("在 GPIO 2 上检测到触摸"); break;
case 3: Serial.println("在 GPIO 3 上检测到触摸"); break;
case 4: Serial.println("在 GPIO 4 上检测到触摸"); break;
case 5: Serial.println("在 GPIO 12 上检测到触摸"); break;
case 6: Serial.println("在 GPIO 13 上检测到触摸"); break;
case 7: Serial.println("在 GPIO 14 上检测到触摸"); break;
case 8: Serial.println("在 GPIO 15 上检测到触摸"); break;
case 9: Serial.println("在 GPIO 16 上检测到触摸"); break;
default : Serial.println("唤醒不是通过触摸板"); break;
}
}
// 占位符回调函数
void callback() {
// 这里可以添加触摸事件处理代码
}
void setup() {
// 初始化串口通信,波特率设置为115200
Serial.begin(115200);
delay(1000); // 延时以确保串口监视器打开
// 增加引导计数并打印每次重启时的计数
++bootCount;
Serial.println("Boot number: " + String(bootCount));
// 打印ESP32和触摸板的唤醒原因
print_wakeup_reason();
print_wakeup_touchpad();
// 在触摸板0 (GPIO4) 上设置中断
touchAttachInterrupt(T0, callback, Threshold);
// 将触摸板配置为唤醒源
esp_sleep_enable_touchpad_wakeup();
// 进入深度睡眠模式
Serial.println(" 要休眠了");
esp_deep_sleep_start();
Serial.println("这永远不会被打印");
delay(1000);
}
void loop() {
// 这永远不会到达
}
【花雕学编程】Arduino动手做(230)--ESP32-CAM深度睡眠唤醒
代码解读1、触摸阈值设置:通过#define Threshold 40定义触摸阈值,数值越大,触摸灵敏度越高。
2、RTC数据存储:使用RTC_DATA_ATTR关键字定义变量bootCount,用于存储ESP32的引导次数,即使在深度睡眠后也能保留数据。
3、唤醒原因打印:函数print_wakeup_reason和print_wakeup_touchpad分别打印ESP32从睡眠中唤醒的原因和触摸板引起的唤醒原因,便于调试和了解设备状态。
4、触摸中断设置:使用touchAttachInterrupt函数在触摸板0 (GPIO4) 上设置中断,当触摸事件发生时调用回调函数callback。
5、深度睡眠模式:在setup函数中配置触摸板为唤醒源,并调用esp_deep_sleep_start函数使ESP32进入深度睡眠模式,节省电能。
实验串口返回情况
【花雕学编程】Arduino动手做(230)--ESP32-CAM深度睡眠唤醒
实验场景图
页:
[1]