如何使用Node-RED、InfluxDB和Raspberry Pi构建物联网传感器项目
由Suyash Joshi / 开发者
2024年10月08日
导航至
想象一下,你需要快速、轻松且可靠地构建一个实时物联网监控项目。这感觉令人不知所措吗?如果你是这样,你并不孤单。许多人发现物联网项目令人畏惧,因为它们涉及许多不同的组成部分。从设置Raspberry Pi和传感器等硬件到配置有线或无线连接,每一步都提出了自己的挑战。然后,你需要收集并存储时间序列数据库(如InfluxDB)中的实时数据,并查询这些数据以进行监控和分析。
实现这一功能的一种方法是使用大量的编码和配置各种库和SDK。但如果您能不写一行代码就设置完整的IoT系统会怎样呢?这就是Node-RED发挥作用的地方。 在本文中,我们将向您展示如何使用Raspberry Pi和传感器构建一个简单的IoT项目,将数据存储在InfluxDB Cloud中,并在Node-RED仪表板中可视化它。在这个过程中,您将学习可以应用于任何实时IoT数据项目的关键概念和原则。
硬件设置
- Raspberry Pi(3/4/5或更高版本)及外围设备:我们将使用运行Raspbian OS的Raspberry Pi,它将作为我们项目的“大脑”。确保它已通过SSH进行设置和配置,以便远程开发。以下是设置Pi进行开发的官方指南。
- GPIO HAT(可选):此附加组件简化了与Raspberry Pi的GPIO引脚一起工作,但在此项目中它是可选的。
- 面包板:用于创建电路、放置电线和组件的原理图板。
- 超声波传感器:我们将使用超声波传感器来测量距离,并设置一个阈值值,当超过该值时,将LED灯打开。
- LED灯:一个LED灯将在我们的项目中用于基本的视觉反馈。
- 电阻:3 x 1kΩ电阻用于超声波传感器和1 x 220Ω电阻用于LED灯。
- 5根跳线:面包板将容纳组件,我们将使用五根跳线连接一切,以确保信号流畅。
软件设置
- InfluxDB Cloud:我们的传感器数据将存储在InfluxDB Cloud中,这是一个适用于实时数据存储和远程访问的时间序列数据库。基于云的解决方案提供了可扩展性、远程访问和自动维护,让您可以专注于项目,无需担心本地设置的复杂性。如果您还没有账户,可以免费注册。一旦您有了账户,请注意以下详细信息
- 云URL:该URL位于您的InfluxDB Cloud门户中,将是发送和检索数据的端点。
- API令牌:此令牌将允许Raspberry Pi将数据写入您的InfluxDB存储桶。请确保它具有“读取/写入”权限。
- 组织名称:您的组织名称位于InfluxDB Cloud门户中,是API请求所必需的。
- 存储桶名称:存储桶在InfluxDB中充当数据库。您需要存储桶名称来存储传感器数据。
- Node-RED:[Node-RED官网链接](https://nodered.org/) 是基于Node.js构建的可视化编程工具,非常适合将硬件设备、API和在线服务连接起来。它几乎可以在任何支持Node.js运行时的硬件和操作系统上运行。由于它是基于Node.js构建的,因此您需要在Raspberry Pi上安装Node.js后再安装Node-RED。
更新、下载和安装Node.js和Node-RED
sudo apt update
sudo apt install nodejs npm
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
启动Node RED
node-red-start
您也可以通过选择Raspberry Pi OS桌面上的菜单 -> 编程 -> Node-RED菜单选项来在Raspberry Pi OS桌面上启动Node-RED服务。同样,保护Node-RED访问权限也是一个好习惯,您可以遵循他们的官方指南。
Node-RED的其他有用命令
node-red-stop
:此命令停止Node-RED服务node-red-restart
:此命令停止并重新启动Node-RED服务node-red-log
:此命令显示服务的日志输出
如果您正在使用Pi桌面上的浏览器,您可以打开以下地址 https://127.0.0.1:1880 并使用您的管理员凭据登录。
当从另一台机器浏览,例如通过ssh时,您应使用Raspberry Pi的计算机名或IP地址: http://<hostname>:1880,您将能够在您的机器上看到NodeRED编辑器。
您可以通过运行以下命令找到Raspberry Pi的IP地址
hostname -I
设置Node-RED
我们将使用GPIO引脚将Raspberry Pi与传感器连接起来,并将传感器数据存储在云端的InfluxDB中,为此我们需要在Node-RED上安装两个节点模块。您可以从“管理工具箱”菜单轻松完成此操作并安装以下模块
- node-red-node-pi-gpio(用于Raspberry Pi GPIO)
- node-red-contrib-influxdb(用于InfluxDB连接)
编写Node-RED程序/流程
让我们开始使用Node-RED进行编程。Node-RED中的程序被称为“流程”,因为它们基于可视化数据流编程范式,您可以通过电缆连接“节点”并编辑它们的逻辑。
流程1:Hello LED
现在我们已设置好一切并启动了node-RED,让我们创建第一个程序,该程序将简单地通过Node-RED打开/关闭LED并将数据保存到InfluxDB云存储桶中。在这里,我们抓取两个类型的布尔值“注入”节点,一个设置为“true”,另一个设置为“false”,并将它们连接到“rpi - gpio out”节点。我们现在有一个简单的登录。当我们按下true/false注入节点时,将通过Raspberry Pi的GPIO发送一个信号来控制LED的打开/关闭。
硬件设置
- 使用GPIO引脚在面包板上将LED与Raspberry Pi连接
- 长腿(阳极)通过1K电阻连接到GPIO 17
- 短腿(阴极)连接到GND引脚
Node-RED流程设置
- 在浏览器中打开Node-RED(通常为https://127.0.0.1:1880)
- 添加节点
- 从工具箱拖动两个
inject
节点 - 从工具箱拖动两个
rpi gpio out
节点 - 从工具箱拖动一个
influxdb v3
节点 - 从工具箱拖动一个
debug
节点
- 从工具箱拖动两个
- 配置注入节点
- 双击第一个注入节点
- 将有效载荷类型设置为
boolean
- 将有效载荷设置为
true
- 将其命名为“打开”
- 将有效载荷类型设置为
- 双击第二个注入节点
- 将有效载荷类型设置为
boolean
- 将有效载荷设置为
false
- 将其命名为“关闭”
- 将有效载荷类型设置为
- 双击第一个注入节点
- 配置GPIO节点
- 双击第一个GPIO节点
- 选择引脚17
- 将其命名为“红色LED”
- 双击第一个GPIO节点
- 配置InfluxDB节点
- 双击InfluxDB节点
- 单击铅笔图标以添加新的InfluxDB连接
- URL:您的InfluxDB URL
- 组织:您的组织名称
- 令牌:您的API令牌
- 查询模式:SQL查询
- 单击“更新”
- 连接节点
- 将两个注入节点连接到两个GPIO节点
- 还将它们连接到InfluxDB节点
- 最终调整
- 在注入节点和InfluxDB节点之间添加一个功能节点
- 配置功能节点
return {
payload: `INSERT INTO led\_status (time, led\_red, led\_green)
VALUES (NOW(), ${msg.payload}, ${msg.payload});`
};
流程2:Hello SensorData
在现有流程的基础上,让我们将超声波距离传感器与三个1K欧姆电阻连接起来,如图所示。超声波传感器可以检测到任何物体,如它前面的一个人。超声波传感器发出超声波,并检测从目标反射回来的波。该信息使用经典的数学公式计算距离:距离 = 声速 x (时间/2) 来计算放置在前面物体距离。你可以想象在家庭和工业物联网设置中,这种传感器有许多可能性,从安全到车辆中的防碰撞检测。
硬件设置
- 按照以下方式使用GPIO引脚将您的超声波传感器(例如HC-SR04)连接到您的Raspberry Pi
- 将VCC连接到5V引脚
- 将GND连接到地线引脚
- 将TRIG连接到GPIO 23(引脚16)引脚
- 将ECHO连接到GPIO 24(引脚18)引脚
- 连接3个1K电阻串联
- 将ECHO连接到第一个电阻
- 将GPIO 24连接到第二个电阻
- 将地线连接到第三个电阻
Node-RED 流程设置
- 拖动一个
inject
节点(用于定时器) - 拖动两个
rpi gpio
节点(一个输入,一个输出) - 拖动两个
function
节点- 拖动一个
influxdb v3
节点 - 拖动一个
debug
节点
- 拖动一个
- 配置节点
- a. 定时器(inject)节点
- 设置重复间隔为2秒
- 命名为“触发定时器”
b. GPIO节点
- a. 定时器(inject)节点
配置输出节点
- 选择引脚23
- 命名为“TRIG”
配置输入节点
- 选择引脚24
- 将输入类型设置为“三态”
- 命名为“ECHO”
c. 第一个函数节点(命名为“触发序列”)
// Set trigger high
context.set('triggerState', 1);
node.send({payload: 1});
// Set trigger low after 10 microseconds
setTimeout(() => {
context.set('triggerState', 0);
node.send({payload: 0});
}, 0.01);
d. 第二个函数节点(命名为“计算距离”)
const duration = msg.payload;
const distance = duration \* 17150 / 1000000;
return {
payload: `INSERT INTO distance\_measurements (time, distance)
VALUES (NOW(), ${distance.toFixed(2)});`
};
e. InfluxDB节点
- 使用与流程1相同的配置来连接节点
- 定时器 -> 触发序列 -> TRIG
- ECHO -> 计算距离 -> InfluxDB -> Debug
测试流程
- 点击右上角的“部署”
- 查看调试侧边栏以查看距离测量值。
- 打开您的InfluxData Cloud仪表板以验证数据是否正在记录。
恭喜!如果您已经走到这一步并且一切正常,您已成功使用Node-Red将两个物联网项目与Raspberry Pi和传感器集成,并将数据写入InfluxDB。这只是一个开始。我希望这能激发您探索物联网的可能性。请关注我们未来的博客,我们将使用相同的技术在实时监控目的下构建更复杂的设置,具有漂亮的UI和数据可视化。