当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]单独的代码片段对于学习孤立概念非常有帮助,但真正的考验在于将它们整合成一个完整的嵌入式应用。在这个项目中,我将所有这些功能组合在一起,构建出一个完整的物联网边缘节点,其功能包括:

在之前的几篇文章中,我详细讲解了 W55MH32L-EVB 的基本操作:GPIO 引脚切换、引脚定义解析、串行总线(UART、SPI、I2C)测试以及内置以太网控制器的配置。

单独的代码片段对于学习孤立概念非常有帮助,但真正的考验在于将它们整合成一个完整的嵌入式应用。在这个项目中,我将所有这些功能组合在一起,构建出一个完整的物联网边缘节点,其功能包括:

- 通过内部 SPI 进行以太网连接,接入本地网络。

- 通过 I2C 从 AHT20 传感器读取环境温度和湿度。

- 订阅并发布遥测数据至 Adafruit IO 的 MQTT 阿斯伯格代理。

- 当接收到云端指令时,通过 GPIO 控制物理执行器(LED 和蜂鸣器)。

第一步:安全处理敏感信息

将凭据直接硬编码到主应用程序文件中会导致代码共享变得混乱。遵循标准的 MicroPython 规范,我创建了一个独立的 secrets.py 文件,并将其存储在开发板的文件系统中:

主脚本会导入这些凭据,以构建 Adafruit IO 的主题层级(用户名/订阅/订阅名称),同时不暴露敏感的 API 密钥。

第二步:固件分解

以下是项目各个部分的功能说明,从硬件启动到云通信。

1. 导入与配置

模块选择:机器提供原始的硬件外设(引脚、SPI、I2C),而网络接口则使用内置的W5500 MAC/PHY。umqtt.simple 提供了一个低开销的MQTT客户端,而 ahtx0 负责温度/湿度传感器的寄存器通信和校准。

主题结构:Adafruit IO 预期 MQTT 主题格式为 username/feeds/feed-name。通过字符串插值动态定义主题可保持代码简洁。

间隔时间:PUBLISH_INTERVAL_MS 设置为 30,000 毫秒(30 秒),以遵守 Adafruit IO 免费版的速率限制。

2. 通过SPI和DHCP实现以太网配置

内部SPI:板载的WIZnet芯片物理连接至SPI 2,需要PB12用于芯片选中(Chip Select),PD9用于复位。

DHCP租约:在nic.ifconfig()命令中传入“dhcp”,可让板子向本地路由器请求自动分配IP地址、子网掩码、网关和DNS服务器。

非阻塞等待:在协商过程中,nic.ifconfig()[0]返回"0.0.0.0"。使用time.ticks_add()和time.ticks_diff()可设置一个30秒的干净超时时间,避免因拔掉以太网线而使Thonny无限期卡住。

3. 初始化 I2C 和执行器 GPIO

I2C 扫描:使用 i2c.scan() 方法扫描总线,并验证传感器在标准硬件地址(0x38)处返回 ACK 响应。将该总线实例传递给 ahtx0.AHT20(i2c),可为传感器准备数据采样。

安全默认设置:先初始化 PD14(LED)和 PD15(蜂鸣器),然后立即调用 .off(),可确保执行器在微控制器完成启动期间保持静默并关闭。

4. 处理入站云消息(MQTT回调)

字节解码:MQTT数据包以原始字节数组形式到达(例如 b'ON')。调用 .decode() 方法可将其转换为 Python 字符串,便于直接进行条件匹配。

异步分发:该函数在等待订阅的频道收到与之匹配的数据包前保持休眠状态,一旦接收到来自代理端的数据包,便会立即切换对应的 GPIO 输出。

5. 连接与订阅

MQTTClient(...): 使用服务器详细信息和认证密钥创建客户端。

套接字连接:client.connect() 通过以太网直接在端口 1883 上打开底层 TCP 套接字,连接到 Adafruit IO。

消息订阅:client.subscribe() 注册接收发布到我们仪表板按钮信息流中的任何消息的意图。

6. 读取和发布遥测数据

传感器采样:驱动程序通过查询I2C寄存器,将原始值转换为经过校准的浮点数。

数据序列化:将数值四舍五入到一位小数以消除噪声,转换为字符串,并通过client.publish()发送。

7. 非阻塞事件循环

为什么要避免使用 time.sleep(30)?如果循环暂停了30秒,那么在这段时间内,板子将完全无法响应传入的MQTT仪表盘命令。而仅休眠100毫秒,可使 client.check_msg() 几乎在云按钮按下后立即作出响应。

内存管理:在MicroPython中反复创建字符串缓冲区和网络套接字,容易导致小堆内存碎片化。每次发布数据后显式调用 gc.collect() 可保持内存分配的整洁和可预测性。

优雅退出:通过在循环外添加 try/except KeyboardInterrupt 块,确保脚本终止时会发送正式的MQTT断开连接包,从而防止服务器上出现“幽灵会话”。

最终效果

配置一个Adafruit IO仪表盘,包含两个指示卡(用于显示温度和湿度)以及两个切换开关(用于控制LED和蜂鸣器),即可完成整个循环。

通过浏览器切换仪表盘开关,会在毫秒级内通过MQTT协议发送指令,翻转某个GPIO引脚;同时环境遥测数据则通过可靠的以太网连接持续稳定地回传至云端。将这些组件从底层总线路由到高层网络消息传递全部连接起来,使硬件感觉真正完整。

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭