💡 划重点

  • 硬件核心:ESP32-S3 主控,搭配电容式土壤湿度传感器、DHT22 温湿度传感器与 0.96 寸 OLED 显示屏。
  • 关键能力:本地 OLED 实时显示、MQTT 数据上报、低功耗休眠唤醒,单次成本控制在 60 元以内。
  • 技术栈:MicroPython 固件,使用 umqtt.simple 库,传感器模拟/数字混合采集,通过深度睡眠降低阳台部署功耗。
  • 产出形态:一个固定在阳台花盆旁边的独立装置,可接入 HomeAssistant 或自有 MQTT 服务器,实现干燥自动提醒。

需求洞察

目标用户是城市阳台种植爱好者,尤其是经常出差、早出晚归的上班族,或者刚入坑园艺经常忘记浇水的新手。阳台盆栽与地面花园不同,花盆土量小,水分蒸发极快,夏季可能半天就干透,而很多人直到植物叶片发蔫才意识到缺水,此时根系已经受损。

真实痛点非常直接:不是不知道要浇水,而是不知道“现在该不该浇水”。凭手指戳土、目测土色都不准确,而且无法远程感知。市面上已有成品土壤湿度计,但大多只有本地指示,没有联网与记录功能,无法在手机端主动推送提醒。

为什么值得做:这是一个典型的小成本解决高频痛点的 IoT 项目。ESP32-S3 的 Wi-Fi 能力加上 MQTT 协议,让阳台设备天然融入智能家居体系。用不到 60 元就可以获得一个可远程查看的湿度守护装置,还能为后续自动滴灌系统提供感知基础,可扩展性极强。同时,低功耗设计让它可以由电池供电,避免阳台布线难题,真正成为“贴盆即用”的独立设备。

方案设计

整体遵循感知层、控制层、执行层、联网层四层架构,以 ESP32-S3 作为中央调度核心。

感知层负责采集数据。采用电容式土壤湿度传感器,输出模拟电压至 GPIO34,ADC 读取后通过线性标定转换为相对湿度百分比。DHT22 传感器挂接在 GPIO15,采用单总线协议读取空气温度和空气湿度,用于辅助判断环境蒸发趋势。为了降低功耗,传感器仅在采集瞬间上电,其它时间切断 VCC。

控制层由 MicroPython 主循环与定时器驱动。ESP32-S3 每 30 分钟从深度睡眠中唤醒一次,完成采集、显示、上报后再次进入睡眠状态。OLED 通过 I2C 连接到 GPIO21(SDA)和 GPIO22(SCL),显示当前土壤湿度条、空气温湿度以及电池电压或供电状态,让本地不在手机旁时也能一眼判断是否需要浇水。

执行层现阶段以屏幕显示与 LED 提示为主,GPIO2 连接一颗高亮 LED,当土壤湿度低于设定阈值时快速闪烁,提醒即使不打开手机也能感知到干燥警告。未来可扩展继电器或小水泵模块,实现自动补水,本方案预留了扩展接口说明。

日志/联网层依赖 ESP32-S3 自带的 Wi-Fi 连接家用路由器,通过 MQTT 协议向代理服务器上报传感器数据。Topic 设计为 balcony/planter/humiditybalcony/planter/temperature 等,方便接入 Node-RED、HomeAssistant 或自行搭建的监控面板。同时记录最后浇水时间推算干燥速率,为智能提醒提供数据基础。

物料清单

物料名称 数量 用途 估算单价(元) 小计(元)
ESP32-S3 开发板 1 主控、Wi-Fi、蓝牙 22.0 22.0
电容式土壤湿度传感器 1 检测土壤含水量 8.0 8.0
DHT22 温湿度模块 1 空气温湿度 9.0 9.0
0.96寸 OLED 屏幕 1 本地数据显示 12.0 12.0
高亮 LED 及保护电阻 1 低湿本地告警 1.0 1.0
面包板或万能板 1 电路连接平台 3.0 3.0
杜邦线、排针 若干 接线 2.0 2.0
合计 57.0

总成本 57 元,控制在 60 元预算内,剩余 3 元可用于 3D 打印外壳或热缩管等辅料。

接线与结构

严格按照给定 GPIO 进行连接,并根据低功耗需求做了传感器供电优化。

- GPIO34 (ADC1_CH6) → 土壤湿度传感器模拟输出 A0。34 为仅输入脚,无内部上拉,适合模拟采集,且不影响睡眠时数字 I/O 状态。

- GPIO15 → DHT22 数据引脚。采用 4.7kΩ 上拉电阻至 3.3V。

- GPIO21 (SDA)、GPIO22 (SCL) → OLED I2C 接口。

- GPIO2 → LED 正极,串联 220Ω 限流电阻接地。

- GPIO16 → 传感器 VCC 供电控制。用于在非采集阶段切断传感器电源,实现低功耗。电容式湿度传感器和 DHT22 的 VCC 都接至此 GPIO16 供电,GND 共地。

调整理由:GPIO34 不能做输出,但恰好适合纯模拟输入,且唤醒后 ADC 可用。GPIO16 具备 RTC 域保持能力,在深度睡眠期间可维持低电平,切断传感器电源,避免待机消耗,符合低功耗需求。

整机结构建议使用小型防水盒,湿度传感器探针通过底部开孔伸入花盆土壤中,主板与 OLED 固定于盒盖内侧,表面贴透明亚克力保护屏幕。电池盒可外挂或内置,注意远离土壤潮湿区域。

核心代码

以下为 MicroPython 完整骨架,可直接烧录至 ESP32-S3 运行。代码包含 Wi-Fi 连接、传感器读取、OLED 显示、MQTT 上报以及深度睡眠控制。


import machine
import time
import network
import ujson
import ssd1306
import dht

# 配置参数
WIFI_SSID = 'your_ssid'
WIFI_PASS = 'your_password'
MQTT_BROKER = '192.168.1.100'
MQTT_TOPIC_HUM = b'balcony/planter/humidity'
THRESHOLD = 30  # 土壤湿度低于30%触发告警
SLEEP_MINUTES = 30

# 引脚定义
SENSOR_PWR_PIN = Pin(16, Pin.OUT)
SOIL_MOIST_PIN = ADC(Pin(34))
DHT_PIN = Pin(15)
LED_PIN = Pin(2, Pin.OUT)
I2C_SDA = Pin(21)
I2C_SCL = Pin(22)

# 上电传感器
SENSOR_PWR_PIN.on()
time.sleep(0.5)

# 读取土壤湿度(线性标定0-100%)
def read_soil():
    raw = SOIL_MOIST_PIN.read()
    raw_max = 4095  # ESP32 ADC 12位
    raw_min = 1500  # 空气干土典型值,需实际标定
    raw_limit = max(min(raw, raw_max), raw_min)
    percent = 100 - ((raw_limit - raw_min) / (raw_max - raw_min)) * 100
    return round(percent, 1)

# 读取DHT22
dht22 = dht.DHT22(DHT_PIN)
try:
    dht22.measure()
    air_temp = dht22.temperature()
    air_humi = dht22.humidity()
except:
    air_temp = 0.0
    air_humi = 0.0

soil_hum = read_soil()

# OLED 初始化与显示
i2c = SoftI2C(sda=I2C_SDA, scl=I2C_SCL)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.text("Soil: {}%".format(soil_hum), 0, 0)
oled.text("AirT:{}C".format(air_temp), 0, 16)
oled.text("AirH:{}%".format(air_humi), 0, 32)
if soil_hum < THRESHOLD:
    oled.text("DRY! Need Water", 0, 48)
else:
oled.show()

# LED 告警
if soil_hum < THRESHOLD:
    LED_PIN.on()
else:
    LED_PIN.off()

# Wi-Fi 连接与 MQTT 上报
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
timeout = 20
while not wlan.isconnected() and timeout > 0:
    time.sleep(1)
    timeout -= 1

if wlan.isconnected():
    client = MQTTClient('esp32_planter', MQTT_BROKER)
    client.connect()
    payload = ujson.dumps({'soil': soil_hum, 'air_temp': air_temp, 'air_humi': air_humi})
    client.disconnect()

# 准备深度睡眠
SENSOR_PWR_PIN.off()
LED_PIN.off()
deepsleep(SLEEP_MINUTES * 60 * 1000)

代码需依据实际土壤传感器的干湿 ADC 值调整 raw_minraw_max,可通过调试步骤完成标定。

调试步骤

  1. 固件准备:在 ESP32-S3 上烧录支持 MicroPython 的固件,并用 Thonny 或 mpremote 连接设备。
  2. 单模块验证:先让传感器不间断供电,用 print(ADC(Pin(34)).read()) 读取土壤传感器在空气中、水中及实际土壤中的原始值,记录干/湿极值更新代码中的 raw_minraw_max。DHT22 单独读取,检查示数是否正常。
  3. OLED 联调:执行 I2C 扫描确认 OLED 地址(通常 0x3C),运行显示部分,观察亮度与文本位置是否理想。
  4. MQTT 连通性:使用 MQTTX 或 mosquitto_sub 监听主题 balcony/planter/#,确认数据上报格式与频率正确。
  5. 功耗测量:在电池供电回路串联万用表电流档,记录活跃状态与深度睡眠状态电流,验证唤醒后断电逻辑是否生效。正常睡眠电流应在 μA 级别。
  6. 整机封装测试:将探头插入花盆,运行完整程序后等待休眠周期,再次唤醒时确认数据连续且在 MQTT 服务端可见。调整 LED 告警阈值至植物实际需水点。

设计图

阳台盆栽土壤湿度守护结构flow
1
感知输入
2
控制处理
3
执行反馈
4
数据上报