基于树莓派与Node-RED的本地化物联网环境监测系统搭建指南

📅 2026/6/17 16:03:41 👤 管理员 👁 次浏览
基于树莓派与Node-RED的本地化物联网环境监测系统搭建指南
1. 项目概述与核心思路最近在折腾家里的环境监测想搞几个能随手放、不用插电的温度湿度传感器数据最好能在一个统一的界面上实时看到。市面上成品的智能传感器要么太贵要么得依赖厂商的云服务数据安全和后续扩展性都让人不太放心。琢磨了一圈发现用 Raspberry Pi 配合 Node-RED 自己搭一套本地化的系统是个既灵活又实惠的方案。这个方案的核心就是把数据采集、传输和展示这几个环节用几个成熟的开源工具串起来全程不需要写一行代码特别适合喜欢动手但又不想深陷编程泥潭的玩家。整个系统的骨架是这样的我们用 Cricket 这类低功耗 WiFi 模块做成传感器节点它负责采集温度数据然后通过 WiFi 网络使用 MQTT 协议把数据发出去。Raspberry Pi 在家庭网络里扮演两个角色一是作为 MQTT 消息代理Broker负责接收和转发这些消息二是运行 Node-RED它既监听 MQTT 消息又能用内置的 Dashboard 组件把数据变成漂亮的图表和仪表盘通过网页展示出来。这样一来你从传感器上电开始到在手机浏览器里看到实时曲线整个链路就通了。它的价值在于你完全掌控数据和设备后续想增加传感器、联动其他智能设备或者定制复杂的自动化逻辑都有很高的自由度。2. 硬件准备与选型考量2.1 核心硬件解析为什么是它们Raspberry Pi树莓派选择它作为中心网关几乎是 Maker 圈子的标准答案了。原因有几个首先是功耗和体积一个 Pi 3 或 Pi 4 的功耗通常不到10瓦可以7x24小时开机巴掌大的尺寸也方便放在路由器旁边。其次是强大的社区和软件生态像 Node-RED、MosquittoMQTT Broker这类软件都有官方维护的一键安装脚本几乎不会遇到解决不了的依赖问题。最后是接口丰富GPIO、USB、以太网口一应俱全万一将来想接个 Zigbee 或 Z-Wave 的 USB 网关做扩展也毫无压力。对于这个项目Pi 3 的性能已经绰绰有余如果手头有 Pi 4 或更新的型号当然更好。Cricket WiFi 模块这是整个系统的“触角”。选择它而不是常见的 ESP8266如 NodeMCU或 ESP32主要看中其极低功耗和“配置即用”的特性。Cricket 模块专为电池供电的物联网传感器设计它内置了温度传感器并且通过一个简单的网页进行配置设置好 WiFi 密码、服务器地址和发送间隔后它就会自动按照心跳周期工作、睡眠两节 AAA 电池能撑好几个月。如果你手头只有 ESP8266 开发板当然也可以实现类似功能但你需要自己编写 Arduino 代码来实现深度睡眠和 MQTT 发布对于完全不想碰代码的朋友来说门槛会高一些。Cricket 提供了一个更“傻瓜式”的起点。电池供电方案项目里用的是 2xAAA 电池盒。这里有个细节AAA 电池的电压是 1.5V两节串联是 3V。Cricket 模块的工作电压范围通常是 2.0V 到 3.6V所以 3V 供电是合适的。但要注意碱性电池在电量耗尽时电压会缓慢下降而可充电的镍氢电池Ni-MH满电电压约 1.2V两节只有 2.4V虽然也在工作范围内但初始电压就偏低可能影响无线信号强度和使用寿命。我个人更推荐使用两节优质的碱性电池或者专门为低功耗设备设计的 3V 锂亚电池CR123A 等后者容量更大电压平台更平稳。注意焊接电池盒引线到 Cricket 模块时务必分清正负极。通常 Cricket 板子上会标有“”和“-”或“VCC”和“GND”。接反了会损坏模块。如果对自己的焊接技术没信心可以使用带插头的电池盒和杜邦线但长期使用可能接触不良。2.2 软件环境与网络前提在动手拼装硬件之前我们需要确保软件基础已经打好。这个项目依赖于三个核心软件在 Raspberry Pi 上协同工作操作系统官方 Raspberry Pi OS以前叫 Raspbian。建议使用 Lite 版本无桌面环境因为我们的 Pi 最终是作为服务器“无头”运行的这样可以节省资源。通过 Raspberry Pi Imager 工具烧录到 MicroSD 卡是最简单的方式记得在烧录前就通过 Imager 的高级设置预配好 WiFi 和开启 SSH这样一开机就能远程连接。MQTT 代理Broker我们选用Mosquitto。它是一个轻量级、开源且广泛支持的 MQTT 消息代理。你可以把它理解为一个“邮局”或者“消息中转站”。所有传感器发布者都把数据“寄”到它这里而 Node-RED订阅者则告诉它“我想收某某地址的信”Mosquitto 就会负责把对应的数据包准确送达。它的安装和基本配置非常简单。Node-RED这是我们进行逻辑编排和可视化的大脑。它是一个基于流的编程工具通过浏览器操作。你需要先在 Pi 上安装 Node-RED 运行时然后通过网页访问它的编辑器用拖拽连线的方式构建应用。此外一个稳定的家庭 WiFi 网络是必须的。确保你的 Raspberry Pi 和 Cricket 传感器都能连接到同一个局域网LAN。不建议使用访客网络因为有些访客网络会隔离设备间的通信导致 Cricket 无法将消息发送给 Pi 上的 Mosquitto。3. 软件环境部署详解3.1 在 Raspberry Pi 上安装 Mosquitto MQTT Broker首先通过 SSH 连接到你的树莓派。假设你的 Pi 主机名是raspberrypi用户名是pi。ssh piraspberrypi.local输入默认密码通常是raspberry如果你没改过的话。登录成功后先更新软件包列表sudo apt update sudo apt upgrade -y然后安装 Mosquitto 及其客户端工具。客户端工具mosquitto-clients非常有用可以用来测试发布和订阅消息。sudo apt install -y mosquitto mosquitto-clients安装完成后Mosquitto 服务会自动启动。我们可以检查一下它的运行状态sudo systemctl status mosquitto你应该能看到active (running)的字样。默认情况下Mosquitto 会监听本地的 1883 端口MQTT 标准端口并且允许来自本地网络的匿名连接对于家庭内网项目这通常没问题但生产环境需要配置用户名密码。为了测试我们可以在一个 SSH 会话里启动一个订阅者监听所有主题#是通配符mosquitto_sub -h localhost -t # -v-h指定主机这里是本机-t #表示订阅所有主题-v表示打印出主题和消息内容。这个窗口会挂起等待消息。然后打开另一个 SSH 会话或者新开一个终端窗口连接到同一台 Pi发布一条测试消息mosquitto_pub -h localhost -t test/topic -m Hello MQTT!回到第一个终端窗口你应该立刻看到输出了test/topic Hello MQTT!。这说明 Mosquitto 已经正常工作能够在内部转发消息了。实操心得如果mosquitto_sub收不到消息首先检查防火墙。Raspberry Pi OS 默认的防火墙如果装了的话可能阻止了 1883 端口。可以暂时关闭防火墙测试sudo ufw disable。或者更安全地只开放 1883 端口sudo ufw allow 1883。另外确保两个命令里的-h参数都是localhost这代表它们都连接到了本机的 Mosquitto 服务。3.2 安装与配置 Node-REDNode-RED 的安装现在变得极其简单。官方提供了一个一键安装脚本它会自动处理 Node.js 和 Node-RED 本身的安装。在 Pi 的终端里执行bash (curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)这个命令会运行一段时间它会检测并安装合适版本的 Node.js然后安装 Node-RED 及其核心节点。安装过程中可能会有一些提示一般按回车确认默认选项即可。安装成功后你会看到类似这样的输出告诉你如何启动和访问 Node-RED。但我们不打算每次手动启动。我们希望 Node-RED 能像 Mosquitto 一样作为一个系统服务在后台运行并且开机自启。首先我们可以用以下命令启动 Node-RED并同时将其设置为服务node-red-start这时 Node-RED 会在前台启动并输出一些日志。关键的一步来了在它启动并输出完初始化信息后通常最后几行会显示服务器已启动在 1880 端口按CtrlC。这个操作并不会停止 Node-RED 服务相反它会将 Node-RED 转到后台以服务模式继续运行。这是 Node-RED 脚本的一个特性。接着我们将这个服务设置为开机自启sudo systemctl enable nodered.service现在Node-RED 服务已经配置好了。你可以用下面的命令来管理它sudo systemctl start nodered.service- 启动服务sudo systemctl stop nodered.service- 停止服务sudo systemctl restart nodered.service- 重启服务sudo systemctl status nodered.service- 查看服务状态确保服务是运行状态后我们就可以在浏览器里访问 Node-RED 的编辑器了。你需要知道 Pi 在局域网内的 IP 地址hostname -I假设输出的 IP 是192.168.1.100。那么在你的电脑或手机浏览器中输入http://192.168.1.100:1880。你应该就能看到 Node-RED 的流编辑器界面了。一个干净的工作区左侧是节点面板中间是流画布右侧是信息/调试面板。注意事项第一次访问 Node-RED 界面时可能会有一个安全设置步骤要求你设置用户名密码来保护编辑器。对于纯粹在家庭内网使用的项目你可以跳过不推荐但为了安全建议花一分钟设置一个密码。此外默认的 1880 端口如果和你其他服务冲突可以在 Node-RED 的设置文件settings.js中修改。4. 构建传感器节点Cricket模块配置4.1 硬件组装与上电硬件连接非常简单。将两节 AAA 电池按正确极性放入电池盒。找到 Cricket 模块上的电源输入接口通常会有VCC或和GND或-的标识。将电池盒的红线正极焊接到VCC黑线负极焊接到GND。如果你用的是带插头的线直接插入对应引脚即可。焊接完成后检查无误就可以装上电池了。此时 Cricket 模块上的 LED 可能会快速闪烁几下然后进入一种低功耗状态。这是正常的它正在等待配置。4.2 网页配置详解Cricket 模块提供了一个内置的配置热点AP 模式。我们需要通过这个热点来告诉它家里的 WiFi 叫什么、密码是什么以及数据要发到哪里去。进入配置模式长按 Cricket 模块上的物理按钮通常就一个约 5 秒钟直到 LED 开始以一种特定的模式闪烁比如慢闪。这表示它已经进入了配置模式并开启了一个名为类似toe_device或Cricket_XXXX的 WiFi 热点。连接热点用你的电脑或手机在 WiFi 列表中找到并连接这个热点。连接后可能无法访问互联网这是正常的。访问配置页面打开浏览器在地址栏输入http://192.168.4.1或http://cricket.local取决于固件版本。你应该会看到一个简单的配置页面。关键参数设置配置页面通常有几个主要部分WiFi 设置在这里填入你家庭路由器的 SSIDWiFi 名称和密码。这样 Cricket 在正常工作模式下就会连接到你家的网络。服务器设置这是核心。我们需要告诉 Cricket 把数据发到哪里。服务器类型选择MQTT。服务器地址填写你的树莓派的内网 IP 地址例如192.168.1.100。端口保持默认的1883。主题Topic这是 MQTT 的“地址标签”。Cricket 通常会自动生成一个基于其 MAC 地址的唯一主题前缀比如/59A98F494C/。在这个前缀下它会发布不同的数据到子主题例如温度数据会发布到/59A98F494C/temp电池电压会发布到/59A98F494C/batt。你可以保留默认也可以自定义一个更容易识别的比如/home/livingroom/temp。但为了后续在 Node-RED 中方便订阅建议先了解默认的命名规则。数据上报间隔这里就是设置“心跳”周期的地方。项目里为了测试方便设成了 30 秒。但这是一个需要重点注意的地方对于电池供电设备发送频率是耗电大户。30 秒一次两节 AAA 电池可能几周就没电了。在实际部署中应根据监测需求调整。例如室内温度变化缓慢可以设置为 5 分钟300 秒、10 分钟甚至 1 小时。户外气象站可能也需要 5-10 分钟一次。这个设置对电池寿命影响巨大。保存并重启填写完所有信息后点击保存或应用设置。Cricket 模块会重启并尝试连接你指定的 WiFi 和 MQTT 服务器。配置完成后模块的 LED 会以另一种模式闪烁比如每隔心跳周期短暂亮一下表示它正在正常工作睡眠 - 唤醒 - 测量 - 连接 WiFi - 发送数据 - 断开连接 - 睡眠。4.3 验证数据发送如何确认 Cricket 已经开始发送数据了呢我们回到树莓派上用 Mosquitto 的订阅命令来监听。首先我们需要知道 Cricket 使用的完整 MQTT 主题。如果你在配置页面看到了前缀比如/59A98F494C/那么温度主题很可能就是/59A98F494C/temp。为了保险起见我们可以先监听所有主题看看它到底在发什么。在 Pi 的终端里运行mosquitto_sub -h localhost -t # -v等待一个心跳周期比如你设置的30秒你应该能看到类似这样的消息出现/59A98F494C/temp 23.5 /59A98F494C/batt 2.89这表示温度是 23.5 摄氏度电池电压是 2.89 伏。看到这些恭喜你传感器端已经成功工作了数据正在源源不断地发送到你的 MQTT Broker。避坑技巧如果mosquitto_sub收不到任何消息请按以下步骤排查检查 Cricket 配置确认服务器 IP 和端口绝对正确。确保 Pi 的 IP 没有因为 DHCP 而改变可以考虑在路由器中为 Pi 设置静态 IP 分配。检查 WiFi 连接Cricket 可能连接家庭 WiFi 失败。观察其 LED 指示灯状态参考手册或者再次进入其配置热点查看状态页面是否有错误信息。检查 Mosquitto 网络监听默认 Mosquitto 只监听本地回环地址127.0.0.1。为了让局域网内其他设备能连接需要修改其配置。编辑配置文件sudo nano /etc/mosquitto/mosquitto.conf在文件末尾添加一行listener 1883 0.0.0.0。然后重启服务sudo systemctl restart mosquitto。注意这样配置允许内网匿名连接仅适用于安全的家庭网络。检查防火墙再次确认 Pi 的防火墙没有阻止 1883 端口。5. Node-RED 流编排从接收到展示5.1 创建 MQTT 输入节点并测试现在数据已经到达 Mosquitto我们需要让 Node-RED 去“领取”这些数据。打开你的 Node-RED 编辑器http://你的Pi IP:1880。拖入 MQTT 输入节点在左侧节点面板的“网络”分类下找到mqtt in节点将其拖拽到中间的流工作区。配置节点双击这个节点会弹出配置对话框。Server点击右侧的铅笔图标添加一个新的 MQTT 服务器连接。因为我们的 Mosquitto 和 Node-RED 在同一台 Pi 上所以“服务器”地址填localhost或127.0.0.1即可端口1883。如果之前为 Mosquitto 配置了用户名密码也需要在这里填写。完成后点击“更新”。Topic这里填写你想要订阅的 MQTT 主题。一开始为了测试我们可以使用通配符#订阅所有消息。添加调试节点从左侧“输出”分类中拖一个debug节点到工作区。连线点击 mqtt in 节点右侧的输出点一个小方块拖出一条线连接到 debug 节点左侧的输入点。部署点击右上角的红色Deploy按钮。这会将你当前的流部署到运行时环境。查看调试信息点击右侧边栏的“小虫子”图标打开调试面板。将 debug 节点的输出切换到“调试面板”。如果一切正常每隔一个心跳周期比如30秒你就能在调试面板里看到一条新的消息。消息内容是一个 JSON 对象其中payload字段就是传感器发送的数据如23.5topic字段就是消息的主题如/59A98F494C/temp。5.2 安装 Dashboard 节点并规划 UINode-RED 默认的节点里没有 UI 组件我们需要安装一个额外的节点包node-red-dashboard。点击右上角的菜单按钮三条横线选择“管理面板”。在弹出的窗口中切换到“安装”标签页。在搜索框里输入node-red-dashboard然后从搜索结果中找到它点击旁边的“安装”按钮。安装完成后左侧节点面板会多出一个“dashboard”分类里面包含了图表chart、仪表盘gauge、文本显示text、开关switch等各种 UI 组件。在开始拖拽 UI 节点之前最好先在纸上或脑子里规划一下仪表盘的布局。Dashboard 的 UI 结构是分层的Tab标签页 - Group组 - Widget控件。例如我们可以创建一个叫“家庭监控”的 Tab在里面创建一个叫“客厅传感器”的 Group然后在这个组里放置温度图表和电池电量表。5.3 构建完整的可视化流现在我们来构建一个完整的流它不仅能接收数据还能将其美观地展示出来。我们假设已经通过调试知道了传感器的具体主题温度主题是/59A98F494C/temp电池主题是/59A98F494C/batt。创建 Tab 和 Group从 dashboard 节点中拖出一个tab节点到工作区双击它命名为“我的家”。再拖出一个group节点双击它命名为“环境传感器”并在“标签页”下拉框中选择刚才创建的“我的家”。处理温度数据流拖入一个新的mqtt in节点。配置它连接到localhost服务器主题填写/59A98F494C/temp。这个节点将专门接收温度数据。从 dashboard 节点中拖出一个chart节点。双击配置Group选择刚才创建的“环境传感器”组。Label可以写上“客厅温度”。Chart type选择line折线图。其他如颜色、X/Y轴标签可以根据喜好调整。将 mqtt in 节点连接到 chart 节点。可选但推荐数据格式化MQTT 节点输出的payload默认是字符串。虽然 chart 节点能处理但为了后续可能的计算最好将其转换为数字。在两个节点之间插入一个function节点在“功能”分类里。双击 function 节点写入一行简单的代码msg.payload parseFloat(msg.payload); return msg;。这样就将字符串转换成了浮点数。处理电池数据流电池数据需要多一点处理。Cricket 发送的是电压值如 2.89V但我们更习惯看百分比。拖入一个新的mqtt in节点主题设为/59A98F494C/batt。拖入一个function节点用于计算电量百分比。假设 Cricket 的工作电压范围是 2.0V 到 3.3V满电那么百分比可以粗略估算为百分比 ((当前电压 - 最低电压) / (最高电压 - 最低电压)) * 100。在 function 节点中输入以下代码var voltage parseFloat(msg.payload); // 将payload转为数字 var minVoltage 2.0; var maxVoltage 3.3; var percentage ((voltage - minVoltage) / (maxVoltage - minVoltage)) * 100; // 将百分比限制在0-100之间 percentage Math.max(0, Math.min(100, Math.round(percentage))); msg.payload percentage; return msg;从 dashboard 节点中拖出一个gauge仪表盘节点。双击配置Group同样选择“环境传感器”组。Label写上“电池电量”。Range最小值 0最大值 100单位%。可以设置颜色区间比如 0-20% 红色20-50% 黄色50-100% 绿色。将 mqtt in 节点连接到 function 节点再将 function 节点连接到 gauge 节点。最终连线与部署你的流应该看起来像两条清晰的管道一条是MQTT in (temp) - [Function] - Chart另一条是MQTT in (batt) - Function (计算百分比) - Gauge。确保所有节点的右下角都没有显示红色三角错误标志。点击Deploy。5.4 访问 Dashboard 界面部署成功后你的可视化仪表盘就已经生成了。访问它的地址和编辑器地址类似只是在端口后加上/ui。例如http://192.168.1.100:1880/ui。用浏览器打开这个链接你就能看到一个独立的网页上面有“我的家”这个标签页里面是“环境传感器”组组里实时更新着温度曲线和电池电量仪表盘。你可以把这个网址收藏在手机浏览器里随时随地查看家里的温度情况。实操心得Dashboard 的布局是响应式的但在手机小屏幕上一个组里的所有控件会垂直排列。如果你有多个图表或仪表可以考虑为不同类型的传感器创建不同的 Group甚至不同的 Tab这样界面会更清晰。另外chart 节点默认只显示最近一定数量或时间范围的数据你可以在其配置中调整“历史数据长度”。6. 系统优化与扩展思路6.1 功耗优化与电池寿命管理对于电池供电的传感器续航是首要考虑。除了之前提到的延长数据上报间隔如从30秒改为300秒或更长还有几个优化点WiFi 连接策略Cricket 这类模块在每次发送数据时都需要经历 WiFi 扫描、关联、认证、获取IP的过程这非常耗电。有些高级模块或固件支持“WiFi 保持连接”模式但会持续消耗电流。Cricket 的“每次唤醒都重新连接”的策略在长间隔下反而是省电的。确保你的路由器 WiFi 信号在传感器放置点足够强连接过程越快模块活跃时间越短越省电。数据包精简MQTT 消息本身很轻量。确保你只发送必要的数据。例如如果 Cricket 支持可以关闭不必要的传感器读数或者将多个读数打包成一条消息发送减少连接次数。硬件休眠确认模块在非活动期间是否真正进入了深度睡眠Deep Sleep模式。可以用万用表测量电池供电回路在睡眠时的电流理想情况应在微安µA级别。电池选择对于长期部署考虑使用锂亚硫酰氯Li-SOCl2电池如 ER14505。这类电池容量大可达2000mAh以上自放电率极低非常适合这种微电流、长周期的应用。6.2 Node-RED 流的进阶处理目前的流只是简单显示。Node-RED 的强大之处在于可以轻松添加逻辑。数据持久化当前图表只显示内存中的近期数据刷新页面就没了。可以添加数据存储。使用file节点将收到的msg对象追加写入到 Pi 的某个文本文件如 CSV 格式。或者安装node-red-node-sqlite节点将数据存入 SQLite 数据库便于长期记录和分析。报警功能拖入一个function节点判断温度是否超过阈值例如if(msg.payload 30) {...}。如果超过可以连接一个email节点发送邮件提醒或者连接一个telegram bot节点发送消息到你的手机。数据预处理在数据存入数据库或显示前可以进行平滑滤波去除异常毛刺、单位转换华氏度转摄氏度等操作这些都可以通过 function 节点或专门的滤波节点实现。多传感器聚合如果你在多个房间部署了传感器可以创建多个 MQTT in 节点订阅不同主题然后使用join节点或 function 节点将数据合并在一个图表里用不同颜色的线显示多个房间的温度对比。6.3 扩展更多类型的传感器Cricket 模块的通用性很好。它通常有多个 GPIO 引脚如 IO1, IO2。你可以通过这些引脚连接各种数字或模拟传感器数字传感器如 DHT11/DHT22温湿度、DS18B20单总线温度。这些传感器有特定的通信协议你需要查阅 Cricket 的文档看其固件是否支持或者是否需要通过配置特定的“插件”或“服务”来读取。通常配置页面会有选项让你启用某个引脚上的特定传感器类型。模拟传感器如土壤湿度传感器、光照强度传感器。Cricket 的某些引脚可能支持 ADC模数转换你可以配置该引脚为模拟输入并设置一个阈值或直接读取原始电压值通过 MQTT 发送。开关量输入连接一个门磁、按钮或振动传感器到 GPIO 引脚配置为数字输入。当状态变化门开/关时Cricket 可以立即发送一条 MQTT 消息。在 Node-RED 中你可以用这个信号来触发更复杂的自动化流比如开门就开灯、记录开门时间等。6.4 系统稳定性与维护Raspberry Pi 的稳定性长期运行确保 Pi 的供电稳定最好使用官方电源或质量可靠的 5V/2.5A 以上电源适配器。MicroSD 卡是系统的薄弱环节频繁写入日志可能导致损坏。可以考虑将系统日志写入到 RAM 磁盘或者使用 USB 固态硬盘SSD作为系统盘需要 Pi 3B 或更新型号支持从 USB 启动。服务自愈可以写一个简单的监控脚本定期检查 Mosquitto 和 Node-RED 服务是否在运行如果崩溃则自动重启。使用 systemd 的看门狗功能或者 crontab 定时任务都能实现。数据备份定期备份 Node-RED 的流配置位于~/.node-red目录下的flows.json文件。这个文件包含了你的所有逻辑。可以在 Node-RED 编辑器的“菜单 - 导出”中导出完整的流。这个基于 Raspberry Pi 和 Node-RED 的系统就像一个乐高底座。你从最简单的温度传感器和仪表盘开始理解了数据从物理世界到数字世界的流动路径。之后无论是增加更多的传感器类型还是添加复杂的自动化逻辑比如温度太高自动打开风扇甚至是将数据对接更专业的可视化工具如 Grafana都有了坚实的基础。整个过程中你几乎不需要和复杂的代码打交道大部分工作就是连线、配置和调试这种“所见即所得”的构建方式正是个人物联网项目最大的乐趣所在。