嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

使用 XinaBox 构建 LoRa 无线监控系统的原型第三部分:添加输入/输出和测试

Main31_e1bab406d9af0c152f02757659baa64f431bbc24.jpg

使用模块化电子平台,快速构建远程无线传感器系统的原型。

第 1 部分概述了我们的应用案例,并探讨了 LoRa 无线调制技术,论述该技术的应用优势,然后探讨部分可用的 XinaBox 硬件。第 2 部分中,我们接着讨论了 CR02 模块(又称“☒芯片”)的编程,这一模块具有集成微控制器和无线功能。然后我们还讨论了 LoRa 无线链接的数据发送和接收。

在第三部分,也是最后一部分中,我们将在无线连接的传输端添加输入温度传感器,并在接收端安装“光电继电器”驱动指示灯或警报器输出。

使用的硬件

SW02Detail_9196f46822432bec1aa5f4f4790bd00d261c8ac6.jpg

我们在微控制器和 LoRa 上使用相同的 CR02 模块,然后使用 IP01 USB-UART 模块进行编程和测试。

我们使用的传感器是 XinaBox SW02 (174-3745) 。它集成了 Bosch BME680,实际上兼具温度、湿度、气压和挥发性有机物 (VOC) 传感器的功能。然而在本例中,我们只用来测量温度。有了它,我们就能更容易地在测试中触发变化。

OC03Detail_841cc21fa82298bc7d17d3aa8b09a901a9a95523.jpg

至于输出部分,我们将使用 XinaBox OC03 (174-3715) 。它具有继电器的光频隔离控制功能,还能在 2A 下将负载上调至 40V。因此它可用于直接切换标准工业指示灯或蜂鸣器等设备,这些设备通常可在 24V 下运行。此外,它还可用于控制 12V 或 24V 继电器,进而切换主电源。

加上两个 CR02 (174-3699) 模块后,它们可用于监测环境,并在远程温度超过指定值时触发警报。

Arduino

在上一篇中,我们安装了 RadioHead 库,以支持 CR02 LoRa 无线电使用的 Arduino IDE。而为了使用 SW02 和 OC03 模块,我们还需要安装:

最快速的安装方法是下载各软件对应的 ZIP 文件,然后在 Arduino IDE 中选择 程序 (Sketch) → 添加库 (Include Library) → 添加 ZIP 库 (Add ZIP Library)... 重启 IDE 后,应当可通过文件 (File) → 示例 (Examples) → 来自自定义库的示例 (Examples from Custom Libraries) 查看新的示例程序。

硬件测试

PLWMX_SW02_Test_79291b7447e25acfe7c18e870e2d029219517dad.jpg

首先我们需要确保已从“工具”菜单中选择:

  • 板:Arduino Pro 或 Pro Mini
  • 处理器:ATmega328P(5V,16MHz)
  • 端口:/dev/ttyUSB0(或者 IP01 已列举的端口)

如果我们接下来加载示例 SW02_Temperature_Measurement,编辑/确认后上传,然后再打开串口监控器,这时温度读数应显示在窗口中。

如需测试输出模块,我们可以加载示例 OC03_ToggleOutput,编辑并上传,然后再次打开串口监控器。这次窗口显示 OC03 Test 消息。如果我们测量输出端子之间的电阻,应当确保光电继电器关闭 2 秒,打开 2 秒,然后重复这一过程。

现在我们已设置好开发环境,并确认硬件能够正常工作。接下来,我们将把输入/输出和 LoRa 传输和接收功能结合起来。

传感器加上传输功能

#include <xCore.h>
#include <xSW02.h>
#include <RH_RF95.h>

#define LED_BUILTIN 16
#define CR02_FREQUENCY 868.0

const int DELAY_TIME = 2000;
const float MAX_TEMP = 30.00;

xSW02 SW02;
RH_RF95 CR02;

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  
  // SW02 sensor setup
  Wire.begin();
  SW02.begin();

  // CR02 radio setup
  if (!CR02.init()){
    Serial.println("CRO2 init failed");
  }
  CR02.setFrequency(CR02_FREQUENCY);
  CR02.setTxPower(23, false);
  
  // Delay for sensor to normalise
  delay(5000);
}

void loop(){
  float temp;
  byte txdata[1];
  
  // Read SW02 sensor
  SW02.poll();
  temp = SW02.getTempC();
  
  // Print temperature to the Serial Monitor   
  Serial.print(temp);
  Serial.println(" C");

  // Set status (0x00 if temp OK and 0x01 if high)
  if (temp <= MAX_TEMP) {
    digitalWrite(LED_BUILTIN, LOW);
    txdata[0] = { 0x00 };
  }
  else {
    digitalWrite(LED_BUILTIN, HIGH);
    txdata[0] = { 0x01 };
  }

  // Transmit status
  CR02.send(txdata, sizeof(txdata));

  // Delay between sensor reads
  delay(DELAY_TIME);
}

在以上程序中,我们:

  1. 添加所需的库,并设置一些参数。
  2. 配置 CR02 LED、传感器和 LoRa 无线电
  3. 获得温度,并通过串行端口显示出来
  4. 如果温度适当,状态变量为 0;如果温度超出设定值,则状态变量为 1
  5. 将状态传输至 LoRa 链接
  6. 等待已设置的延迟时间,然后从第 3 步开始重复

现在我们可以传输实际温度读数了,如果我们想在接收端更改设置值,这一步将非常有用。然而,在传输端评估温度也具有一定的优势。例如,如果我们想,就能让传感器仅在温度超过限值时传输数据,或者在温度超限时向警报器发出信号,否则则以不固定的频率传输状态“心率”。

此外注意我们是如何传输单字节的,0x00 表示一切正常,而 0x01 则表示温度过高。我们还可以增加多种状态,例如 0x03 表示我们无法读取传感器读数,也许 0x04 可以表示电池电量偏低。

一般来说,数据在空气中传播的时间越短越好,因此尽量简化传输数据,以减少能源和无线频谱的使用。这也是为什么我们只通过无线电链路传输单字节状态,而不是冗长的 ASCII 文本,例如“警报”或“温度为 27C”等。

接收加上输出

#include <RH_RF95.h>
#include <xOC03.h>
#include <xCore.h> 

#define LED_BUILTIN 16
#define CR02_FREQUENCY 868.0

RH_RF95 CR02;
xOC03 OC03;

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);

  // CR02 radio setup
  if (!CR02.init()) {
    Serial.println("init failed");
  }
  CR02.setFrequency(CR02_FREQUENCY);
  CR02.setTxPower(23, false);

  // OC03 setup
  Wire.begin();
  OC03.begin();
}

void loop() {
  byte buf[1];
  byte len = 1;
 
  if (CR02.available())
  {
    if (CR02.recv(buf, &len))
    {
      Serial.print("Status: ");
      
      if (buf[0] == 0x00) {
        Serial.print("OK");
        OC03.write(LOW);
        digitalWrite(LED_BUILTIN, LOW);
      }
      else if (buf[0] == 0x01) {
        Serial.print("ALARM");
        OC03.write(HIGH);
        digitalWrite(LED_BUILTIN, HIGH);
      }
      else {
        Serial.print("ERROR - unknown status");
      }
      Serial.print("   //   RSSI: ");
      Serial.println(CR02.lastRssi(), DEC);      
    }
    else
    {
      Serial.println("Receive failed!");
    }
  }
}

在接收节点,我们:

  1. 添加所需的库,并设置一些参数。
  2. 配置 CR02 内置 LED 和 LoRa 无线电,以及 OC03 模块
  3. 寻找输入数据
  4. 解析状态
  5. 在终端显示,并设置光电继电器和内置 LED
  6. 返回第 3 步

PLWMX_Alarm_6889afc953a0969ce08698ee73cb3a82f601ea41.jpg

我们还在串口监控器上显示接收信号强度指示 (RSSI),因为这些数据相当实用,可以显示出无线电链路的质量。调试过程中,如果信号强度太低,我们可以在传输端增大 LoRa 扩频因子 (SF),这样可增大传输范围,而代价是空气传播时间延长。如果我们在监控 RSSI 随时间变化时发现它出现下降,这可能意味着电池电量偏低、有障碍物进入无线电波传播路径,或者出现硬件问题,例如天线受损。

总结

虽然这是一个极度简化的示例,但是它还是展示出如何能够快速设计出不依赖现有网络、其它基站或网关的远距离无线监控方案。本例中,我们集成了 BME680 传感器用于温度测量,而它还具有更多的测量功能。除此以外我们还可从多种其它 xCHIP 模块中选择以用于输入和输出,这些模块都可以快速、方便地与 xBUS 连接器进行物理互连。

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.
DesignSpark Electrical Logolinkedin