提示1:锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议。
提示2:您可以免费复制,修改和商用本项目,请注明锐米原创。
提示3:如果您有其他 LoRa 需求或建议,欢迎联系锐米 support@rimelink.com
LoRa 温湿度采集
采集温湿度,基于 LoRa 传送到服务器,通过 APP 查看数值和设置采样间隔。
物联网 Arduino LoRa LoRaWAN 温湿度采集
运行效果
如下图所示,上电启动后 LoRa 终端每 10 秒上报 8 字节温湿度数据(2 个浮点型,小端)。
当用户设置采样间隔 20 秒,App 向终端发送字符串“ST:P:20”(指令字符串 Set:Period:20 的缩写)。终端接收并解析该指令,随后它调整采样间隔到 20 秒。
项目介绍
温度和湿度是一种既常见又重要的环境参数,除了仓库,农业,工厂,机房外,如下图所示的场景更具重要意义。
温湿度场景一:医药冷链
温湿度场景二:食品保鲜
相比传统的产品,LoRa 温湿度终端具备的优点为:
- 安装简单便捷,不需要布线
- 远程采集,维保便捷
- 成本低廉,没有流量费用
- 超低功耗,2节5号电池工作数年
本项目开源设计 LoRa 温湿度终端的核心—软件和硬件,用户选择一个漂亮的外壳和电池,即可组成一个产品。
同时,简介了 LoRa 网络组件,轻松构建一个商用的温湿度物联网。
低成本快速开发
本项目基于 ArduinoLoRa 开源平台,它一种“革命性”解决方案,详情请链接:低成本快速开发 LoRa 终端:从 0 到 1
组件和材料
LoRa 开发板 x 1 采购链接
SHT20 x 1 采购链接
软件和网络
LoRa网关 采购链接
LoRaServer 下载链接
LoRaApp 下载链接
Arduino IDE 下载链接
技术细节
元器件介绍

LoRa 开发板遵循 LoRaWAN 国际标准,兼容 SX130x 八通道和 SX127x 单/双通道网关,接入 loraserver
软硬件 100% 兼容 Arduino,借助全球开源软件降低开发成本,串口下载程序(无须仿真器)。
它能达到空旷 10km 的通信距离,休眠电流仅 1.4uA。精心设计的软件库,使其开发极为容易:
- 发送数据
LoRa.write("123", 3);
- 接收数据
if (LoRa.availabe()) {
len = LoRa.read(buf, MAX_LEN);
}
SHT20 是瑞士 Sensirion 公司出口的温湿度传感器,大品牌,系列化,价格合适,使用者众多。
- 温度:-40~125℃,±0.3℃
- 湿度:0~100%RH,±3%RH
硬件接线
如下图所示,连接 LoRa 开发板 和 SHT20 模块
Arduino | 杜邦线 | SHT20 |
---|---|---|
3.3V | 红 | vcc |
GND | 黑 | gnd |
A4 | 绿 | sda |
A5 | 黄 | scl |
![]() |
通信逻辑
如下图所示,终端上报温湿度数据,App 下行控制终端的采样间隔。
为此,需要配置如下的网络组件:
行业第一的超低功耗—休眠仅 1.4uA
如下图所示(实物拍摄),LoRa 开发板的低功耗可达 1.4uA,这不仅是行业第一的超低功耗,而且达到了器件极限 ArduinoLoRa 休眠极限 1.4uA
如下图所示,2 节 5 号碱性电池容量约 2890mAH,因为温湿度短时间变化不大,设每 10 分钟采集,电池可工作近 6 年。
终端电池寿命计算器
Arduino 代码
编译本工程需要添加 LoRa 和 SHT20 驱动库,下载这 2 个库:
LoRa 驱动库
SHT20 驱动库
使用 Arduino IDE 打开工程,点击"Sketch / Include Library / Add .ZIP Library…"
Arduino 的 zip 库安装路径一般为:C:\Users\Administrator\Documents\Arduino\libraries
Arduino 的代码简洁,容易理解,下载链接
- DEBUG 为 0 正常模式:通过 LoRa 上报温湿度;为 1 调试模式:通过串口打印温湿度
- Sample() 从 SHT20 采集温湿度,通过 LoRa 发送到 App
- ParseCmd() 从 App 接收指令(格式=ST:P:xxx),解析并设置上报间隔秒数
- CvtInt() 将字符串(如“123”)转换成数值(如123)
#include "Wire.h"
#include "DFRobot_SHT20.h"
#include <lora.h>
lora LoRa;
DFRobot_SHT20 sht20;
#define MIN_PERIOD 10
unsigned int period = 10;
#define DEBUG 0
void setup()
{
sht20.initSHT20(); // Init SHT20 Sensor
delay(100); // for SHT20 initialize itself
Serial.begin(57600);
}
void loop()
{
Sample();
ParseCmd();
#if DEBUG
Serial.print("period: ");
Serial.print(period);
Serial.println(" seconds");
#endif
delay(period * 1000);
}
void Sample()
{
float array[2];
array[0] = sht20.readTemperature(); // Read Temperature
array[1] = sht20.readHumidity(); // Read Humidity
#if DEBUG
Serial.print("Temperature: ");
Serial.print(array[0]);
Serial.print("°C, Humidity: ");
Serial.print(array[1]);
Serial.println("%");
#else
LoRa.write(array, sizeof(array));
#endif
}
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