🍓ESP32(Arduino)和Raspberry Pi(Node-RED)LoRa和ESP-NOW大范围数据通讯中继系统

ESP32 | Arduino | Raspberry Pi | Node-RED | LoRa | ESP-NOW | C/C++ | 通用异步收发器(UART) | MQTT

数据中继系统是一种无需依赖 WiFi 从远程传感器收集数据的简单方法。 它基于 ESP-NOW 协议,该协议可在 ESP32 和 ESP8266 微控制器板上轻松使用。 该系统可用于在难以提供完整 WiFi 覆盖或过于耗能的情况下收集和传输传感器数据。

使用分配的 MAC 地址方案允许在代码中设置少量值来配置整个系统。 每个无线网关都分配有一个单字节标识符,称为 UNIT_MAC。 这与一组 5 字节前缀一起被分配给 ESP 的 MAC 地址。

硬件布局

传感器收集数据并通过 ESP-NOW 或 LoRa 将其发送到网关。网关通过 ESP-NOW、LoRa、UART 和/或 MQTT 侦听数据包,然后使用一个或多个相同接口重新传输数据包。

Node-RED 前端可以设置这些节点来格式化数据并将其发送到数据库。

中继只是重新传输 ESP-NOW 数据包以扩展网络范围,而网关则根据需要在 ESP-NOW、MQTT over Wi-Fi、LoRa 或串行消息之间转换数据包。 每个中继器和网关都有一个唯一的 UNIT_MAC 用于寻址。 处理 ESP 设备通信的代码很简单,并且有据可查,因此您只需要设置一些配置值,然后就可以将精力集中在特定应用程序所需的代码上。

该系统的中心是一个运行 Node-RED 的 Raspberry Pi,它充当最终的 MQTT 网关并连接到 ESP MQTT 网关。 这意味着所有操作都发生在本地网络中,而不依赖于互联网连接和云服务。 但是,它仍然可以根据需要使用 MQTT 或任何其他协议通过 Internet 发送和接收数据。 Node-RED 使得构建自定义自动化和界面变得特别容易。

代码结构

网关

网关通过 ESP-NOW、UART、LoRa 和/或 MQTT 侦听数据包,然后使用配置文件“操作”部分中定义的规则通过这些接口重新传输数据包。

动作定义网关如何对通过每个数据源接收的数据包做出反应。 一个动作可以由一个或多个用分号分隔(并以分号结尾)的命令组成。

以下命令立即重新发送数据:sendESPNOW(MAC)、sendSerial() 和 sendMQTT()。

这些命令将数据发送到缓冲区,按一定时间间隔释放:bufferLoRa(interface)、bufferESPNOW(interface)、bufferSerial() 和 bufferMQTT()。

例如,网关设置为接收它接收到的任何 ESP-NOW 数据包并首先通过串行端口发送,然后通过 ESP-NOW 将其重新传输到地址为 0x01 的另一个网关:

#define ESPNOWG_ACT 
sendSerial(); 
sendESPNOW(0x01);

路由

除了对来自一般(未知)ESP-NOW 和 LoRa 设备的数据包做出反应外,网关还可以侦听来自特定对等设备地址 (MAC) 的流量,并对一般流量做出不同的反应。 这可用于向上游或下游“推进”数据包,并允许用户为来自任一方向的数据定义不同的路径。 用户最多可以为 ESP-NOW 和 LoRa 接口(ESPNOW1 & ESPNOW2 和 LORA1 & LORA2)定义两个对等地址。

每个对等点也有一个与之关联的发送缓冲区。 通过取消注释相应的 DELAY 宏(例如:#define LORAG_DELAY 1000)来启用缓冲区。 启用后,网关将按照指定的时间间隔自动发送缓冲区内容。

虽然 ESP-NOW 足够快,可以实时处理大量流量,但 LoRa 的速度要慢得多。 因此,您必须将 LoRa 数据发送到缓冲区。 由于缓冲区是强制性的,因此始终需要使用 LoRa 对等体配置 LoRa 中继器。

缓冲区最多可容纳 256 个 DataReading。

工作示意图

  • 基础设置和高级设置

  • 基础设置和高级设置(LoRa)

设置传感器

应用示例代码

  • LoRa 传感器

  • ESP-NOW 传感器

  • ESP-NOW 网关

  • UART 网关

  • MQTT 网关

  • 通用网关

#define READING_ID    3   //Unique ID for this sensor
#define GTWY_MAC      0x04 //Address of the nearest gateway

#define USE_ESPNOW
//#define USE_LORA
#define DEEP_SLEEP
//#define POWER_CTRL    14
//#define DEBUG

//LoRa Configuration
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26
//433E6 for Asia
//866E6 for Europe
//915E6 for North America
#define BAND 915E6
#define SF 7

#include "f_sensor.h"

void setup() {
  beginFS();
}
void loop() {
  for (int i=0; i < 255; i++) {
    loadFS(float(i), IT_T);
    sendFS();
    delay(15);
  }
}

源代码

🏈page指点迷津 | Brief

Last updated