打造低成本家庭无线传感器网络:Arduino + 树莓派 + Xively 物联网平台
项目概述
本教程将教你如何创建一个由低成本无线传感器模块组成的网络。许多现成无线模块价格昂贵,不适合多传感器阵列。虽然 Wi-Fi 和 Zigbee 模块流行且易用,但其成本使得在传感器阵列中大规模部署不切实际。然而,没有那些昂贵功能的低成本射频模块完全能胜任此类用途。Arduino 平台可轻松可靠地使用低端无线电模块通信。
硬件组装完成后,你将利用树莓派平台将数据发布到 Xively 物联网服务,随时间追踪数值并在阈值条件下触发动作。
收集组件与工具
本项目包含三部分:两个发射单元和一个接收单元。发射单元由 Arduino 开发板、传感器和射频发射器组成。接收单元由 Arduino 开发板、射频接收器、逻辑电平转换器和树莓派组成。
可用于本项目的 Arduino 兼容板种类繁多。本项目对开发板的最低要求是两个数字 GPIO 引脚和一个模拟引脚。选择符合成本和简易性需求的 Arduino 兼容板。
本教程使用一组适合面包板且易于编程的 Arduino Nano 板。不过,Arduino Pro Mini 或 Trinket 的 5V 版本也能很好工作,且价格更低。这些板子需要稍多的编程和使用经验。请明智选择。
接收端
- 树莓派 Model B 含电源、外壳、SD 卡——确保所选外壳可访问 GPIO 引脚
- 兼容树莓派的 Wi-Fi 适配器
- Arduino 开发板
- 面包板跳线
- 公对母跳线
- 逻辑电平转换器
- 434 MHz 射频接收器
- 半块面包板
发射端(两套)
- 2 × Arduino 开发板
- 2 × 温湿度传感器
- 2 × 434 MHz 射频发射器
- 2 × 半块面包板
- 2 × 面包板友好型 2.1mm DC 圆筒插座
- 2 × 9V 电源适配器(2.1mm × 5)
- 面包板跳线
工具
- 安装 Arduino IDE 的 PC/Mac
- 编程 Arduino 用的 USB 线
- USB 键盘和鼠标(二合一或配合集线器单口使用)
- 本教程关联的源代码包(放在编程工作站)
组装发射端
发射端电路相对简单。仅用一个引脚从温湿度传感器读取信息,另一个引脚将数据发送到射频发射器。面包板接线图如下。
9V 电源连接到圆筒插座,使底部电轨为 9V。Arduino 内部稳压器产生 5V 供无线电和传感器使用,即图中顶部电轨。
传感器自带 10k Ω 上拉电阻,连接数据引脚到电源,另一根线连到 GPIO D3。
请仔细遵循下方设置,并仔细核对传感器和射频模块数据手册,确保元件在面包板上正确定位,电源、地、信号引脚连接正确。源码包含的 Fritzing 图提供更多细节。
天线是板子的重要部分,因为射频模块没有内置天线。我用一根 6 英寸公对母跳线插在面包板上,效果足以覆盖我家所有房间和室外一点范围。如图注所示,若需更远距离,6.5 英寸为最佳。
关于射频使用的说明:不同国家对频率使用有不同法规。请在广播前确保合规。话说回来,这些模块信号强度勉强能穿出房间。在理想条件下,可广播至 500 英尺。
下载组件库
发射端使用两个 Arduino IDE 未捆绑的库。按下述下载并解压到你的草图目录下名为 Libraries 的子目录。
- 下载本教程的 VirtualWire 源码包,解压 wirelesstransmitter 草图文件夹到 Arduino 草图文件夹
- 在 wirelesstransmitter 文件夹创建 Libraries 文件夹
- 从项目页面下载最新版 VirtualWire 代码(撰写时为 1.23)
- 将 VirtualWire 文件夹解压到 wirelesstransmitter/Libraries/,形成 VirtualWire 子文件夹
- 从 GitHub 项目页面下载 DHT 传感器库
- 将 DHT 文件夹也解压到 Libraries 文件夹。现在 wirelesstransmitter/Libraries 下应有 DHT 和 VirtualWire 两个库文件夹。
编程 Arduino 开发板
本教程假设你有 Arduino 编程经验。如没有,官方 Arduino 网站有很好的入门指引。
- 在 Arduino IDE 中打开源码包中的 wirelesstransmitter 草图,本地保存副本
- 确保 Arduino 未通过圆筒插座供电
- 用合适的 USB 线连接开发板到编程工作站
- 在 Tools > Board 菜单设置板型为你选择的 Arduino 板
- 在 Tools > Port 菜单设置串口为连接 Arduino 时检测到的端口
- 确保 MYID 定义设为 1,TRANSPIN 和 DHTPIN 正确设为连接射频发射模块和 DHT 传感器的引脚。若按上图搭建应已设好。见下方代码示例。
- 确保 UNIT 根据偏好设为华氏度或摄氏度。
| 12345 |
#define MYID 1 // 此板的 ID 号,每块板刷入时修改
// ID 将随数据传输,以便识别发射设备
#define TRANSPIN 3 // 发射引脚
#define DHTPIN 4 // DHT 连接引脚
#define UNIT 0 // 0 华氏度,1 摄氏度
|
MYID 定义是发射端用于唯一标识自身的数字 ID。因为会在不同位置部署多个发射端,每个必须有唯一 ID。该数字在配置接收端脚本时会再次用到。
- 按 Control-R 验证代码,确保库正确包含和编译。
- 点击工具栏 Upload 按钮上传代码到开发板。
- 按 Control-Shift-M 打开串口监视器窗口。
串口监视器会复位 Arduino,屏幕应显示类似:
| 12 |
Humidity: 44.00 % Temperature: 60.80 *F
Sending Message: ID:1:TS:23143:TF:60.79:RH:44.00
|
消息由 Name:Value 对组成,接收端将解析处理。发射端按长随机间隔广播信号。传感器数值变化不大也不频繁,每分钟广播一次以上无增值。随机等待时间允许多传感器共存。
即使两发射端信号冲突丢失,随机间隔也能确保下次广播不重叠。随机种子来自未使用模拟口的 analogRead,返回随机值确保无两发射端同步。
上述输出示例代码设为华氏度。消息字符串中的 TF:60.79 表明我实验室温度刚低于 61 度。相对湿度 RH:44.00 是舒适的 44%。从凉湿环境可推断我实验室在地下室。推断正确。
发射端默认等待 2 到 5 分钟广播。若为调试想加快,修改草图末尾 delay() 值为 5000(毫秒)。正式部署时强烈建议改回并重新上传。
- 组装第二块发射板
- 修改发射端草图将 MYID 设为 2
- 上传代码到第二块板
- 按 Control-Shift-M 打开串口监视器,验证输出除传输消息以 ID:2 开头外与第一块一致
组装接收端
接收端负责通过射频接收组件接收广播消息,并通过串口线发送给树莓派。使用 Arduino 接收信号有两个重要原因。VirtualWire 代码利用 Arduino 的实时特性管理信号调制解调。
这意味着接收单元需在同一频率工作。此外,接收处理器对抖动容忍度极低,而树莓派因其抢占式非实时操作系统容易产生抖动。对比 Arduino Pro Mini 加射频接收模块的成本与可直接与树莓派通信的 Zigbee 模块,发现外挂 Arduino 依然很划算。
此时请勿将树莓派的 5V 和地线连到面包板。备好跳线,但不要同时从 USB 和树莓派给 Arduino 供电。
注意材料清单中的逻辑电平转换器与 Fritzing 库中的不完全相同,但引脚标签清晰,只是位置不同。请务必将正确导线连到实际转换器的正确引脚。
该组件用于将 Arduino 的 5V 串口信号转换为 3.3V 树莓派串口信号,避免损坏树莓派。见下图辅助理解。
更多详情:家庭无线传感器网络构建
制造工艺
- 长车道无线监测方案:树莓派集成低成本驱动道传感器
- 在 18 世纪谷物磨坊部署无线传感器网络
- 基于 Infineon 3D 磁传感器的 Arduino 无线磁通讯实验
- K30 CO₂ 传感器:室内空气质量实时监测
- DIY 数字身高仪:Arduino Nano + VL53L0X 激光测距 + OLED 显示
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- USB-BLE 无线 MIDI 适配器三种方案:让乐器无线连接 iOS 设备
- Arduino Cloud 集成:随时随地监控家中温度
- 鲁棒长距离无线传感器网络:远程数据监测的可靠之选
- 切换无线传感器网络:技术迁移的6大关键考量
- 读懂低功耗无线传感器网络:驱动高效 IoT 方案的核心引擎
- 企业部署与管理无线传感器网络指南