硬件部分其实不复杂。树莓派GPIO口接上DHT11,注意上拉电阻要接对,不然读数会飘。第一次接线下电偶忘记加消抖,数据跳得跟心电图似的。后来在信号线并了个104电容,立马稳定多了。这里给个接线参考:
注意DHT11读取有延迟,循环里最好加个2秒间隔,不然传感器会发热。我刚开始没注意这个,连续读取导致设备烫手,数据还越来越不准。
数据采集完了要解决传输问题。最开始用requests直连服务器,发现WiFi不稳定时数据会丢失。后来改用MQTT协议,这玩意儿专为物联网设计,支持断线重连和消息持久化。用paho-mqtt库三行代码就能建立连接:
消息格式建议用JSON,后期处理方便。我定义的数据结构长这样:
服务器端用Flask搭了个简单的接收接口,顺便做了个可视化看板。这里有个小技巧:用Chart.js画动态曲线图,数据更新时自动平滑过渡。前端代码就不展开了,主要说个数据处理的关键点------要对异常值做过滤。有次空调出风口正对传感器,温度读数瞬间飙升到40度,差点触发虚假警报。
存储方案选了时序数据库InfluxDB,比MySQL更适合存储传感器数据。写了个批量入库的脚本,每分钟打包一次数据,减少数据库压力:
项目上线后还加了几个实用功能:微信推送报警(用Server酱)、数据导出Excel、设备远程重启。最实用的是增加了设备心跳检测,某个传感器离线超过5分钟就发邮件通知,再也不用手动检查每个节点了。
踩过的坑给大家提个醒:室外设备要做好防水,我的第一个室外传感器淋了场雨就报废了;MQTT的QoS级别要设置正确,重要数据用QoS1保证送达;树莓派长时间运行最好配个看门狗脚本,遇到进程卡死能自动重启。
现在这套系统已经稳定运行三个月,最近正在尝试接入ESP32做子节点,用LoRa模块传输数据,解决远距离设备通信问题。物联网项目就是这样,开始觉得简单,越深入越发现学问太多。下次准备研究用机器学习预测设备故障,有同样兴趣的朋友欢迎交流。