💡 划重点
- 主控采用 ESP32-S3,单板成本约三十元,总预算控制在六十元以内。
- 土壤湿度传感器模拟输出接入 GPIO34,DHT22 数据脚接 GPIO15,OLED 使用 I2C 接 GPIO21 与 GPIO22。
- 软件采用 MicroPython 快速搭建,实现本地显示、阈值判断、MQTT 上报与浅睡低功耗。
- 方案适合阳台园艺、出差人群,能远程查看盆栽湿度,减少浇水不当造成的烂根或旱死。
需求洞察
目标用户是城市阳台种植爱好者、经常出差或工作繁忙的上班族、园艺新手。真实痛点包括:土壤湿度肉眼难以判断,浇水过多容易烂根,忘记浇水导致植物干枯;市面智能花盆价格偏高且数据封闭,无法二次开发;普通湿度计只显示数值,不具备远程提醒和记录能力。
值得做的原因:ESP32-S3 成本低、算力足够,配合电容式土壤湿度传感器和 DHT22,可以稳定采集盆栽环境。通过 MQTT 上报手机或服务器,用户不在家也能收到提醒。开源方案可扩展自动浇水、多盆管理,是学习硬件编程和物联网的实用入门项目。
方案设计
感知层:电容式土壤湿度传感器输出 0~3V 模拟电压,接至 GPIO34 的 ADC 通道;DHT22 采集空气温湿度,数据脚接 GPIO15,并由 10k 电阻上拉至 3.3V。控制层:ESP32-S3 负责读取传感器数据、滤波、比较土壤湿度阈值,驱动 OLED 显示当前状态;根据设定间隔进入浅睡模式降低功耗。执行层:本方案以 OLED 屏幕和 MQTT 消息作为反馈方式,若后续扩展自动浇水,可在空闲 GPIO 上增加继电器或小水泵驱动。日志/联网层:ESP32-S3 通过 2.4G 无线网络连接 MQTT 服务器,上报土壤湿度、空气温湿度、设备编号和时间戳,便于远程查看历史曲线。
物料清单
| 物料 | 数量 | 用途 | 估算单价 | 合计 |
|---|---|---|---|---|
| ESP32-S3 开发板 | 1 | 主控、联网、采集 | 30 元 | 30 元 |
| 电容式土壤湿度传感器 | 1 | 检测土壤含水量 | 5 元 | 5 元 |
| DHT22 温湿度传感器 | 1 | 空气温湿度参考 | 8 元 | 8 元 |
| 0.96 寸 OLED 显示屏 | 1 | 本地状态显示 | 10 元 | 10 元 |
| 洞洞板与杜邦线 | 1 套 | 连接与固定 | 3 元 | 3 元 |
| 10k 电阻与辅助元件 | 若干 | 上拉与保护 | 2 元 | 2 元 |
总计 58 元,不超过 60 元目标成本。
接线与结构
土壤湿度传感器模拟输出接 GPIO34,理由是该引脚为输入专用 ADC 通道,适合读取模拟电压且不会与启动冲突。DHT22 数据脚接 GPIO15,需在数据脚与 3.3V 之间接 10k 上拉电阻。OLED 使用 I2C 总线,SDA 接 GPIO21,SCL 接 GPIO22,这是 ESP32-S3 常用 I2C 引脚,电平兼容 3.3V。所有模块共地。
结构上,将 ESP32-S3 与 OLED 固定在小外壳或洞洞板背面,传感器探头插入花盆土壤约五厘米,DHT22 放置在花盆外侧避开阳光直射。OLED 屏幕面向阳台走道,便于随时查看。若使用 USB 供电,可将线缆从花盆边缘引出。
核心代码
import time
import machine
import network
import dht
import ssd1306
# 引脚定义
SOIL_PIN = ADC(Pin(34))
SOIL_PIN.atten(ADC.ATTN_11DB)
DHT_PIN = Pin(15)
dht_sensor = dht.DHT22(DHT_PIN)
i2c = SoftI2C(sda=Pin(21), scl=Pin(22))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# 无线网络与 MQTT
WIFI_SSID = "你的无线名称"
WIFI_PASS = "你的无线密码"
MQTT_BROKER = "broker.emqx.io"
MQTT_TOPIC = "balcony/soil"
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
for _ in range(20):
if wlan.isconnected():
break
time.sleep(0.5)
return wlan.isconnected()
def read_sensors():
# 读取空气温湿度
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
# 读取土壤湿度,并映射为百分比
soil_raw = SOIL_PIN.read()
soil_percent = max(0, min(100, int((4095 - soil_raw) / 4095 * 100)))
return temp, hum, soil_percent
oled.fill(0)
oled.text("Soil: {}%".format(soil_percent), 0, 10)
oled.text("Air: {}C {}%".format(temp, hum), 0, 30)
oled.show()
payload = '{{"soil":{},"temp":{},"hum":{}}}'.format(soil_percent, temp, hum)
def main():
connect_wifi()
client = MQTTClient("esp32s3_soil", MQTT_BROKER)
client.connect()
while True:
temp, hum, soil_percent = read_sensors()
# 进入浅睡 60 秒,降低功耗
machine.deepsleep(60000)
if __name__ == "__main__":
main()
调试步骤
第一步,单独给 ESP32-S3 供电,扫描 I2C 地址确认 OLED 正常。第二步,接入 DHT22 并运行读取程序,确认温湿度数值在合理范围。第三步,将土壤湿度传感器放入干土和湿土中,观察 ADC 读数变化,标定干燥与湿润阈值。第四步,联调 OLED 显示,调整显示刷新频率。第五步,配置无线网络与 MQTT 服务器,用手机端或电脑端订阅主题,确认能收到土壤数据。第六步,用湿布包裹传感器模拟浇水,观察上报数值上升;放入干燥土壤模拟缺水,确认阈值提醒逻辑。第七步,测量整机待机与上报电流,验证浅睡策略是否达到低功耗预期。