你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
使用模块化电子平台,快速构建远程无线传感器系统的原型。
第 1 部分概述了我们的应用案例,并探讨了 LoRa 无线调制技术,论述该技术的应用优势,然后探讨部分可用的 XinaBox 硬件。第 2 部分中,我们接着讨论了 CR02 模块(又称“☒芯片”)的编程,这一模块具有集成微控制器和无线功能。然后我们还讨论了 LoRa 无线链接的数据发送和接收。
在第三部分,也是最后一部分中,我们将在无线连接的传输端添加输入温度传感器,并在接收端安装“光电继电器”驱动指示灯或警报器输出。
使用的硬件
我们在微控制器和 LoRa 上使用相同的 CR02 模块,然后使用 IP01 USB-UART 模块进行编程和测试。
我们使用的传感器是 XinaBox SW02 (174-3745) 。它集成了 Bosch BME680,实际上兼具温度、湿度、气压和挥发性有机物 (VOC) 传感器的功能。然而在本例中,我们只用来测量温度。有了它,我们就能更容易地在测试中触发变化。
至于输出部分,我们将使用 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) 查看新的示例程序。
硬件测试
首先我们需要确保已从“工具”菜单中选择:
- 板: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);
}
在以上程序中,我们:
- 添加所需的库,并设置一些参数。
- 配置 CR02 LED、传感器和 LoRa 无线电
- 获得温度,并通过串行端口显示出来
- 如果温度适当,状态变量为 0;如果温度超出设定值,则状态变量为 1
- 将状态传输至 LoRa 链接
- 等待已设置的延迟时间,然后从第 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!");
}
}
}
在接收节点,我们:
- 添加所需的库,并设置一些参数。
- 配置 CR02 内置 LED 和 LoRa 无线电,以及 OC03 模块
- 寻找输入数据
- 解析状态
- 在终端显示,并设置光电继电器和内置 LED
- 返回第 3 步
我们还在串口监控器上显示接收信号强度指示 (RSSI),因为这些数据相当实用,可以显示出无线电链路的质量。调试过程中,如果信号强度太低,我们可以在传输端增大 LoRa 扩频因子 (SF),这样可增大传输范围,而代价是空气传播时间延长。如果我们在监控 RSSI 随时间变化时发现它出现下降,这可能意味着电池电量偏低、有障碍物进入无线电波传播路径,或者出现硬件问题,例如天线受损。
总结
虽然这是一个极度简化的示例,但是它还是展示出如何能够快速设计出不依赖现有网络、其它基站或网关的远距离无线监控方案。本例中,我们集成了 BME680 传感器用于温度测量,而它还具有更多的测量功能。除此以外我们还可从多种其它 xCHIP 模块中选择以用于输入和输出,这些模块都可以快速、方便地与 xBUS 连接器进行物理互连。