基于ACSip S76S使用LoRa技术的智慧家庭无线-温湿度侦测方案

关键字 :ACSipS76SLoRa
家庭智慧化是我们一直以来努力的目标,市面上也出现很多智能的产品,大抵可以分为两类: 一类是大场作品如华硕、Google、Apple、小米等等; 一类是独立购买的单一功能产品,如无线门铃、智能插座、无线灯控等等。大厂作品的好处是系统整合完整,可以互相支持连动,但是缺点也很明显,就是『天地万物﹐朕赐给你的才是你的﹐朕不给﹐你不能抢。 』,就是大厂没出的你就没得用。独立购买单功能的好处是,想要什么买什么,但是缺点就是,没有整合,当设备一多起来,光遥控器就超过你的手指

这个系列就是要来把上面两类的优点合并起来,将家里会用到的设备全部无线化,又有统一的接口可以管理既然讲到无线,当然要提到最适合DIY应用的LoRa无线技术。LoRa有4大优点
1.使用Sub1GHz频段,绕射能力强,传输距离长,全家都收的到
2.尺寸小巧,而且省电,不用常常换电池
3.市面上唯一可以自行建构网络的IOT技术,适合家庭应用
4.设计图与code原厂都开放网络可以查询,建置成本低廉

这次为了简化开发难度我们使用诠鼎代理群登的LoRa模块S76S。S76S的好处是尺寸小巧,只有11mm x 13mm,而且有开发版,脚位有外拉出来,方便开发。话不多说,先来第一系列

智慧家庭无线化一:温湿度计无线化

目标:

1. DIY制作包含LoRa模块的温湿度计
2. 接收小主机要可以使用计算机,手机监看
3. 要可以一个小主机接收多个温湿度计

使用组件:



一、传感器端硬件设置:
将DHT22第一只脚接Arduino Uno的5V脚位,第二只先接到UNO的ping8,在串一个10K的电阻在接到5V,第四只脚接到地
S76S的3.3V脚位接到UNO的3.3V,TX、RX脚位分别接到UNO的pin0跟pin1,GND接地
接线示意图如下:


实际接线图如下:



二、ATMEGA328跟温湿度数据读取设定:
使用Arduino的好处是可以有链接库可以直接呼叫而且还是以面向对象的方式撰写
首先载入官方的DHT链接库
#include "DHT.h"
加载后,要先宣告才可以使用,对象宣告有两个参数,一个是所接的脚位一个是硬件类型,如下:
DHT dht(8, DHT22);
现在只需要接一个DHT22所以只要宣告一个就可以了
如果一个不够,一样可以宣告加上去,如下:
DHT dht1(0, DHT22)
DHT dht2(1, DHT22)
      .

再来是取得温湿度的数据,使用到两个对象:readTemperature()readHumidity()
使用的方式很简单就是dht.readTemperature()dht.readHumidity()
也可以用isnan()函式来检查是否读取错误
收到的温度默认就是摄氏,如果要华氏的话要加上「true」,readTemperature(true),这样就会是华氏
另外DHT的文件有说明,读取的时间为250ms,每次的间隔需要2秒以上

校正函式
在读取温湿度数据的时候,大家最担心的当然是数据不正确,或是不准
因为这颗DHT22是线性的传感器,虽然是线性的,但是这世上没有完美的线路,一定会有模拟误差或是干扰
标准有两种方式来修正,一个是线路的方式,透过运算放大器上设计一个偏搭DC电流的调整来做offset的补偿跟用一个放大再次大倍率的微调电子来做Scalar的补偿
另一种就是我们现在用的简易的软件计算修正,利用线性方程式:Y=ax+b的原理来作一个校正函数
float Correction((float raw, float scalar, float offset)
{
return(scalar*raw + offset);
}


三、S76S设定:
S76S选择使用的是P2P的程序代码,这个程序代码的特点是已经定义好他的群组为1个Master对32个Slave,
每一个Slave占用的时间为0.5秒,所以询问完一个群组为16秒钟

32个Slave的设计是适合智能家庭的
架构图如下:

设定如下:
1. 首先接到用USB接到计算机做设定
2. 读取韧体版本:『GetFWVersion
3. 设定模式,有标准模式(inNormal )跟Ping Pong(inTD)测试模式,我们当然是用标准模式:『SetSystemMode inNormal
4. 使用指令设定为Master或是Slave:『LoraMode SLAVE
5. 使用指令设定TX Power范围为5-20:『LoRaSetPower 20
6. 使用者令设定SF范围为8/12:『LoraSetSF 10
    这设定会影响数据的长度
     LoraSlavePld (bytes)
     => payload size : SF8=40 ; SF9=40 ; SF10=15 ; SF11=12 ; SF12=12
     LoraMasterPld(bytes)
     => payload size : SF8=40 ; SF9=40 ; SF10=12 ; SF11=9 ; SF12=9
7. 使用指令设定8个跳频的频率:『LoraSetChannelFreq 0 926000000
    0是第一个频率,因为有8个挑频,所以是0-7
    频率的限制范围为 863000000~928000000
8. 设定地址,这个很重要,不然怎么知道要给谁:『LoraSetMyAddr 9 9 9
    设定范围请看说明书
9. 设定启用就可以开始动作:『LoraStartWork ENABLE

四、ATMEGA328+温湿度+LoRa:

以上全部设定完成之后,以Arduino端只要做一件事情,就是将DHT收到的数据透过S76S送出去,因为这是温湿度计,不需要控制,所以只要单向传送就可以了。

完整的程序代码如附件



五、接收器端硬件设置:

将S76S的3.3V与GND分别接到ESP-32S的pin19与pin6,再将S76S的TX、RX分别接到ESP-32S的pin15与pin16
接线示意图如下:

实际接线图如下:


六、S76S设定:

S76S的设定(三),差别是,改成设定为Master,在启动即可

七、ESP-32S设定:

在ESP-32S的部分,一样可以利用ARduino编辑程序
实际操作说明:

首先载入WiFi跟UDP链接库
#include "WiFi.h"
#include

然后设定好要对外联机的Wifi网络

const char * ssid = "***********";
const char * password = "***********";

//网络定义
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 0, 27); //发送后端ip
unsigned int localPort = 6666; // UDP走的Port
byte packetBuffer[ NTP_PACKET_SIZE]; //buffer 缓存区,用来储存收到与发出的讯息
const int Easycon_PACKET_SIZE = 152;
char packetBuffer[PACKET_SIZE]; //buffer to hold incoming packet,218byte
char ReplyBuffer[160]; // a string to send back,218byte

// 透过UDP接收与传送讯息
EthernetUDP Udp;

系统启动时,确保无线网络是否联机成功

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("WiFi Failed");
while(1) {
delay(1000);
}

增加NTP网络校时的功能
//NTP Code
IPAddress timeServer(118, 163, 81, 61); // time.stdtime.gov.tw

//-------- NTP code ----------

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte NTPBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
while (Udp.parsePacket() > 0) ; // discard any previously received packets
//Serial.println("Transmit NTP Request");
sendNTPpacket(timeServer);
uint32_t beginWait = millis();
while (millis() - beginWait < 1500) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
//Serial.println("Receive NTP Response");
Udp.read(NTPBuffer, NTP_PACKET_SIZE); // read packet into the buffer
unsigned long secsSince1900;
// convert four bytes starting at location 40 to a long integer
secsSince1900 = (unsigned long)NTPBuffer[40] << 24;
secsSince1900 |= (unsigned long)NTPBuffer[41] << 16;
secsSince1900 |= (unsigned long)NTPBuffer[42] << 8;
secsSince1900 |= (unsigned long)NTPBuffer[43];
return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;

}
}
//Serial.println("No NTP Response :-(");
return 0; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
// set all bytes in the buffer to 0
//memset(packetBuffer, 0, NTP_PACKET_SIZE);
memset(NTPBuffer, 0x00, sizeof(NTPBuffer));
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
NTPBuffer[0] = 0b11100011; // LI, Version, Mode
NTPBuffer[1] = 0; // Stratum, or type of clock
NTPBuffer[2] = 6; // Polling Interval
NTPBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
NTPBuffer[12] = 49;
NTPBuffer[13] = 0x4E;
NTPBuffer[14] = 49;
NTPBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(timeServer, 123); //NTP requests are to port 123
Udp.write(NTPBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}

//网络回传数据子函式

void Send(){                    
                Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
                Udp.write(ReplyBuffer);
                Udp.endPacket();
                delay(50);
               memset(ReplyBuffer, 0x00, sizeof(ReplyBuffer)); //清空数组数据

}

主程序:
在系统启动时侦测LoRa端是否有数据近来
while (Serial1.available() > 0) //LORA端有资料进来
{

Re += char(Serial1.read());
delay(2);
}

if (Re.length())
{
Re.toCharArray(ReplyBuffer, 160);


Re = "";
Send(); //利用函式传出

}
                                           展示:
因为这个方案是利用ESP-32S将数据用UDP的方式丢出
所以接收端就非常自由,只要可以接收UDP讯号的设备都可以当作接收接口
在这里是用IBM开发的Node-Red去做画面演示

第一步:先将流程图一一拉出来设定好:
如下图


第二部就是将数据显示出来就大功告成了
如下图


附件档案列表



场景应用图

sceneryUrl

展示版照片

frontUrlbackUrl

方案方块图

funcUrl

方案方块图_2_Sensor

other1Url

核心技术优势

1: 感测器端 : 此处我们是使用 DHT22 (AM2303)模组,将温湿度的资料每两秒钟一次传送给微处理器处理。 2: 微处理器端 : 利用 ATMEGA328 微处理器之I/O 埠在接收到温湿度的资料以UART传送至LoRa模组。 3: LoRa无线传输端 : 使用协力厂商所制造之 S76S 模组,使用其高抗杂讯及高灵敏度特性来连接两通讯端。其通讯界面为UART,所以只要使用AT command就可以传送资料。 4: 接收端 : 使用ESP-32S这颗带MCU+Wifi+BT模组,将资料转成UDP讯号送出 5: 用户界面 : 使用者借由内部网路可在手机或是电脑端使用任何软体接收与显示资料。

方案规格

~~~ LoRa ~~~  型号: S76S  使用芯片 : SEMTECH LoRa SX1276 + ST STM32L073  频率 : 863-870, 902-928MHz  传输界面 : UART  UART波特率 : 38400/115200bps  工作电压 : 2.4V〜3.3V  电流消耗 : 接收:17.5 mA,发射:127 mA,睡眠:5uA  输出功率 : +20dBm  资料速率:146 ~ 37500bps  接收灵敏度 : 109 ~ -137dBm  工作温度 : -40°C~85°C  尺寸 :13毫米x 11毫米x 1.1毫米 ~~~ WiFi模组 ~~~  基于ESP32 芯片组  WiFi : 802.11g/n  频率 : 2.4GHz  天线 : 电路板天线  尺寸:14.3 x 24.8 x 3毫米  电流消耗 : 接收:80~90 mA, 发射(13dBm~21dBm):160 ~ 260 mA, 睡眠:0.15 ~ 0.9mA  工业温度范围为-40℃至+ 85℃

技术文档

类型标题档案
软件User Manual
软件Schematics