驴友花雕 发表于 2024-9-21 17:09:12

【花雕学编程】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 帧/秒



驴友花雕 发表于 2024-9-21 17:11:52

【花雕学编程】Arduino动手做(230)--ESP32-CAM带定时器唤醒

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
项目实验之十八:在ESP32-CAM上带定时器唤醒的简单深度睡眠(这里设置为五秒)

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十:ESP32 CAM开发板 带OV2640摄像头模块 WIFI+蓝牙模块
项目实验之十八:在ESP32-CAM上带定时器唤醒的简单深度睡眠(这里设置为五秒)
*/

#include <Arduino.h>

// 定义微秒到秒的转换因子
#define uS_TO_S_FACTOR 1000000ULL/* 微秒到秒的转换因子 */
// 定义ESP32进入休眠状态的时间(以秒为单位)
#define TIME_TO_SLEEP5

// 使用RTC数据存储引导计数
RTC_DATA_ATTR int bootCount = 0;

/*
打印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 setup() {
// 初始化串口通信,波特率设置为115200
Serial.begin(115200);
Serial.println(" ");
Serial.println("ESP32-CAM 准备就绪!");
Serial.println(" ");
delay(1000); // 延时以确保串口监视器打开

// 增加引导计数并打印每次重启时的计数
++bootCount;
Serial.println("Boot number: " + String(bootCount));

// 打印ESP32的唤醒原因
print_wakeup_reason();

/*
    首先配置唤醒源
    设置ESP32每5秒唤醒一次
*/
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("设置ESP32每 " + String(TIME_TO_SLEEP) + " 秒进入休眠");

/*
    接下来决定关闭/保持哪些外设
    默认情况下,ESP32会自动关闭唤醒源不需要的外设,
    但如果你想成为高级用户,可以自行配置。
    详细信息请参阅API文档:
    http://esp-idf.readthedocs.io/en/latest/api-reference/system/deep_sleep.html
    下面的行作为配置外设的示例,已注释。
    下面的行关闭了深度睡眠中的所有RTC外设。
*/
//esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
//Serial.println("配置所有RTC外设在睡眠中关闭");

/*
    现在我们已经设置了唤醒原因,并在需要时设置了
    深度睡眠中的外设状态,现在可以开始进入
    深度睡眠。
    如果没有提供唤醒源但启动了深度睡眠,
    它将永远睡眠,除非发生硬件重置。
*/
Serial.println("现在进入休眠");
Serial.flush();
esp_deep_sleep_start();
Serial.println("这永远不会被打印");
}

void loop() {
// 这永远不会被调用
}


驴友花雕 发表于 2024-9-21 17:14:01

【花雕学编程】Arduino动手做(230)--ESP32-CAM带定时器唤醒

程序解读
1、微秒到秒的转换因子:通过#define uS_TO_S_FACTOR 1000000ULL定义微秒到秒的转换因子,方便后续时间计算。
2、休眠时间设置:通过#define TIME_TO_SLEEP 5定义ESP32进入休眠状态的时间(以秒为单位),在代码中使用这个常量设置休眠时间。
3、RTC数据存储:使用RTC_DATA_ATTR关键字定义变量bootCount,用于存储ESP32的引导次数,即使在深度睡眠后也能保留数据。
4、唤醒原因打印:函数print_wakeup_reason根据ESP32的唤醒原因打印相应信息,便于调试和了解设备状态。
5、深度睡眠配置:在setup函数中配置ESP32的唤醒源和外设状态,并调用esp_deep_sleep_start函数使ESP32进入深度睡眠模式,节省电能。

实验串口返回情况



驴友花雕 发表于 2024-9-21 17:16:22

【花雕学编程】Arduino动手做(230)--ESP32-CAM带定时器唤醒

实验场景图


页: [1]
查看完整版本: 【花雕学编程】Arduino动手做(230)--ESP32-CAM带定时器唤醒