基于ESP8266的MicroPython水泄漏传感器与Domoticz集成指南





硬件选型

- 核心模块
- ESP8266-01 Wi-Fi模块:负责网络通信
- HT7333 3.3V低压差线性稳压器:将电池电压稳定至3.3V(输入范围3-3.6V)
- TP4056锂电充电板:支持3.7V锂电池充电
- 关键组件
- 3.7V锂离子400mAh电池:供电单元(也可替换为18650电池)
- Pololu微型电源开关:按需唤醒ESP8266以节省电量
- 辅助部件
- 双刀双掷微动开关:实现设备开关与自检功能
- 树莓派Zero:运行Domoticz服务器
- 外壳与结构
- 自定义3D打印防水外壳
- 防水接头与线缆
软件开发环境搭建

- 工具链准备
- 安装
esptool
(用于擦除模块固件及烧录) - 安装
ampy
(用于上传MicroPython脚本) - Python 3.6+环境(推荐PyCharm/Anaconda)
- 服务器端配置
- 在树莓派安装Domoticz智能家居平台
- 通过浏览器访问
http://树莓派IP:8080
完成初始化设置
Domoticz平台配置

- 硬件虚拟化
- 添加"Dummy"硬件类型
- 创建虚拟传感器(类型选择"Alert")
- 记录设备
IDX
号(用于代码调用) - 通知系统集成
- 配置Pushover/Pushbullet等第三方通知服务
- 通过API密钥实现手机实时报警
事件逻辑编程

- Domoticz事件配置
- 使用Blockly可视化编程工具
- 设置触发条件:当传感器发送警报时执行通知脚本
- ESP8266固件开发
- 使用MicroPython编写主程序(
main.py
) - 实现WiFi自动重连与JSON数据上报
- 低功耗管理模式优化(睡眠电流<100μA)
系统集成与测试




- 硬件组装
- 防水盒内集成传感器探头
- 3D打印支架固定锂电池与电路板
- 采用Pololu开关实现按需供电
- 性能验证
- 漏水检测响应时间≤10秒
- 单次报警续航5-6次(400mAh电池)
- 支持ESP-Now多节点组网升级
Domoticz设置

- 通过菜单栏的 Setup | Settings 进入设置页面,调整系统参数并保存。
- 在 Notifications 页面设置通知方式,例如Pushover、Pushsafer或Pushbullet
- 测试通知功能,确保API密钥正确。
设置硬件通信





- 在Domoticz中添加 Dummy 硬件:
- 选择 Setup | Hardware,添加Dummy硬件。
- 点击 Create Virtual Sensors,选择 Sensor Type 为 Alert。
- 记录设备的 IDX 编号,后续Python脚本中会用到。
编程ESP8266-01模块
- 擦除固件:使用esptool擦除ESP8266的工厂固件。
- 烧录固件:从MicroPython官网下载固件并烧录。
- 上传MicroPython脚本:使用Ampy上传
wifimgr.py
和main.py
。
添加设备





请记下“IDX”下方的数字。这是该设备的唯一参考标识,稍后我们在Python脚本中处理通知时会用到。在这种情况下,IDX编号为1。
通过点击左侧的绿色箭头启用设备(在我的图中是蓝色的,因为设备已启用)。
填写设备名称,然后点击“添加”。
导航到“实用工具”菜单,您的设备应该会列在那里。
现在我们需要为传感器编写“事件”程序。也就是说,我们需要告诉服务器,在收到传感器消息时该怎么做。
如果不起作用

我在各个页面尝试对设备进行编程,但没成功。下面这种方法不是我原创的,但可以用来说明问题。如果你以为勾选几个复选框就能让设备正常工作,那你就错了。我觉得这个功能可能还没完善,毕竟它是开源软件。
好吧,经过几个小时,我找到解决办法了。我们需要使用“设置”下拉菜单中的“事件”功能。点击“事件”后,你可以创建自己的事件。你可以通过编写Python或LUA代码,或者使用名为“Blockly”的工具来实现。
正确构建事件的方法

1. 通过"Events"模块执行外部文件(使用Blockly消息"Start script")
该方法在我的Windows设备上运行正常,但在树莓派的Raspbian系统上未能成功。我怀疑问题可能与权限设置有关。
以正确的方式构建活动

- 使用“发送带主题的通知”消息。它在Raspbian系统上有效。此选项支持向Pushsafe和Pushover发送通知。
- 使用第一种方法的优势在于它更灵活。你可以选择要在显示屏上显示的图标、声音等。我的“事件”如上图所示。
- 接下来,我们来编写ESP模块的程序。
编程ESP8266-01模块

让我们从刷写ESP8266模块开始。通常这些模块预装了出厂固件。可以通过所谓的AT指令与模块通信。但这类固件无法让模块作为独立控制器使用。若要将其用作独立控制器,需要擦除出厂固件并安装新固件。
为此我们将使用 esptool。首先需要将模块连接到电脑以擦除固件。这需要TTL转换器+几个额外组件,但有更简单的方法:直接在速卖通或eBay购买 USB转ESP8266 ESP-01 Wi-Fi适配器模块(含CH340G驱动)。
按图中所示将ESP8266模块插入TTL转换器,再连接电脑USB接口。
若你使用和我相同的转换器,需将开关拨到“Prog”位置。找到esptool的安装路径(通常在类似 C:\Program Files (x86)\Python36-32\Scripts
的目录)。进入该文件夹,通过命令行操作。
输入命令:
python esptool.exe --port COM5 erase_flash
(注意替换为实际端口号,我的是COM5。可通过“控制面板-系统-设备管理器”查看ESP模块占用的端口。)
安装固件(我从这里获取:),输入命令:
python esptool.exe --port COM5 --baud 460800 write_flash --flash_size=detect 0 C:\path_to_firmware\esp8266-20180511-v1.9.4.bin
现在可以开始向ESP8266上传MicroPython脚本了。我使用 Adafruit MicroPython工具(ampy),不过现在还有另一个选择 Esplorer(带图形界面的文件上传工具)。
ampy的安装教程可参考这里。操作前,将TTL转换器的开关拨到“UART”位置。需要上传的文件包括:
wifimgr.py
:Wi-Fi连接管理脚本main.py
:主程序脚本
在命令行输入:
ampy --port COM5 put C:\path_to_your_file
回车后,几秒内命令行会清空,说明文件上传成功。可通过 ampy --port COM5 ls
查看ESP模块上的文件列表。
根据经验,建议先上传其他必要文件,最后上传main.py
。因为一旦上传main.py
,ESP8266会立即重启并执行该脚本,此时若尝试上传其他文件可能会失败。但不用担心,再试一次通常就能成功(亲测有效)。
本项目所有文件可在这里获取。
连接到您的Wi-Fi网络。接收通知。




如果一切正常,通过将TTL转换器重新插入电脑的USB端口来重启模块。
ESP启动后,找到名为“Wifimanager”的新Wi-Fi网络。用电脑或手机连接该网络,然后访问IP地址192.168.4.1。在此界面可将ESP连接到本地Wi-Fi网络:选择你要使用的网络,输入密码,点击“提交”。
若一切正确,你会看到提示信息“ESP已成功连接到XXXX网络”。
现在你的ESP已接入Wi-Fi网络并准备就绪。一旦连接Wi-Fi,它会立即连接至Domoticz服务器。很快你就会在手机上收到一条通知。
你可以在“设置”/“日志”中跟踪整个过程。搞定!成功了~ 现在可以根据下方的框图,开始将所有部件组装在一起了。
框图

关于这个框图没什么好多说的,非常简单。通过S1开关控制电源通断。设备默认处于关闭状态,直到水导致“水位传感器”引脚短路。此时“Pololu板”会启动,并为电压转换器供电。这个基于HT7333芯片的电源模块会将电压转换为稳定的3.3V,为ESP8266供电。随后ESP模块启动,并向Domoticz服务器发送消息。
结果与结论






它运行良好。发送通知最多需要10秒:包括连接Wi-Fi、发送通知以及手机接收警报消息的整个过程。
我已将传感器设置为每30秒发送一次警报(检测到水时)。在水未排尽的情况下,传感器最多可发送5-6条通知。该设备还可用于检测水位。以下是我希望改进的方面:
- 提升响应速度。我计划尝试使用ESP-Now技术——该技术允许多个ESP模块直接互联。这种连接方式功耗极低且速度更快。具体思路是用一个ESP作为中枢,连接其他ESP模块。
- 增加电池电量警报功能。目前无法判断是否还有足够电量发送警报。我认为下一代传感器可能会添加一个专用按钮用于测试电量:用户按下按钮后,设备会显示当前电池电量。











