花 1 小时,开源设计 LoRa 温湿度终端

提示1:锐米所有 LoRa 产品严格遵循国际标准的 LoRaWAN 协议
提示2:您可以免费复制,修改和商用本项目,请注明锐米原创
提示3:如果您有其他 LoRa 需求或建议,欢迎联系锐米 support@rimelink.com

LoRa温湿度终端

LoRa 温湿度采集

采集温湿度,基于 LoRa 传送到服务器,通过 APP 查看数值和设置采样间隔。
物联网 Arduino LoRa LoRaWAN 温湿度采集

运行效果

如下图所示,上电启动后 LoRa 终端每 10 秒上报 8 字节温湿度数据(2 个浮点型,小端)。
当用户设置采样间隔 20 秒,App 向终端发送字符串“ST:P:20”(指令字符串 Set:Period:20 的缩写)。终端接收并解析该指令,随后它调整采样间隔到 20 秒。
App运行效果

项目介绍

温度和湿度是一种既常见又重要的环境参数,除了仓库,农业,工厂,机房外,如下图所示的场景更具重要意义。

温湿度场景一:医药冷链
温湿度场景一:医药冷链
温湿度场景二:食品保鲜
温湿度场景二:食品保鲜
相比传统的产品,LoRa 温湿度终端具备的优点为:

  • 安装简单便捷,不需要布线
  • 远程采集,维保便捷
  • 成本低廉,没有流量费用
  • 超低功耗,2节5号电池工作数年

本项目开源设计 LoRa 温湿度终端的核心—软件和硬件,用户选择一个漂亮的外壳和电池,即可组成一个产品。
同时,简介了 LoRa 网络组件,轻松构建一个商用的温湿度物联网。

低成本快速开发

本项目基于 ArduinoLoRa 开源平台,它一种“革命性”解决方案,详情请链接:低成本快速开发 LoRa 终端:从 0 到 1

组件和材料

LoRa 开发板 x 1 采购链接


温湿度传感器SHT20 x 1 采购链接

软件和网络

LoRa网关 LoRa网关 采购链接


LoRaServerLoRaServer 下载链接


LoRaAppLoRaApp 下载链接


Arduino IDEArduino 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.3Vvcc
GNDgnd
A4绿sda
A5scl

接线图


实物全景

通信逻辑

如下图所示,终端上报温湿度数据,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 禁止调试功能;设置为 1 它将通过 8 和 9 两个引脚打印调试信息(使用“USB转串口”连接到 PC)
  • 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

#if DEBUG
#include <SoftwareSerial.h>
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