You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:40:17