利用传感器,搭建一个在房间温度过高时自动启动的冷却站
在此项目中,我将系统升级为一个自主运行的 MQTT 气候触发式冷却控制器。当室内温度超过设定阈值时,系统会自动开启冷却风扇,并通过有线以太网将环境数据和执行器状态同步至 Adafruit IO 控制面板。
该架构实现了以下功能:
- 通过内部 SPI 接口与内置 W5500 芯片通信,包含显式的硬件复位序列和链路状态验证。
- 通过 I2C 总线实时采集 AHT20 传感器提供的温度和相对湿度数据。
- 实现本地滞后环控制,通过 MOSFET 驱动器调节冷却风扇,避免在设定点附近频繁开关。
每30秒将环境数据和风扇的运行状态发送到Adafruit IO MQTT代理。
我们先从材料和接线开始。
风扇与开关模块
在以下图片中,请注意连接方式:正极线连接到V+,负极线连接到V-。这里VIN是通过USB线供电的一端,而VOUT则是开关“开启”时为风扇供电所输出的电压。
我们可以把开关模块想象成一个数字灯光开关,它能安全地控制一个大功率设备(如风扇或电机)的开关,而这个过程由一个小型低功耗的微处理器来完成。
使用跳线将红色方框标出的引脚连接到电路板上的任意GPIO引脚和GND引脚。在这个项目中,我使用PD13作为GPIO引脚。该项目中的GPIO将用于触发风扇的开关操作。
然后,使用微型USB转USB数据线将电路板连接到电脑,并通过以太网线将电路板的以太网接口插入路由器。此时,电路板上的PWR指示灯应亮起,同时以太网接口的LED灯也应亮起。
最后,将连接到开关模块的USB线插入电源。
现在我们可以进入代码了。
步骤1:离线管理认证凭据
与之前的版本一样,认证凭据仍保留在一个独立的 secrets.py 文件中,与主固件逻辑分离。将以下代码复制粘贴到一个新的代码窗口中,输入您自己的用户名和密钥,并将其保存为 MicroPython 设备上的 secrets.py 文件。
这样可以避免个人 API 令牌被纳入版本控制,同时允许主脚本引用动态数据源路径。
步骤2:固件结构解析
让我们来分析这个自主边缘控制器背后的实现细节和硬件考量。
1. 导入与设定值配置
目标输入:准备了三个信号流——温度、湿度,以及一个专用风扇信号流,用于将硬件的自主决策反馈至我们的远程仪表盘。
滞后逻辑:当风扇在单一目标(例如精确25.0°C)处启停时,由于温度在设定值附近波动,会导致继电器或MOSFET频繁跳动。引入1.0°C的死区(TEMP_FAN_ON = 25.0°C,TEMP_FAN_OFF = 24.0°C),可稳定机械和电气组件。您可以根据需要修改该数值,以设定风扇启动和关闭的温度。
快速提示
请确保已安装ahtx0和MQTT客户端库。MQTT客户端库可通过进入“工具”→“管理包”,然后搜索micropython-umqtt.simple来安装。ahtx0库可通过mip模块安装。一旦您的开发板连接到互联网(通过以太网设置),打开REPL并运行以下命令:
系统将自动下载文件并将其放置到您开发板的/lib目录中。
2. W5500 坚固启动与硬件复位
物理复位:在高阻抗初始化前,将 PD9 信号拉低 10 毫秒再拉高,可清除 W5500 内部状态寄存器,确保 MicroPython 软重启后系统能重新开始。
链路状态轮询:除了获取 DHCP 租约外,调用 nic.isconnected() 还会检查物理以太网载波脉冲是否被检测到,然后再尝试发起 TCP 事务。
3. 外设:I2C传感器和高功率执行器
I2C总线初始化:I2C(1) 通过扫描线路并锁定 AHT20,使其在地址 0x38 处工作。
执行器隔离:微控制器的 GPIO 引脚无法直接驱动直流风扇,否则会导致引脚损坏。PD13 被映射到一个外部 N 沟道 MOSFET 模块的栅极,用于隔离地切换外部 5V/12V 电源轨。在启动时将其拉低,可确保冷却元件在初始化期间不被供电。
4. MQTT 连接
与我们之前的项目不同,此客户端采用上行优先的遥测模式。它不会订阅来自执行器的开关信号;设备会本地评估其环境,并向上层传输状态更新。
5. 带滞后效应的自主控制
本地状态机:不再依赖云端自动化程序(若网络中断则会失败),而是让微控制器直接将本地指标与 TEMP_FAN_ON 和 TEMP_FAN_OFF 进行比较。
状态变化过滤:仅在发生实际状态切换时(即 fan.value() == 0 转换为 fan.value() == 1)才发布风扇状态,从而减少网络开销,并避免不必要的代理调用。
容错发布机制:将短暂的 MQTT 发布操作封装在 try/except 保护中,可防止偶发的套接字卡顿导致本地热保护回路崩溃。
6. 周期性执行循环
非阻塞定时器:time.ticks_diff() 准确地跟踪30秒的时间窗口,而不会阻塞程序执行,从而为日后添加辅助循环或按钮控制提供空间。
安全回退机制:如果在 Thonny 中通过 KeyboardInterrupt 手动停止执行,异常处理程序会显式调用 fan.off(),防止执行器在引脚状态浮空时失控运行。
最终效果
将 W55MH32L 连接到外部 MOSFET 并配置 Adafruit IO 桌面,即可将其转变为一个完全功能完善的系统。
改进
从视频中我们可以立即注意到,传感器在风扇启动前需要相当长的时间才能发布数据。
代码使用了一个30秒的重复倒计时。问题在于,程序没有在完成第一次检查后才开始倒计时,而是先启动了倒计时。由于该函数完全嵌套在倒计时内部,系统被迫等待30秒,才进行首次读取。
解决这个问题的一个方法是在进入循环之前立即运行一次。
本文编译自hackster.io





