1. 项目概述与核心价值

如果你有一个后院的小温室,或者对阳台种植感兴趣,那么你肯定遇到过这样的困扰:每天要手动检查土壤干了没、温度高了还是低了,出门几天更是提心吊胆。传统的环境监控要么依赖昂贵的专业设备,要么就是纯靠经验,数据既不连续也不精准。这正是物联网技术可以大显身手的地方。今天分享的这个项目,就是我自己动手搭建的一套低成本、高灵活性的温室传感器数据采集系统。它的核心是利用一块叫做 Wemos D1 mini Pro 的开发板,配合 MicroPython 这门对新手极其友好的编程语言,把土壤湿度、空气温湿度这些关键环境参数实时采集上来,并自动发送到家庭自动化服务器 Domoticz 里进行集中展示和记录。

这个方案的价值在于,它不是一个“黑箱”产品。从硬件选型、接线、编程到服务器配置,整个过程都是透明且可定制的。你不仅能得到一个可用的监控工具,更能彻底理解一套物联网数据采集系统是如何从零开始构建起来的。无论是想监测温室、花房,还是想学习嵌入式物联网开发,这个项目都是一个绝佳的起点。它用到的硬件成本可控,软件生态成熟,最关键的是,整个逻辑链条清晰完整,从传感器探头到云端数据看板,每一步你都能自己掌控和调整。

2. 硬件选型与系统架构解析

2.1 核心控制器:为什么是Wemos D1 mini Pro?

在众多物联网开发板中,选择 Wemos D1 mini Pro 是基于几个非常实际的考量。首先,它基于乐鑫的 ESP8266 芯片,这意味着它原生支持 Wi-Fi,这是我们实现无线数据传输的基础,省去了额外配置无线模块的麻烦。其次,“Pro”版本相较于标准版,主要增加了板载陶瓷天线和一个额外的 Flash 存储空间(通常是 4MB 或 16MB)。对于我们的项目,更大的 Flash 空间意味着可以容纳更复杂的 MicroPython 固件和更多的用户程序文件,为后续功能扩展留足了余地。最后,它的尺寸非常小巧,引脚布局与经典的 Arduino Nano 相似,有丰富的数字和模拟 IO 口,并且价格低廉,非常适合作为一次性部署在户外的设备核心。

注意:市场上存在 D1 mini 和 D1 mini Pro 的混用,购买时务必确认型号。标准 D1 mini 的 Flash 通常是 4MB,而一些 Pro 版本可能达到 16MB。固件烧录时需要区分,否则可能导致设备不断重启。

2.2 传感器阵容与选型逻辑

一套完整的温室环境监控,需要关注空气和土壤两个维度的参数。我选择了以下三种传感器,它们各自承担着不同的角色:

  1. DHT22 温湿度传感器 :负责采集空气温度和湿度。选择它是因为其精度(温度±0.5°C,湿度±2-5% RH)和性价比在业余项目中足够用,并且有成熟的 MicroPython 库支持。它使用单总线协议,只需要一个数字引脚即可通信,接线简单。
  2. DS18B20 温度传感器 :这是一个防水封装的一线式数字温度传感器。我把它埋入土壤中,专门用于测量土壤温度。为什么不用 DHT22 测土壤温度?因为 DHT22 并非为埋土设计,其塑料封装在潮湿土壤中长期使用可能损坏。DS18B20 的不锈钢探头封装则完全无此顾虑,且同样使用单总线协议,支持多个传感器挂载在同一总线上,未来扩展很方便。
  3. 土壤湿度传感器(模拟量) :这是一个简单的电阻式传感器。它的两个探针插入土壤,通过测量土壤电阻来间接反映湿度。它输出的是模拟电压信号(0-3.3V),需要连接到开发板的模拟输入引脚(A0)。它的优点是极其便宜,缺点是长期埋在地下,金属探针可能氧化导致读数漂移。但对于周期性监控和趋势观察,它完全胜任。

2.3 系统整体工作流程

整个系统的架构可以清晰地分为三层:感知层、网络层和应用层。

  • 感知层 :由 Wemos D1 mini Pro 和上述三个传感器组成。MicroPython 程序周期性地从传感器读取数据。
  • 网络层 :Wemos 通过 Wi-Fi 连接到家庭路由器,并基于 HTTP 协议,将采集到的数据以 JSON 格式发送到内网中的 Domoticz 服务器。
  • 应用层 :Domoticz 服务器运行在树莓派 Zero 上。它接收数据,将其存储到数据库中,并通过 Web 界面以图表、仪表盘的形式可视化展示。你可以在任何能访问家庭内网的设备(手机、电脑)上查看温室实时状态和历史曲线。

这个架构的优点是解耦。数据采集端(Wemos)只负责采集和发送,逻辑简单稳定;数据展示和存储由专业的家庭自动化软件 Domoticz 负责,功能强大且可靠。即使 Domoticz 暂时不可用,Wemos 端也可以加入简单的重试和缓存机制(本项目基础版未包含,但易于扩展)。

3. 开发环境搭建与固件烧录

3.1 MicroPython 固件获取与烧录工具

MicroPython 是运行在微控制器上的 Python 3 精简实现。首先,我们需要为 ESP8266 芯片下载合适的固件。前往 MicroPython 官网的下载页面,找到针对 ESP8266 的固件文件(通常是一个 .bin 文件)。烧录工具我们使用乐鑫官方的 esptool.py ,它是一个 Python 脚本,可以通过 pip 安装: pip install esptool

将 Wemos D1 mini Pro 通过 Micro-USB 数据线连接到电脑。在 Windows 上,你可以在设备管理器中查看它对应的 COM 端口号(例如 COM5);在 Linux 或 macOS 上,它通常是 /dev/ttyUSB0 之类的设备。

3.2 关键步骤:针对 D1 mini Pro 的正确烧录命令

这是第一个容易踩坑的地方。对于大多数 ESP8266 开发板,通用的擦除和烧录命令如下:

esptool.py --port COM5 erase_flash
esptool.py --port COM5 --baud 460800 write_flash --flash_size=detect 0 firmware.bin

但是,对于 Wemos D1 mini Pro ,使用 --flash_size=detect 参数可能会导致固件烧录后设备不断重启。这是因为工具未能正确检测到 Pro 版本特定的 Flash 大小和布局。

经过实测,最稳定的方法是 显式指定 Flash 大小 。假设你的固件文件是 esp8266-20220618-v1.19.1.bin ,正确的命令应该是:

esptool.py --port COM5 erase_flash
esptool.py --port COM5 --baud 460800 write_flash -fs 4MB 0 esp8266-20220618-v1.19.1.bin

这里 -fs 4MB 明确告诉工具 Flash 容量为 4MB。如果你的 Pro 版是 16MB Flash,则相应改为 -fs 16MB 。执行成功后,打开串口终端工具(如 Putty、Arduino IDE 串口监视器或 screen / picocom ),设置波特率为 115200,重启板子,你应该能看到 MicroPython 的 REPL 提示符 >>> ,这表示固件烧录成功。

3.3 驱动文件上传与常用工具

固件只提供了 Python 运行环境,我们还需要将传感器驱动库和主程序上传到板子的文件系统中。这里推荐使用 ampy 工具( pip install adafruit-ampy )。假设我们已经准备好了以下文件:

  • ssd1306.py : OLED 显示屏的 I2C 驱动库。
  • dht.py : DHT22 传感器驱动库。
  • onewire.py ds18x20.py : DS18B20 传感器驱动库。
  • main.py : 我们的主程序(需要稍后配置)。

使用 ampy 上传驱动文件(注意:不要先上传未配置的 main.py ,因为它会开机自启动):

ampy --port COM5 put ssd1306.py
ampy --port COM5 put dht.py
# ... 上传其他驱动文件

上传后,可以在 REPL 中使用 import os; os.listdir() 命令来确认文件是否已在设备中。

4. 硬件连接与电路细节

4.1 电源方案与引脚分配规划

Wemos D1 mini Pro 的工作电压��� 3.3V,所有传感器的逻辑电平都必须匹配。板子可以通过 Micro-USB 口供电(5V),也可以使用其上的 5V GND 引脚接入外部 5V 电源。板载稳压器会将其降至 3.3V 供芯片和 GPIO 使用。

在进行物理连接前,务必规划好引脚,避免冲突。Wemos D1 mini Pro 的引脚标注(如 D1, D2)对应的是 ESP8266 的内部 GPIO 编号,而非物理引脚顺序。我们需要查阅其引脚图来正确连接。

以下是详细的接线方案,我强烈建议先在面包板上测试通过,再进行焊接或使用杜邦线永久连接:

1. 土壤湿度传感器(模拟)

  • 红色线 (VCC) -> 连接到 Wemos 的 3.3V 引脚。
  • 黑色线 (GND) -> 连接到 Wemos 的 GND 引脚。
  • 黄色线 (信号/SIG) -> 连接到 Wemos 的 A0 引脚(这是板上唯一的模拟输入引脚)。

2. OLED 显示屏 (I2C 接口,例如 0.96寸 SSD1306)

  • GND -> Wemos 的 GND
  • VCC -> Wemos 的 5V 3.3V (注意:有些 OLED 模块需要 5V 才能正常点亮背光,使用 3.3V 可能亮度不足,请根据模块规格书决定)。
  • SCL (时钟线) -> Wemos 的 D1 引脚(GPIO5,这是 MicroPython 默认的 I2C SCL 引脚)。
  • SDA (数据线) -> Wemos 的 D2 引脚(GPIO4,这是 MicroPython 默认的 I2C SDA 引脚)。

3. DS18B20 土壤温度传感器 (单总线协议)

  • 红色线 (VDD) -> Wemos 的 3.3V
  • 黑色线 (GND) -> Wemos 的 GND
  • 白色/黄色线 (DQ/数据) -> Wemos 的 D6 引脚(GPIO12)。
  • 关键一步: 在数据线(D6)和 3.3V 之间,必须连接一个 4.7kΩ 的上拉电阻 。这是单总线协议的要求,用于在总线空闲时将其拉至高电平,确保通信稳定。没有这个电阻,传感器很可能无法被识别。

4. DHT22 空气温湿度传感器

  • 引脚1 (VCC) -> Wemos 的 3.3V (最左边引脚,当传感器正面朝你,网格一面朝外时)。
  • 引脚4 (GND) -> Wemos 的 GND (最右边引脚)。
  • 引脚2 (DATA) -> Wemos 的 D3 引脚(GPIO0)。注意,DHT22 也需要一个上拉电阻,但幸运的是,许多模块(如图中所示)已经将电阻集成在电路板上了。如果你购买的是只有三个引脚的模块版,通常已包含上拉电阻;如果是裸传感器,则需要在数据线和 3.3V 间加一个 10kΩ 电阻。

4.2 连接检查与常见硬件问题

连接完成后,不要急于上电编程。先做一次彻底的目视检查:

  • 短路检查 :确保任何电源线(3.3V, 5V)没有直接碰到 GND 或其他数据线。
  • 电平匹配 :确认所有传感器的逻辑电平是 3.3V。将 5V 传感器直接接到 ESP8266 的 GPIO 会损坏芯片。
  • 上拉电阻 :DS18B20 的 4.7kΩ 上拉电阻是否已正确连接?这是最容易被忽略的导致传感器无响应的问题。
  • 接触不良 :杜邦线连接是否牢固?在移动中很容易松脱。

实操心得:在将整套系统装入防水盒之前,务必在桌面上完成所有功能的测试。一旦封装,再排查硬件问题将极其困难。我习惯在面包板阶段,用彩色标签纸标记每一根线对应的传感器和引脚,并在代码中用字典或常量定义这些引脚号,做到硬件连接与软件定义一一对应,避免后期混淆。

5. Domoticz服务器配置与虚拟传感器创建

5.1 Domoticz的安装与基础设置

Domoticz 是一个轻量级的开源家庭自动化服务器,它支持多种硬件和协议,且 Web 界面友好。在树莓派 Zero 上安装 Domoticz 非常简单,通常通过其官方脚本或包管理器即可完成。安装并启动后,通过同一局域网内电脑的浏览器访问 http://<树莓派IP地址>:8080 就能进入管理界面。

首先,我们需要创建一个“虚拟硬件”来代表我们的 Wemos 传感器盒子。因为 Wemos 是通过 HTTP API 向 Domoticz 发送数据,对于 Domoticz 来说,这个数据源就像一个虚拟设备。

  1. 进入 Setup -> Hardware
  2. 在页面底部“Create Virtual Sensors”旁边,从下拉菜单中选择 Dummy
  3. 给它起一个名字,比如 “Greenhouse Sensor Box”,类型保持 “None”。
  4. 点击 “Add” 按钮。这样就在硬件列表中创建了一个虚拟的容器。

5.2 创建虚拟传感器并获取关键IDX

接下来,我们需要在这个“虚拟硬件”下创建具体的传感器设备,用来接收温度、湿度等数据。

  1. 在刚才创建的 “Greenhouse Sensor Box” 硬件行,点击右侧的 Create Virtual Sensors 按钮。
  2. 在弹出的窗口中,我们需要为每个物理传感器创建一个对应的虚拟传感器。
    • 传感器类型 :选择 “Temperature”。
    • 传感器名称 :输入 “Air Temperature”。
    • 点击 “Create Sensor”。
  3. 重复此过程,创建以下传感器:
    • 类型 “Humidity”, 名称 “Air Humidity”
    • 类型 “Temperature”, 名称 “Soil Temperature”
    • 类型 “Custom Sensor”, 名称 “Soil Moisture”。对于自定义传感器,我们需要指定其单位,在下拉菜单中选择 “%” 或 “moisture”(取决于你想如何显示)。
  4. 创建完成后,进入 Setup -> Devices 。在“All”或对应的硬件标签页下,你应该能看到刚刚创建的四个传感器。这里有一个至关重要的信息: IDX 。每个设备都有一个唯一的 IDX 编号。记录下这四个传感器的 IDX,我们稍后需要将它们填入 Wemos 的 main.py 脚本中。

例如,你可能会得到类似这样的 IDX 列表:

  • Air Temperature: 101
  • Air Humidity: 102
  • Soil Temperature: 103
  • Soil Moisture: 104

此外,你还需要记录下运行 Domoticz 的树莓派的 本地 IP 地址 ,例如 192.168.1.100 。Domoticz 默认的 HTTP API 端口是 8080

6. MicroPython主程序解析与编写

6.1 程序结构设计与核心逻辑

主程序 main.py 是整套系统的大脑,它需要完成以下任务:初始化硬件、连接Wi-Fi、读取传感器数据、处理数据、通过HTTP发送给Domoticz,并处理异常。程序应该具备健壮性,即使网络暂时中断或某个传感器故障,也不应导致系统崩溃,而应尝试恢复或重启。

一个典型的程序结构如下:

  1. 导入模块 :引入必要的 MicroPython 内置模块和传感器驱动。
  2. 引脚与常量定义 :集中定义所有传感器连接的 GPIO 引脚、Wi-Fi 凭据、Domoticz 服务器地址和设备 IDX。
  3. 硬件初始化函数 :初始化 I2C(OLED)、单总线(DS18B20)、DHT22 和 ADC(土壤湿度)。
  4. Wi-Fi连接函数 :实现连接本地网络,并加入连接失败时的备用配网模式(如 Web 配网)。
  5. 数据读取函数 :分别从各个传感器读取原始数据,并进行必要的转换(如模拟电压转百分比)。
  6. 数据发送函数 :将数据格式化为 Domoticz API 要求的 URL,并使用 urequests socket 模块发送 HTTP GET 请求。
  7. 主循环 :以固定的时间间隔(例如每30秒或每分钟)执行“读取->发送”流程,并包含异常捕获和错误处理。

6.2 关键代码段与Domoticz API调用

以下是 main.py 中几个关键部分的代码示例和解释。你需要根据之前记录的 IDX 和 IP 修改相关配置。

配置部分:

# config.py - 或直接写在 main.py 开头
WIFI_SSID = '你的Wi-Fi名称'
WIFI_PASSWORD = '你的Wi-Fi密码'
DOMOTICZ_IP = '192.168.1.100' # 你的Domoticz服务器IP
DOMOTICZ_PORT = 8080

# 传感器IDX (根据你在Domoticz中创建的设备填写)
IDX_AIR_TEMP = 101
IDX_AIR_HUMI = 102
IDX_SOIL_TEMP = 103
IDX_SOIL_MOIST = 104

# 硬件引脚定义
PIN_DHT = 0      # GPIO0, 对应板载标记 D3
PIN_DS18B20 = 12 # GPIO12, 对应板载标记 D6
PIN_SOIL_ADC = 0 # 模拟引脚 A0

数据发送函数: Domoticz 提供了一个简单的 HTTP JSON API 来更新设备数据。对于温度设备,URL 格式如下: http://<IP:PORT>/json.htm?type=command&param=udevice&idx=<IDX>&nvalue=0&svalue=<温度值> 对于湿度设备,格式略有不同, svalue 字段包含湿度和舒适度状态等。 对于自定义传感器(土壤湿度),格式为: ...&svalue=<数值>

在 MicroPython 中,我们可以使用 urequests 库来发送请求:

import urequests
import network

def send_to_domoticz(idx, value, sensor_type='temp'):
    base_url = 'http://{}:{}/json.htm'.format(DOMOTICZ_IP, DOMOTICZ_PORT)
    if sensor_type == 'temp':
        url = '{}?type=command&param=udevice&idx={}&nvalue=0&svalue={}'.format(base_url, idx, value)
    elif sensor_type == 'humidity':
        # 湿度值,舒适度状态(0-3),湿度状态文字(可空)
        url = '{}?type=command&param=udevice&idx={}&nvalue=0&svalue={};{};{}'.format(base_url, idx, value, 0, '')
    elif sensor_type == 'custom':
        url = '{}?type=command&param=udevice&idx={}&nvalue=0&svalue={}'.format(base_url, idx, value)
    try:
        response = urequests.get(url)
        print('Sent to idx {}: {}, Response: {}'.format(idx, value, response.text))
        response.close() # 重要:关闭响应,释放资源
    except Exception as e:
        print('Failed to send data:', e)

土壤湿度模拟值转换: 土壤湿度传感器输出的是 0-3.3V 的模拟电压,对应 ADC 读取的原始值范围是 0-1023(10位精度)。完全干燥时电压最高(ADC值小),完全湿润时电压最低(ADC值大)。需要做一个简单的映射:

def read_soil_moisture():
    adc_value = machine.ADC(PIN_SOIL_ADC).read() # 读取原始ADC值
    # 校准:将ADC值转换为百分比。这两个阈值需要根据你的传感器和土壤实测确定。
    dry_value = 650  # 在空气中完全干燥时读取的值
    wet_value = 300  # 传感器探针完全浸入水中时读取的值
    # 将ADC值映射到0-100%的湿度,并限制范围
    moisture_percent = 100 - int((adc_value - wet_value) / (dry_value - wet_value) * 100)
    moisture_percent = max(0, min(100, moisture_percent)) # 限制在0-100之间
    return moisture_percent

6.3 健壮性设计:Wi-Fi连接管理与错误处理

物联网设备最怕的就是网络不稳定。我们的代码必须能处理 Wi-Fi 断开重连的情况。一个简单的策略是:在启动时尝试连接预设的 Wi-Fi,如果失败(例如超时 10 秒),则启动一个“配网模式”,比如开启一个 AP(访问点),让用户可以通过网页配置新的 Wi-Fi 凭据。有许多现成的 MicroPython 库可以实现此功能,例如 wifimgr

在主循环中,每次发送数据前检查网络连接状态。如果断开,则尝试重连。对于传感器读取失败,应使用 try...except 捕获异常,打印错误日志,并跳过该次数据发送,而不是让整个程序崩溃。最后,可以在主循环外层包裹一个大的 try...except ,如果发生不可预知的错误,记录日志并执行软重启 machine.reset() ,让设备自动恢复。

7. 系统集成、测试与部署

7.1 完整功能测试流程

在将所有代码上传到 Wemos 并放入温室之前,必须在桌面完成端到端的全链路测试:

  1. 硬件通电测试 :连接 USB 供电,观察板载 LED 和 OLED 屏幕(如果接了)是否有显示。使用串口工具查看启动日志,确认无报错。
  2. Wi-Fi连接测试 :在代码中确保打印连接状态。查看串口日志,确认已成功获取 IP 地址。
  3. 传感器读取测试 :在 REPL 中手动导入你的模块,调用数据读取函数,查看返回值是否合理。例如,用手握住 DHT22,看温度是否上升;将土壤传感器探针触碰湿毛巾,看 ADC 值是否变化。
  4. Domoticz API 测试 :临时修改代码,只发送一次测试数据到 Domoticz。刷新 Domoticz 的 Devices 页面,查看对应传感器的“最后更新”时间戳和数值是否变化。
  5. 循环稳定性测试 :让程序在主循环中运行至少半小时,观察串口日志是否有异常抛出,Domoticz 上的数据是否在持续、稳定地更新。

7.2 防水封装与户外部署要点

测试无误后,就可以考虑户外部署了。选择一个大小合适的防水接线盒。部署时需注意:

  • 电源 :如果使用 USB 供电,需要将 USB 线引出盒子,并做好出口的防水密封(使用防水电缆接头)。更好的方案是使用 5V 直流电源适配器,直接接入 Wemos 的 5V 和 GND 引脚。
  • 传感器引出 :在盒子上开孔,用防水接头将 DHT22、DS18B20 和土壤湿度传感器的线缆引出。DS18B20 和土壤湿度探头需要埋入土壤不同深度的位置(例如,DS18B20 在植物根区,土壤湿度传感器在旁边)。
  • 散热与透气 :DHT22 需要测量空气温湿度,因此其探头部分必须暴露在盒子外的空气中,但电路部分应做好防潮处理。可以在盒子侧面开一个小百叶窗。
  • 天线位置 :确保 Wemos 的陶瓷天线区域不要被金属盒子完全屏蔽,最好靠近塑料外壳部分,以保证 Wi-Fi 信号强度。

7.3 数据可视化与自动化联动初探

数据成功进入 Domoticz 后,你就可以享受到集中监控的便利了。在 Domoticz 的 Dashboard 上,可以将这四个传感器添加为“收藏”,这样一打开页面就能看到实时数据。点击每个传感器,可以查看其历史数据图表,非常直观。

更进一步,Domoticz 的强大之处在于其自动化规则(“场景”和“脚本”)。你可以基于采集的数据创建自动化逻辑,例如:

  • 高温报警 :当空气温度超过 35°C 时,向你的手机发送一条通知(Domoticz 支持 Telegram、邮件等通知方式)。
  • 自动通风逻辑 :虽然本项目不直接控制设备,但你可以创建一条规则:“如果土壤湿度低于 20% 空气温度低于 30°C,则触发一个‘需要浇水’的虚拟开关”。这个虚拟开关可以关联到其他真正的执行设备,为未来的自动灌溉系统打下基础。

8. 常见问题排查与优化建议

在实际搭建和运行过程中,你几乎一定会遇到下面这些问题。这里我把它们和解决方案整理出来,希望能帮你节省大量排查时间。

8.1 传感器读数异常或无数据

  • 问题 :Domoticz 上某个传感器一直显示为 0 或“超时”。
  • 排查步骤
    1. 检查串口日志 :这是最重要的信息源。查看 Wemos 启动和运行过程中打印的日志,看是否有明确的错误信息,如 “DHT read error”, “DS18B20 not found”, “ADC read failed”。
    2. 检查硬件连接 :首先确认电源(3.3V, GND)是否稳定接通。用万用表测量传感器 VCC 和 GND 之间的电压是否为 3.3V。然后检查信号线是否连接到了正确的 GPIO,并且接触良好。
    3. 检查上拉电阻 :对于 DS18B20,确认 4.7kΩ 上拉电阻是否已正确连接在数据线和 3.3V 之间。对于 DHT22,如果是裸传感器,也需要 10kΩ 上拉电阻。
    4. 检查代码引脚定义 :确认代码中 PIN_DHT PIN_DS18B20 等常量的值,与你实际的物理连接完全一致。MicroPython 使用 GPIO 编号,而非板载的 “Dx” 标记。
    5. 单独测试传感器 :在 REPL 中,单独导入驱动库,并尝试读取传感器数据,排除其他代码的干扰。

8.2 Wi-Fi连接不稳定或Domoticz通信失败

  • 问题 :设备频繁离线,或数据发送经常失败。
  • 排查与优化
    1. 信号强度 :温室可能离路由器较远或有遮挡。在 Wemos 代码中,可以加入 import network; sta = network.WLAN(network.STA_IF); print('RSSI:', sta.status('rssi')) 来打印信号强度。如果 RSSI 低于 -70,考虑增加 Wi-Fi 中继器,或将设备部署在信号更好的位置。
    2. 静态IP分配 :在路由器中为 Wemos 的 MAC 地址分配固定的 IP 地址,避免 IP 变化导致 Domoticz 连接问题(虽然我们的代码用的是域名或固定IP,但路由器分配固定IP更稳妥)。
    3. 增加重试机制 :在数据发送函数 send_to_domoticz 中,加入重试逻辑。例如,如果第一次请求失败,等待 2 秒后重试,最多重试 3 次。
    4. 心跳与看门狗 :在 MicroPython 中启用硬件看门狗( from machine import WDT; wdt = WDT(timeout=8000) ),并在主循环中定期喂狗( wdt.feed() )。这可以在程序死锁时自动重启设备。同时,可以在 OLED 上显示“最后成功通信时间”,方便现场诊断。

8.3 土壤湿度传感器读数不准与校准

  • 问题 :土壤湿度百分比显示不准确,或者在空气中不是 0%,在水中不是 100%。
  • 解决方案 :这是电阻式土壤湿度传感器的通病,需要进行校准。
    1. 干值校准 :将传感器探针完全置于空气中(不要接触任何物体),读取此时的 ADC 原始值,作为代码中的 dry_value
    2. 湿值校准 :将传感器探针完全浸入一杯清水中,读取此时的 ADC 原始值,作为代码中的 wet_value
    3. 土壤校准(进阶) :如果你想更精确,可以取一份完全干燥的土壤样本和一份加水至饱和的土壤样本,分别插入传感器,记录对应的 ADC 值,用这两个值作为干湿阈值。不同土质的导电性差异很大,校准是获得有意义数据的关键。

8.4 电源管理与续航优化

  • 场景 :如果你希望使用电池供电,或者遭遇不稳定的市电。
  • 优化建议
    1. 降低采样频率 :温室环境变化较慢,将数据发送间隔从 30 秒增加到 5 分钟或 10 分钟,能大幅降低功耗。
    2. 使用深度睡眠 :ESP8266 支持深度睡眠模式。可以在每次采集并发送数据后,让芯片进入深度睡眠,定时唤醒。这需要将 GPIO16 连接到 RST 引脚,并使用 machine.deepsleep(睡眠时间_毫秒) 。在这种模式下,电流消耗可降至微安级别,仅靠电池即可运行数月。但注意,深度睡眠时所有网络连接会断开,唤醒后需要重新连接 Wi-Fi。
    3. 电源隔离 :为模拟传感器(土壤湿度)和数字传感器使用独立的 3.3V 线性稳压器,或者至少在电源入口处增加大容量电容(如 100µF)滤波,可以减少传感器对主控芯片的电源干扰,提高稳定性。

这个项目从一块小小的开发板开始,最终构建起一个能真实运行、提供价值的温室监控系统。整个过程涉及了硬件选型、电路连接、嵌入式编程、网络通信和服务器配置等多个环节,是一个典型的物联网全栈小实践。我最深的体会是, 调试和日志是关键 。在代码中尽可能多地添加有意义的打印信息,并利用好串口终端这个窗口,它能帮你快速定位绝大多数问题。当看到 Domoticz 的图表上第一次出现那条由你的设备上传的数据曲线时,那种成就感是无可替代的。你可以在此基础上继续扩展,比如增加光照传感器、二氧化碳传感器,甚至连接继电器模块来控制补光灯或通风扇,真正迈向全自动的智慧温室。

更多推荐