如何使用 Node-RED、InfluxDB 和 Raspberry Pi 构建 IoT 传感器项目

导航至

假设您需要快速、轻松且可靠地构建一个实时 IoT 监控项目。这是否让您感到不知所措?如果是这样,您并不孤单。许多人发现 IoT 项目令人生畏,因为它们涉及许多移动部件。从设置 Raspberry Pi 和传感器等硬件,到配置有线或无线连接,每个步骤都带来了自身的挑战。然后,您需要将实时数据收集并存储到时间序列数据库(如 InfluxDB)中,并查询该数据以进行监控和分析。

一种方法是使用大量的编码和配置以及各种库和 SDK。但是,如果您可以在不编写一行代码的情况下设置完整的 IoT 系统,那会怎么样呢?这就是 Node-RED 的用武之地。 在本文中,我们将引导您使用 Raspberry Pi 和传感器构建一个简单的 IoT 项目,将数据存储在 InfluxDB Cloud 中,并在 Node-RED 仪表板中进行可视化。在此过程中,您将学习可以应用于任何实时 IoT 数据项目的关键概念和原则。

硬件设置

  1. Raspberry Pi(3/4/5 或更新版本)及外围设备:我们将使用运行 Raspbian OS 的 Raspberry Pi,它将充当我们项目的大脑。确保已设置并配置它以通过 SSH 进行远程开发。这是设置 Pi 以进行开发的官方指南
  2. GPIO HAT(可选):此附加组件简化了 Raspberry Pi 的 GPIO 引脚的使用,尽管对于本项目来说是可选的。
  3. 面包板: 用于创建电路并铺设电线和组件的原型板。
  4. 超声波传感器:我们将使用超声波传感器来测量距离并设置一个阈值,当超出该阈值时,LED 灯将亮起。
  5. LED 灯:一个 LED 灯将用于我们项目中的基本视觉反馈。
  6. 电阻器: 3 个 1kΩ 电阻器用于超声波传感器,1 个 220Ω 电阻器用于 LED 灯。
  7. 5 根跳线:面包板将固定组件,我们将使用六根跳线连接所有部件,以确保信号流畅传输。

软件设置

  1. InfluxDB Cloud:我们的传感器数据将存储在 InfluxDB Cloud 中,这是一个时间序列数据库,非常适合实时数据存储以及从任何地方访问。基于云的解决方案提供可扩展性、远程访问和自动化维护,让您可以专注于您的项目,而无需担心本地设置的复杂性。如果您没有帐户,可以免费注册。拥有帐户后,请记下以下详细信息
    1. Cloud URL:URL 位于您的 InfluxDB Cloud 门户中,将是发送和检索数据的端点。
    2. API 令牌:此令牌将允许 Raspberry Pi 将数据写入您的 InfluxDB 存储桶。确保它具有“读/写”权限。
    3. 组织名称:您的组织名称,可在 InfluxDB Cloud 门户中找到,API 请求需要该名称。
    4. 存储桶名称:存储桶充当 InfluxDB 中的数据库。您将需要存储桶名称来存储传感器数据。
  2. Node-REDNode-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”
  • 配置 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 流程设置

  1. 拖动一个 inject 节点(用于定时器)
  2. 拖动两个 rpi gpio 节点(一个输入,一个输出)
  3. 拖动两个 function 节点
    1. 拖动一个 influxdb v3 节点
    2. 拖动一个 debug 节点
  4. 配置节点
    1. a. 定时器 (inject) 节点
      • 将重复间隔设置为 2 秒
      • 将其命名为“触发定时器”

    b. GPIO 节点

配置输出节点

  • 选择引脚 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 和数据可视化,用于实时监控,所有这些都使用相同的技术。

祝您构建愉快!我们很乐意听到您的进展,因此请随时在我们的社区社交媒体上分享您的作品。