如何使用 Node-RED、InfluxDB 和 Raspberry Pi 构建 IoT 传感器项目
作者:Suyash Joshi / 开发者
2024 年 10 月 08 日
导航至
假设您需要快速、轻松且可靠地构建一个实时 IoT 监控项目。这是否让您感到不知所措?如果是这样,您并不孤单。许多人发现 IoT 项目令人生畏,因为它们涉及许多移动部件。从设置 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 个 1kΩ 电阻器用于超声波传感器,1 个 220Ω 电阻器用于 LED 灯。
- 5 根跳线:面包板将固定组件,我们将使用六根跳线连接所有部件,以确保信号流畅传输。
软件设置
- InfluxDB Cloud:我们的传感器数据将存储在 InfluxDB Cloud 中,这是一个时间序列数据库,非常适合实时数据存储以及从任何地方访问。基于云的解决方案提供可扩展性、远程访问和自动化维护,让您可以专注于您的项目,而无需担心本地设置的复杂性。如果您没有帐户,可以免费注册。拥有帐户后,请记下以下详细信息
- Cloud URL:URL 位于您的 InfluxDB Cloud 门户中,将是发送和检索数据的端点。
- API 令牌:此令牌将允许 Raspberry Pi 将数据写入您的 InfluxDB 存储桶。确保它具有“读/写”权限。
- 组织名称:您的组织名称,可在 InfluxDB Cloud 门户中找到,API 请求需要该名称。
- 存储桶名称:存储桶充当 InfluxDB 中的数据库。您将需要存储桶名称来存储传感器数据。
- Node-RED:Node-RED 是一种基于 Node.js 构建的可视化编程工具,非常适合将硬件设备、API 和在线服务连接在一起。只要它支持 Node.js 运行时,它就可以在几乎任何硬件和操作系统上运行。由于它基于 Node.js 构建,因此您需要在安装 Node-RED 之前在 Raspberry Pi 上安装 Node.js。
更新、下载并安装 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
您也可以通过选择菜单 -> 编程 -> 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 桌面上使用浏览器,您可以打开地址 http://localhost: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:你好 LED
现在我们已经完成所有设置并启动了 node-RED,让我们创建我们的第一个程序,该程序将简单地从 Node-RED 打开/关闭 LED,并将数据保存在 InfluxDB Cloud 存储桶中。在这里,我们抓取两个布尔类型的“注入”节点,将一个设置为“true”,另一个设置为“false”,并将它们连接到“rpi - gpio out”节点。我们现在拥有的是一个简单的登录。当我们按下 true/false 注入节点时,信号将通过 Raspberry Pi 的 GPIO 发送,以打开/关闭 LED。
硬件设置
- 使用 GPIO 引脚将 LED 与 Raspberry Pi 连接在面包板上
- 较长的引脚(阳极)通过 1K 电阻器连接到 GPIO 17
- 较短的引脚(阴极)连接到 GND 引脚
Node-RED 流程设置
- 在浏览器中打开 Node-RED(通常为 http://localhost: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:你好 SensorData
在流程 1 中先前工作的基础上,让我们将超声波距离传感器与三个 1K 欧姆电阻器连接,如下图所示。超声波传感器可以检测来自任何物体的距离,例如站在它前面的人。超声波传感器发射超声波并检测从目标反射的波。此信息使用经典的数学公式计算距离:距离 = 声速 x(时间/2)来计算放置在前面的物体的距离。您可以想象此类传感器在家庭和工业 IoT 设置中的许多可能性,从安全到车辆中的防撞检测。
硬件设置
- 按照以下步骤将您的超声波传感器(如 HC-SR04)连接到您的 Raspberry Pi,使用 GPIO 引脚
- 将 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 将两个 IoT 项目与 Raspberry Pi 和传感器集成,并将数据写入 InfluxDB。这仅仅是开始。我希望这能激发您探索 IoT 的可能性。请密切关注未来的博客,我们将在其中构建一个更复杂的设置,其中包含漂亮的 UI 和数据可视化,用于实时监控,所有这些都使用相同的技术。