ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

openrig实战:从零搭建模块化环境监测装置完整指南

openrig实战:从零搭建模块化环境监测装置完整指南

前阵子我把一套基于openrig思路搭建的环境监测装置从零跑通了。从选硬件、布线、写代码,到把数据接到本地控制面板、配上异常告警,前后折腾了大概两周。中间踩了不少坑,也积累了一些比较实在的经验。这篇就把整套方案完整拆开,讲清楚openrig到底是什么、为什么值得折腾,以及每一步怎么落地。适合刚接触开源硬件、想做点自动化采集或者家庭实验台的朋友参考,也适合已经在玩树莓派、ESP32但想理顺整套数据链路的人。

先说结论:openrig不是某一个固定的硬件型号,而是一种"以开放硬件为核心、模块化拼装设备装置"的搭建思路。你可以把它理解成一套乐高式的装置底座——底座负责供电、通信和计算,上面挂不同的传感器、继电器、屏幕模块,就能快速组装出适合自己场景的专用设备。这种思路最大的价值是复用:一套底座解决七八种需求,而不是每来一个新需求就重新买一堆硬件。

1. openrig到底是什么:先理解"装置"和"设备"的区别

1.1 为什么叫rig不叫device

rig这个词在英文里有"为特定任务组装成套设备"的含义。影视圈把摄像机支架套装叫camera rig,钻井平台叫drill rig,PC发烧友也把自己组装的整机叫gaming rig。它们都有一个共性:不是单件工具,而是由多种部件组合起来、为一个明确目标服务的完整装置。

openrig拆开就是open加rig,开放加成套装置。核心表达的是一个模块化理念:底层用什么主控、什么传感器都可以商量,只要遵循统一的接口约定,设备就能拆开重组,变成新的东西。这和"买一个固定的智能硬件盒子"有本质区别——后者出厂就锁死了用途,前者则把选择权和改造权完全留给使用者。

我自己比较喜欢这个思路的原因是它解决了硬件爱好者最常见的痛点:桌面堆了一堆开发板和传感器,每次新项目都要重新接线、重新写驱动、重新调试,时间全耗在重复劳动上。openrig把"重复的部分"沉淀成底座,把"变化的部分"留给模块,真正需要动脑子的地方就只剩下业务逻辑。

1.2 这套方案适合谁来折腾

从我的实际体验来看,openrig适合这几类人:

  • 想在家里搭建数据采集中心、又不想买一堆封闭智能硬件的爱好者。
  • 在办公室或实验室需要稳定采集温度、湿度、空气质量等数据的开发者。
  • 想系统学习GPIO、I2C、MQTT这些嵌入式与物联网基础技术的人。
  • 预算有限,希望"一套硬件多种用途"的实用主义者。

不太适合的人也有:追求一步到位、不想自己动手维护、希望设备买回来就能用的用户。openrig的乐趣和门槛都在于"自己动手",如果不想碰螺丝刀和代码,直接买成品方案更省心。

2. openrig的设计思路:为什么是"三层结构"

2.1 硬件层:主控板的选择逻辑

搭openrig之前先要解决一个基础问题:用什么做大脑。主控板的选择直接决定整个底座的性能上限、功耗水平、扩展能力和开发成本。

我整理了一张选型对比表,方便你对照自己的场景做判断:

主控方案优势短板适合场景
树莓派4B性能强、生态全、能跑完整Linux功耗高、价格贵、体积大需要跑数据库、面板、复杂服务的中心节点
树莓派Zero 2W便宜、体积小、能跑Linux且支持WiFi性能弱、单核吃力、USB口少轻量数据采集与上报,openrig的核心节点
ESP32模块便宜、自带WiFi/蓝牙、功耗低引脚少、内存小、不适合跑重服务多节点分布式采集终端、电池供电场景
STM32工业级稳定、外设丰富、实时性强上手门槛高、无线需要外挂模块对稳定性和实时性要求更高的边缘设备

第一套openrig我更推荐从树莓派Zero 2W或者ESP32起步。原因有两点:一是成本低,折腾坏了不肉疼;二是这两个平台的资料非常多,遇到问题基本都能搜到答案。如果后续要接多路传感器、跑可视化面板、做本地决策,再把中心节点升级成树莓派4B也不迟。

2.2 控制层:为什么用MQTT做"神经中枢"

硬件选好了,接下来的关键问题是:设备之间怎么通信?我在openrig里选择MQTT作为统一的控制层协议,效果非常理想。

MQTT是一种基于发布订阅模型的轻量级消息协议。你可以把它的工作机制理解为小区信箱系统:设备A把数据投递到某个"信箱"(也就是topic),所有订阅了这个信箱的设备都能自动收到这封信。发信的人不需要知道谁在收信,收信的人也不需要知道发信的人是谁,双方只要约好topic格式就能对接。

对比之下,HTTP的请求响应模式在设备主动上报场景里效率差一些,每次都要建立一个连接、发送请求、等待响应、再关闭连接。而MQTT通过一条保持连接的长通道持续推送数据,网络开销小得多,还天然支持一对多分发和离线消息缓存。

我实际测试下来的感受是:接入MQTT之后,整个系统的扩展方式变了。新加一个传感器节点,只要让它往指定topic发数据就行,面板端、告警端、存储端订阅同一个topic,数据自动到达所有需要的地方,完全不需要改其他模块的代码。

2.3 应用层:数据要能"用起来"才有价值

数据采回来只是第一步,真正体现openrig价值的是应用层。应用层负责消费数据,把它变成看得见的图表、能触发的规则、或者推送到手机上的告警消息。

我习惯把应用层和底层硬件彻底解耦。数据落到MQTT之后,上层可以是Node-RED的仪表盘,也可以是Home Assistant的自动化场景,甚至是一个简单的Python脚本——用什么完全取决于你的需求和熟悉程度。这种解耦带来的直接好处是:哪天想换面板或者改规则逻辑,底层采集设备完全不用动。

这一层才是openrig能够持续玩下去的动力。单纯的"看温度湿度"很容易腻,但一旦数据能联动设备、能在异常时打电话通知你、能按周生成报表,这套装置就从一个玩具变成了真正能干活的生产力工具。

3. 实操记录:从零件到跑通一台openrig环境监测装置

3.1 物料清单与预算

光讲思路不够,直接上一套我实际搭过的配置。这套装置以树莓派Zero 2W为核心,采集温湿度、气压,再外接一块OLED小屏显示实时数据,最终通过MQTT上报给局域网的Node-RED面板。

具体物料如下:

物料用途参考预算区间
树莓派Zero 2W主控核心100-160元
DHT22温湿度传感器采集温度和湿度15-25元
BMP280气压传感器采集气压和辅助温度10-20元
0.96寸OLED屏幕(I2C)本地实时显示15-30元
继电器模块(可选)控制外部设备开关10-20元
5V/3A电源与MicroUSB线供电30-50元
面包板及杜邦线若干接线调试10-20元

整体预算控制在250元左右。如果手头已经有树莓派或者ESP32,成本还能更低。这些材料不用追求高端,能用就行,后续跑通了再考虑换更好的。

3.2 线路连接:接线顺序与防坑

硬件接线看起来简单,但顺序和细节直接决定后面调试是否顺利。我的建议是先把电源接好,再逐个接入传感器,每接一个就验证一个,避免全部接完后再排查时两眼一抹黑。

具体接法如下:

  1. 树莓派Zero 2W先接电源,确认系统能正常开机。
  2. DHT22的VCC接3.3V,GND接GND,DATA接GPIO17。
  3. BMP280的VCC接3.3V,GND接GND,SCL接GPIO3(SCL),SDA接GPIO2(SDA)。
  4. OLED屏幕同样走I2C总线,与BMP280并接在SDA和SCL上。
  5. 继电器模块的IN引脚接GPIO22,VCC接5V,GND接GND。

提示:DHT22的数据引脚建议接一个4.7kΩ上拉电阻到3.3V,否则长线连接时数据容易跳变。这是我在实测中遇到最多的问题之一,后面排查部分会细说。

树莓派的I2C总线是允许挂多台设备的,BMP280和OLED共用一个I2C接口完全没问题,但要注意地址冲突。BMP280的I2C地址一般是0x76,OLED屏一般是0x3C,如果检测不到设备,先用i2cdetect扫一下地址。

3.3 系统烧录与基础配置

硬件接好后进入软件环节。树莓派Zero 2W安装系统我用的是Raspberry Pi OS Lite版本,理由很简单:openrig这类装置跑的是固定任务,图形界面纯属浪费资源,Lite版系统体积小、启动快、占用内存少。

烧录步骤:

  1. 去官网下载Raspberry Pi Imager工具和Raspberry Pi OS Lite镜像。
  2. 打开Imager,选择树莓派Zero 2W型号、Lite镜像和SD卡,点击烧录。
  3. 烧录完成后,在SD卡的boot分区新建一个空文件名为ssh的文件,用于开启SSH。
  4. 再新建一个wpa_supplicant.conf文件,写入WiFi配置,让设备开机自动联网:
country=CN ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="你的WiFi名称" psk="你的WiFi密码" key_mgmt=WPA-PSK }

设备插入SD卡通电后,等一两分钟,路由器后台应该能看到名为raspberrypi的设备。用SSH连上后,先做三件事:

sudo apt update && sudo apt upgrade -y sudo raspi-config

在raspi-config里开启I2C接口,这个很关键,不开的话GPIO上接的I2C设备地址扫不到。然后再装Python环境需要的基础包:

sudo apt install -y python3-pip python3-smbus libgpiod2

3.4 读取传感器数据的Python脚本

环境配好后,写个Python脚本读取传感器数据。我给的是DHT22加BMP280的读法,核心是循环采集、异常捕获和LED指示灯状态反馈:

#!/usr/bin/env python3 import time import board import adafruit_dht import adafruit_bmp280 import paho.mqtt.client as mqtt # 初始化传感器 dht = adafruit_dht.DHT22(board.D17) # DHT22 接 GPIO17 i2c = board.I2C() # I2C 总线 bmp = adafruit_bmp280.Adafruit_BMP280_I2C(i2c) bmp.sea_level_pressure = 1013.25 # MQTT 配置 BROKER = "192.168.1.100" # 改成你 broker 的地址 TOPIC = "home/openrig/env" def on_connect(client, userdata, flags, rc): print("MQTT connected") client = mqtt.Client() client.on_connect = on_connect client.connect(BROKER, 1883, 60) def read_sensors(): """带重试的传感器读取""" for _ in range(3): try: temp_dht = dht.temperature humi = dht.humidity if temp_dht is not None and humi is not None: break except RuntimeError: time.sleep(1) temp_bmp = bmp.temperature press = bmp.pressure return temp_dht, humi, temp_bmp, press while True: t1, h, t2, p = read_sensors() payload = f"{{\"temp_dht\":{t1:.1f},\"humi\":{h:.1f},\"temp_bmp\":{t2:.1f},\"pressure\":{p:.1f}}}" client.publish(TOPIC, payload, qos=1) print(payload) time.sleep(10)

这段代码的逻辑是每10秒采集一次数据,发布到MQTT主题,方便后续所有订阅方消费。之所以给DHT22做重试而不是一次性读取,是因为单总线传感器在潮湿环境下偶发读取失败非常常见,不加重试机制会导致数据链路上出现间断。

3.5 把数据真正"用起来":接入MQTT和面板

光有数据发布还不够,得上下游消费端。我在局域网里搭了一个Mosquitto作为MQTT broker,装Node-RED做仪表盘。Node-RED里加一个MQTT输入节点,订阅home/openrig/env,再接一个Switch节点做判断,最后接到Dashboard控件就能实时显示。

安装broker和Node-RED的命令:

sudo apt install -y mosquitto mosquitto-clients sudo node-red-pi

如果不想用Node-RED,纯Python也能订阅数据。写一个小脚本,把数据写入CSV文件或者SQLite,一样能实现记录功能。关键是数据格式约定好了,下游怎么消费完全由自己决定。

4. 玩法扩展:openrig完全可以不止于环境监测

4.1 从数据采集到设备控制:接入继电器联动

环境监测只是openrig的基础形态。接上继电器之后,这套装置就从"只读"升级成了"可写",能够真正影响现实世界。

我的做法是在采集脚本里加了一个订阅线程,监听home/openrig/control主题。当收到"relay_on"时就打开GPIO22的继电器,收到"relay_off"就关闭。这样就能实现比如"湿度低于40%自动打开加湿器""温度超过30度自动开启风扇"之类的规则。

控制逻辑直接写在中心节点上有个好处:即使断网了,本地依然能联动决策。因为采集、判断、控制都在一台设备上完成,MQTT只是承担传输层职责,不会因为外部服务不可用而瘫痪。

4.2 多节点组网:一个openrig变成一屋子openrig

单节点的数据覆盖范围终归有限,openrig的自然演化方向是组网。我在阳台和地下室各放了一个基于ESP32的采集节点,功耗低、可以用电池供电,定时把温度湿度数据通过WiFi发到中心节点的MQTT broker。

组网之后有一个明显的感受:数据分析的维度完全不同了。单点数据只能看趋势,多点数据能看差异、看梯度、看室内外温差,对判断开窗时机、设备运行状态都有帮助。这种能力是单买一个智能传感器给不了的。

ESP32节点端用MicroPython或者Arduino都能实现,核心就是WiFi连接加MQTT发布,大约几十行代码。中心节点不需要做任何改动,只要订阅对应topic,数据自然汇入同一个面板。

4.3 与智能家居联动:把数据变成场景

openrig的数据如果能进智能家居平台,玩法又深一层。我把MQTT数据接入Home Assistant,以传感器实体形式暴露出来,然后在自动化里创建规则:卧室温度高于28度就打开空调、书房湿度高于70%就提醒开启除湿机、地下室的漏水传感器检测到异常就推送手机通知。

这个阶段你已经不再关心openrig具体是怎么采集数据的了,数据就像水管里的水,接上哪个场景就服务哪个场景。这其实体现了openrig架构的精髓:硬件底座负责生产数据,应用层负责消费数据,二者互不干扰、各自演进。

4.4 便携现场采集箱:把openrig带出门

openrig还有一个实用形态是便携化。把树莓派、传感器、移动电源装进一个带泡棉分隔的小工具箱,就是一套能带去现场的数据采集装置。

我在做户外环境记录时用过这个方案。现场不需要网络,中心节点通过自建热点接收ESP32节点数据,同时本地存储到SD卡。带回办公桌再接上WiFi,数据自动补传。这种灵活度是成品智能硬件做不到的——你完全掌控装置的形态、供电方式和数据流方向。

5. 实操中踩过的坑与排查技巧实录

5.1 传感器读数异常、跳变、湿度固定不动

这个问题几乎每个人都遇到过。我在调试DHT22时发现湿度值偶尔会突然变成0,温度值在正常值和明显错误值之间反复横跳。排查后定位到两个原因:一是传感器数据引脚的上拉电阻缺失,导致信号在长线上被干扰;二是杜邦线接触不良,特别是插在面包板上的时候。

解决办法是加4.7kΩ上拉电阻、尽量缩短传感器到主控的距离、检查所有杜邦线是否完全插实。另外DHT22对供电稳定性也有要求,不要和继电器共用一个电源输出,继电器启动瞬间的压降会导致传感器读数异常。

注意:不同厂商生产的DHT22质量差别较大,翻新件和劣质件很难从外观判断,如果读数持续异常,优先怀疑传感器本身,换一个新传感器测试往往比调代码更高效。

5.2 MQTT连接时断时续、订阅消息丢失

跑了一段时间后我发现MQTT连接会偶发断开,数据链路上出现空洞。排查原因有两个方向:一是树莓派的WiFi节能模式会在空闲时休眠无线模块,导致连接被断开;二是Mosquitto默认配置不打印连接日志,出问题时难以追踪。

解决方法是先关掉WiFi节能模式:

sudo iwconfig wlan0 power off

同时在Mosquitto配置里打开日志,并设置合理的keepalive心跳参数。客户端侧建议开启重连机制和topic retain,确保设备每次连接成功先拿到最新的保留消息。

5.3 供电不足导致设备反复重启

树莓派Zero 2W本身功耗不高,但一旦外接传感器、OLED屏幕和继电器,供电波动就会显现。我遇到过开机正常、运行几分钟后自己重启的问题,排查了很久才发现是电源适配器输出电流不足,外设一启动就把电压拉垮了。

解决思路:换5V/3A的电源,避免从GPIO的5V引脚给大电流设备供电,继电器模块单独供电或至少单独走电源线。另外检查USB线的线阻,劣质MicroUSB线在负载稍高时电压降非常明显,换上粗线径的短线后问题立即消失。

5.4 树莓派温度过高导致性能下降甚至宕机

把设备塞进全封闭的亚克力外壳看起来很整洁,但散热是个隐形问题。树莓派Zero 2W在全封闭环境里运行采集任务,实测温度能到85度以上,系统会主动降频,极端情况下直接宕机。

我给的方案是加铝制散热片加一块5V小风扇,外壳上开出风孔形成通风道。外壳开孔听起来简单,却能显著改变散热效果。另一个技巧是散热风扇不要常开,直接接GPIO+PWM温控,温度高于45度再启动,兼顾噪音和寿命。

5.5 日志与看门狗:让服务崩溃不再可怕

openrig跑起来之后,最怕的就是现场出了问题没人知道,尤其是采集服务静默崩溃。我踩过一次坑之后做了两个改进:所有服务用systemd托管并强制输出日志,加入看门狗定时检测机制。

创建systemd服务文件后,运行服务状态一目了然,异常退出的时间点有据可查。如果连树莓派内核都出现假死,硬件看门狗是一个可选的终极兜底方案,配置内核参数后设备会定期被硬件复位,重启后自动恢复任务。

6. 一点后话:openrig还可以往哪个方向长

把openrig玩到一定程度,你可能会发现真正宝贵的不只是某一套装置,而是这套装置背后的工作方法:确定需求、选型、搭架构、写代码、调问题,然后再根据实际问题迭代结构。我个人的建议是不要一开始就追求功能齐全,先把最小闭环跑通,再逐步往上加模块。模块化最大的红利是"坏了能单独替换、升级不需要推倒重来",这个优势只有在你亲自动手维护过一套系统之后才能深刻体会。

最后再分享一个小技巧:给每个模块贴标签。我在openrig的每根线材两头都贴了编号标签,每个模块上也写清了接口用途。看起来是个不起眼的习惯,但排查问题时能节省大量时间,尤其是装置运行几周后再回去维护,没有标签的状态下你根本想不起来那根线是接哪里的。

openrig的想象空间远不止环境监测。它更像一个可以不断生长的平台,你投入多少时间和想法,它就能长出多少种形态。后续我想在这个底座上继续加空气质量监测、漏水检测和摄像头联动,让这套装置真正变成家里的"环境基础设施"。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进