如何实现ESP32在土壤湿度低于阈值时从深度睡眠唤醒?
针对ESP32深度睡眠+土壤湿度传感器唤醒的解决方案
核心问题说明
ESP32进入深度睡眠后,除了唤醒相关的核心电路和指定引脚,其余IO、外设供电都会被切断。如果你的电容式土壤湿度传感器是从ESP32的3.3V/GND取电,那么深度睡眠期间传感器会断电,无法输出数值,自然没法触发唤醒。
可行解决方案
方案1:外部比较电路+外部中断唤醒
适合低功耗要求高的场景,原理是用独立电路完成湿度阈值判断,触发ESP32唤醒:
- 给电容式土壤湿度传感器提供独立电源(或从ESP32的VIN引脚取电,只要外部电源持续供电)
- 用比较器芯片(如LM393),将传感器输出的模拟电压与设定阈值的参考电压(通过分压电阻调整)对比
- 当土壤湿度低于阈值时,传感器输出电压变化,比较器输出电平翻转,触发ESP32的外部中断唤醒引脚(如GPIO0、GPIO2等支持ext0/ext1唤醒的引脚)
- ESP32端只需配置外部中断唤醒源,深度睡眠时仅监测唤醒引脚的电平变化,功耗极低
方案2:定时器周期性唤醒+采样判断
无需额外硬件,适合对功耗要求不是极端严格的场景:
- 配置ESP32定时器唤醒,设置合适的唤醒间隔(比如30分钟、1小时,根据需求调整)
- 每次唤醒后,ESP32快速启动,采样土壤湿度数值
- 若湿度低于阈值,执行后续操作(如启动灌溉);若未达到阈值,立即回到深度睡眠
- 优点是无需额外电路,缺点是存在周期性唤醒的微小功耗,但ESP32深度睡眠电流仅几微安,整体功耗仍可控
代码示例
定时器唤醒采样代码
#include "esp_sleep.h" // 替换为你的传感器引脚 #define SOIL_MOISTURE_PIN 34 // 根据传感器校准值调整阈值 #define MOISTURE_THRESHOLD 300 void setup() { Serial.begin(115200); delay(1000); // 等待串口初始化 // 采样土壤湿度 int moisture_val = analogRead(SOIL_MOISTURE_PIN); Serial.print("当前湿度值: "); Serial.println(moisture_val); if (moisture_val < MOISTURE_THRESHOLD) { Serial.println("湿度低于阈值,执行灌溉或其他操作..."); // 此处添加你的业务代码,如控制水泵、发送通知等 } else { // 设置30分钟后唤醒(单位:微秒) esp_sleep_enable_timer_wakeup(30LL * 60 * 1000000); Serial.println("湿度正常,进入深度睡眠..."); esp_deep_sleep_start(); } } void loop() { // 深度睡眠唤醒后会重新执行setup,loop不会被触发 }
外部中断唤醒代码
#include "esp_sleep.h" // 替换为你的唤醒引脚(需支持ext0唤醒) #define WAKEUP_GPIO_PIN GPIO_NUM_0 void setup() { Serial.begin(115200); delay(1000); // 配置低电平唤醒(根据比较器输出逻辑调整,1为高电平唤醒) esp_sleep_enable_ext0_wakeup(WAKEUP_GPIO_PIN, 0); Serial.println("进入深度睡眠,等待湿度低于阈值唤醒..."); esp_deep_sleep_start(); } void loop() { // 唤醒后执行操作 Serial.println("已唤醒,湿度低于阈值,执行后续操作..."); // 此处可添加湿度二次确认、控制外设等代码 }
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

