提示1:锐米所有 LoRa 产品严格遵循国标标准的 LoRaWAN 协议。
提示2:您可以免费复制,修改和商用本项目,请注明锐米原创。
提示3:如果您有其他 LoRa 需求或建议,欢迎联系锐米 [email protected]
采集温湿度,基于 LoRa 传送到服务器,通过 APP 查看数值和设置采样间隔。
**物联网 Arduino LoRa LoRaWAN 温湿度采集 **
如下图所示,上电启动后 LoRa 终端每 10 秒上报 8 字节温湿度数据(2 个浮点型,小端)。
当用户设置采样间隔 20 秒,App 向终端发送字符串“ST:P:20”(指令字符串 Set:Period:20 的缩写)。终端接收并解析该指令,随后它调整采样间隔到 20 秒。
温度和湿度是一种既常见又重要的环境参数,除了仓库,农业,工厂,机房外,如下图所示的场景更具重要意义。
温湿度场景一:医药冷链
温湿度场景二:食品保鲜
相比传统的产品,LoRa 温湿度终端具备的优点为:
本项目开源设计 LoRa 温湿度终端的核心—软件和硬件,用户选择一个漂亮的外壳和电池,即可组成一个产品。
同时,简介了 LoRa 网络组件,轻松构建一个商用的温湿度物联网。
本项目基于 ArduinoLoRa 开源平台,它一种“革命性”解决方案,详情请链接:低成本快速开发 LoRa 终端:从 0 到 1
LoRa 扩展板 x 1 采购链接
Arduino UNO x 1 采购链接
SHT20 x 1 采购链接
天线 x 1 采购链接
杜邦线 x 4 采购链接
LoRa网关 采购链接
LoRaServer 下载链接
LoRaApp 下载链接
Arduino IDE 下载链接
这是专为 Arduino 而设计的 LoRa 扩展板,既可以安装在 Arduino UNO 上,也能使用杜邦线连接到 Arduino Pro Mini。
它能达到空旷 10km 的通信距离,休眠电流仅 1.3uA。精心设计的软件库,使其开发极为容易:
LoRa.write("123", 3);
if (LoRa.availabe()) {
len = LoRa.read(buf, MAX_LEN);
}
Arduino UNO 是最常用的开发板,它便宜简单,接线方便。
SHT20 是瑞士 Sensirion 公司出口的温湿度传感器,大品牌,系列化,价格合适,使用者众多。
470MHz 高频胶棒天线,增益 3.5dB,特别适合中国 LoRa 频段范围(470~510MHz)。
如下图所示,使用公对母的杜邦线连接 Arduino 和 SHT20 模块
Arduino | 杜邦线 | SHT20 |
---|---|---|
3.3V | 红 | vcc |
GND | 黑 | gnd |
A4 | 绿 | sda |
A5 | 黄 | scl |
如下图所示,终端上报温湿度数据,App 下行控制终端的采样间隔。
为此,需要配置如下的网络组件:
如下图所示(实物拍摄),Arduino LoRa+ 的低功耗可达 1.4uA,这不仅是行业第一的超低功耗,而且达到了器件极限 ArduinoLoRa 休眠极限 1.4uA
如下图所示,2 节 5 号碱性电池容量约 2890mAH,因为温湿度短时间变化不大,设每 10 分钟采集,电池可工作近 6 年。
终端电池寿命计算器
编译本工程需要添加 LoRa 和 SHT20 驱动库,下载这 2 个库:
LoRa 驱动库
SHT20 驱动库
使用 Arduino IDE 打开工程,点击"Sketch / Include Library / Add .ZIP Library…"
Arduino 的 zip 库安装路径一般为:C:\Users\Administrator\Documents\Arduino\libraries
Arduino 的代码简洁,容易理解,下载链接
#include "Wire.h"
#include "DFRobot_SHT20.h"
#include
lora LoRa;
DFRobot_SHT20 sht20;
#define MIN_PERIOD 10
unsigned int period = 10;
#define DEBUG 0
#if DEBUG
#include
SoftwareSerial debugSerial(8, 9); // 8=RX, 9=TX
#endif
void setup()
{
sht20.initSHT20(); // Init SHT20 Sensor
delay(100); // for SHT20 initialize itself
Serial.begin(115200);
#if DEBUG
debugSerial.begin(9600); // start software serial port at 9600-8-N-1
#endif
}
void loop()
{
Sample();
ParseCmd();
#if DEBUG
debugSerial.println(period);
#endif
delay(period * 1000);
}
void Sample()
{
float array[2];
array[0] = sht20.readTemperature(); // Read Temperature
array[1] = sht20.readHumidity(); // Read Humidity
LoRa.write(array, sizeof(array));
}
void ParseCmd()
{
#define MAXINSZ 9 // like as: ST:P:xxx
char instr[MAXINSZ]; // Input buffer
int len;
if (LoRa.available() == 0) {
return;
}
len = LoRa.read(instr, MAXINSZ);
if (('S' == instr[0]) && ('T' == instr[1]) && (':' == instr[2]) && ('P' == instr[3]) && (':' == instr[4])) { // match the "ST:P:"
period = CvtInt(instr, 5, len);
if (period < MIN_PERIOD) {
period = MIN_PERIOD;
}
}
}
// Convert ASCII digit character to numeric value by subtracting
// 0x30 ('0'), and mult by decade position (i.e. 1, 10, or 100).
// Will not convert numbers larger than 999.
int CvtInt(char *strval, int strt, int slen)
{
int intval;
if ((slen - strt) == 1) {
intval = strval[strt] - '0';
}
else if ((slen - strt) == 2) {
intval = ((strval[strt] - '0') * 10) + (strval[strt+1] - '0');
}
else if ((slen - strt) == 3) {
intval = ((strval[strt] - '0') * 100) + ((strval[strt+1] - '0') * 10) + (strval[strt+2] - '0');
}
else
intval = 0;
return intval;
}
批量生产的一些技术挑战:尺寸,成本,功耗,烧录,升级。
我们为您准备好解决方案:低成本快速开发LoRa终端:从1到10000