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

导航至

想象一下,你需要快速、轻松且可靠地构建一个实时物联网监控项目。这感觉令人不知所措吗?如果你是这样,你并不孤单。许多人发现物联网项目令人畏惧,因为它们涉及许多不同的组成部分。从设置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 x 1kΩ电阻用于超声波传感器和1 x 220Ω电阻用于LED灯。
  7. 5根跳线:面包板将容纳组件,我们将使用五根跳线连接一切,以确保信号流畅。

软件设置

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

  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将两个物联网项目与Raspberry Pi和传感器集成,并将数据写入InfluxDB。这只是一个开始。我希望这能激发您探索物联网的可能性。请关注我们未来的博客,我们将使用相同的技术在实时监控目的下构建更复杂的设置,具有漂亮的UI和数据可视化。

享受构建的乐趣!我们很高兴听到您的进展,请随时在我们的社区社交媒体上分享您的创作。