💡 划重点

  • 主控采用 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 服务器,用手机端或电脑端订阅主题,确认能收到土壤数据。第六步,用湿布包裹传感器模拟浇水,观察上报数值上升;放入干燥土壤模拟缺水,确认阈值提醒逻辑。第七步,测量整机待机与上报电流,验证浅睡策略是否达到低功耗预期。

设计图

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