基于ACSip S76S使用LoRa技术的智慧家庭无线温湿度侦测方案
原标题:基于ACSip S76S使用LoRa技术的智慧家庭无线温湿度侦测方案
家庭智慧化是我们一直以来努力的目标,市面上也出现很多智慧的产品,大抵可以分为两类: 一类是大场作品如华硕、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去做画面演示
第一步:先将流程图一一拉出来设定好:
如下图
第二部就是将资料显示出来就大功告成了
如下图
附件档案列表
场景应用图
展示板照片
方案方块图
方案方块图_2_Sensor
核心技术优势
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℃
责任编辑:
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。