智能酒桶-arduino+lora通信
邹振兴的知乎专栏 智能酒桶方案传送门 购买的模块终于到齐了,来个接线图: 第一步:通过官方工具,将lora模块进行初始化,注意一定要选定点传输方式,我一开始不知道在这里搞了好久。第一个模块设置地址为1,这个模块到时接树莓派,第二个模块设置地址为2,接到arduino上。 第二步:接线,这步要注意,lora模块有m0,m1两根针,用来控制模式的,如果不用,一定要接地,这里我也尝试了好久。 第三步:编写通信代码,我要实现一个简单的功能,01模块向02模块发送一个指令,arduino验证指令完整后向01模块响应。多话不说,直接上代码:
#include <SoftwareSerial.h>
SoftwareSerial rolaSerial(2, 3); // 电流表数据通讯TTL RX, TX
String cmdBuffer = ""; // 命令缓存
int loggerLevel = 1; // 日志级别
char szTmp[3]; // 串口读取
unsigned char channel = 0x04; // 信道
void setup() {
Serial.begin(9600);
rolaSerial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// 读取串口指令到buffer
if(rolaSerial.available() > 0) {
digitalWrite(LED_BUILTIN, HIGH);
}
while (rolaSerial.available() > 0)
{
sprintf( szTmp, "%02X", (unsigned char) rolaSerial.read() );
cmdBuffer += szTmp;
delay(2);
}
digitalWrite(LED_BUILTIN, LOW);
if(cmdBuffer.length() > 0) {
parseBuffer();
}
}
void parseBuffer() {
// 长度超过2048,清空
if(cmdBuffer.length() > 2048) {
cmdBuffer = "";
logger("size out 2048");
return;
}
// 查找AA333380
int start = cmdBuffer.indexOf("AA333380");
if(start > 0) {
cmdBuffer = cmdBuffer.substring(start);
} else if(start == -1) {
return;
}
// 查找FCFF
String temp = "";
int end = cmdBuffer.indexOf("FCFF");
if(end != -1) {
temp = cmdBuffer.substring(0, end + 4);
cmdBuffer = cmdBuffer.substring(end + 4);
sendReturn();
}
String cmdstr = temp.substring(8, 12);
String data = temp.substring(12, temp.length() - 4);
if(cmdstr.equals("0001")) {
logger(data);
}
}
// 收到信息号响应
void sendReturn() {
unsigned char dest[11] = {0x00, 0x01, channel, 0xBB, 0x66, 0x66, 0x80, 0xFF, 0xFF, 0xFc, 0xFF};
rolaSerial.write(dest, 11);
}
void logger(String str) {
if(loggerLevel) {
Serial.println(str);
}
}
第四步:测试 连通性测试,发送一条,响应一条 压力测试: 定时发送设置为100,200,300,400,在100ms情况下,模块接收到数据错乱。300以后正常,但偶尔发生不回复的情况,500ms较为稳定。 因为lora模块是通过无线电来传输的,首先,传输的数据不能太多。第二,需要一点时间。所 以确定500ms为一次通信较为稳定。
距离与稳定性测试: 官方数据说在3KM之内通信,我测试了在1-2KM,是正常的,再远没测试过了。电梯内也可以正常收发,在电梯运动时会偶尔收发失败。
lora通信基本测试成功,下一步使用树莓派开发中继器。下个星期继续努力