![156809d649895bff914b1e9f9dc9420d.png](https://i-blog.csdnimg.cn/blog_migrate/0df2509a4f06e6198b8ff220d68a2393.jpeg)
一、概述
LoRa是semtech公司创建的低功耗局域网无线标准,我们知道,低功耗一般很难覆盖远距离,而远距离一般功耗高,LoRa的名字翻译就是远距离无线电(Long Range Radio),它最大特点就是在同样的功耗条件下比其他无线方式传播的距离更远,实现了低功耗和远距离的统一,它在同样的功耗下比传统的无线射频通信距离扩大3-5倍。 LoRa在物联网应用中的无线技术有多种,可组成局域网或广域网。LoRa网络主要由终端(可内置LoRa模块)、网关(或称基站)、Server和云四部分组成。 LoRaWAN的数据传输速率范围为0.3 kbps至37.5 kbps,为了最大化终端设备电池的寿命和整个网络容量,LoRaWAN网络服务器通过一种速率自适应(Adaptive Data Rate , ADR)方案来控制数据传输速率和每一终端设备的射频输出功率。二、方案设计
本案例将通过LoRa技术实现对机房的环境检测与控制。 一般情况下,一个企业的机房很少连接网络,即使连接网络了,也要花费不小的费用进行设备和线路的安装。例如使用宽带时要走网线,距离短,机房少可能还好,如果机房较多,距离较长,那么安装成本和人工成本就会迅速增加。如果安装无线路由器,方法虽然可行,但是穿透力差,信号有时连接不上,想要增强信号,就要增加设备。 至于NB模组,如果信号良好,会是不错之选。目前仍然有许多城市或者乡镇没有覆盖NB-IoT信号。所以NB模组适用于一些大城市。我们要想知道是否覆盖物联网信号,就看这个城市是否有共享单车。比如我所在的海南省,除了地级市,其他县级市基本没有覆盖物联网,因为那里没有共享单车。 LoRa有远距离、低功耗以及低成本等优势。LoRa的传输距离范围长达15至20公里,低功耗的特性延长了电池使用寿命,免牌照的频段、基础设施以及节点/终端的低成本,以上特性都使LoRa的使用成本大幅降低。 所以就机房或者整栋建筑大楼这个特定区域来讲,采用LoRa技术来实现对机房的环境参数的采集与控制是最节省资源的办法。它的穿透力适合布局到整个办公大楼。从而把它变成智慧建筑是可行的。![a2922dd1b6f07292ee6a3d80e2627d88.png](https://i-blog.csdnimg.cn/blog_migrate/7c20e3fd754dda213af5fd24f7b40905.png)
三、方案实现
首先参考教程 基于 TencentOS tiny 的 LoRaWAN 开发入门指南 [1] 的介绍完成开发环境搭建,包括 MDK 软件的安装及配置、ST-Link 驱动安装、串口软件的安装。 1. 硬件设计 (1)LoRa套件 本方案采用P-NUCLEO-LRWAN3套件,包括网关和节点,可用于评估LoRaWAN网络。使用该套件,用户可以轻松设置LPWAN网络,帮助用户学习LoRaWAN技术,了解如何在自己的应用程序中使用LoRaWAN技术。LoRa网关套件由ST Nucleo-F746ZG底板和瑞兴恒方基于SX1301的LRWAN_GS模块组成。 ST Nucleo LoRa节点套件由LRWAN_NS1扩展板和ST Nucleo-L073底板组成。其中 LRWAN_NS1扩展板集成瑞兴恒方的RHF0M003 LoRaWAN模组,并集成了温湿度传感器HTS221、气压传感器LPS22HB、3轴磁力传感器LIS3MDL、6轴姿态传感器LSM6DS3共4个I2C传感器件。 LoRa节点采集的数据通过LoRa网关将数据上传到物联网云平台,实现对终端设备的控制和数据监控。uint16_t report_period = 1;
bool report_power_switch=0;
bool report_motor_fan=0;
float report_pressure=0;
float report_height=0;
float first_pressure=0;
float first_height=0;
extern float pressure_hPa;
extern float temperature_degC;
extern float height;
typedef struct device_data_st {
uint8_t temperature;
uint8_t humidity;
uint16_t period;
unsigned int quantity;
bool power_switch;
bool motor_fan;
float pressure;
float height;
} __PACKED__ dev_data_t;
以下是按键任务,功能是进行普通的按键扫描,检测到相应按键后进行相应控制,同时把相关的控制状态通过LCD显示出来并反馈到云端。
void key_task(void *arg)
{
int lcd_back_flag=1;
while(1)
{
tos_task_delay(10);
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)
{
tos_task_delay(100);
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)
{
lcd_back_flag=~lcd_back_flag;
if(lcd_back_flag==1)
{
LCD_LED_CLR;//关闭LCD背光
}
else
{
LCD_LED_SET;//开LCD背光
}
}
}
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)
{
tos_task_delay(100);
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)
{
if(report_power_switch==1)
{
report_power_switch=0;
HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_RESET);
printf("LED OFF: %d\n",report_power_switch);
Gui_DrawFont_GBK16(5,125,RED,BLACK ,(uint8_t*)"LED:OFF ");
}
else
{
report_power_switch=1;
HAL_GPIO_WritePin(LD2_GPIO_Port,LD2_Pin,GPIO_PIN_SET);
printf("LED OFF: %d\n",report_power_switch);
Gui_DrawFont_GBK16(5,125,GREEN,BLACK ,(uint8_t*)"LED:ON ");
}
}
}
if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==GPIO_PIN_RESET)
{
tos_task_delay(100);
if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)==GPIO_PIN_RESET)
{
if(report_motor_fan==1)
{
report_motor_fan=0;
HAL_GPIO_WritePin(MOTOR_GPIO_Port,MOTOR_Pin,GPIO_PIN_RESET);
printf("motor_fan OFF: %d\n", report_motor_fan);
Gui_DrawFont_GBK16(5,140,RED,BLACK,(uint8_t*)"Motor:OFF ");
}
else
{
report_motor_fan=1;
HAL_GPIO_WritePin(MOTOR_GPIO_Port,MOTOR_Pin,GPIO_PIN_SET);
printf("motor_fan ON: %d\n", report_motor_fan);
Gui_DrawFont_GBK16(5,140,GREEN,BLACK,(uint8_t*)"Motor:ON ");
}
}
}
}
}
主任务函数,该任务实现LoRa连接到网关,检测连接状态,定时上报数据以及一些需要换算的参数。
void application_entry(void *arg)
{
printf("APP RUNNING...\r\n");
float report_temperature;
int16_t temperature;
int16_t report_humidity;
unsigned int quantity=0;
uint16_t sum1=0;
char temp[]={0};
Lcd_Init();
LCD_LED_SET;
Lcd_Clear(BLACK);
Gui_DrawFont_GBK16(10,5,RED,BLACK ,"TencentOS Tiny");
Gui_DrawFont_GBK16(10,20,YELLOW,BLACK,"LoRa Node NO.1");
LPS22HB_Init();
HTS221_Init();
#ifdef LORA_REPORT
Gui_DrawFont_GBK16(5,35,RED,BLACK,"LoRa Linking...");
rhf76_lora_init(HAL_UART_PORT_1);
tos_lora_module_recvcb_register(recv_callback);
if(tos_lora_module_join_otaa("8cf957200000f87e", "8cf957200000f87e9239aaaaad204a72")==-1)
{
Gui_DrawFont_GBK16(5,35,RED,BLACK, " Link GW Error! ");
report_period=60;
}
else
{
Gui_DrawFont_GBK16(5,35,GREEN,BLACK," Link GW OK! ");
}
Gui_DrawFont_GBK16(5,125,RED,BLACK,"LED:OFF ");
Gui_DrawFont_GBK16(5,140,RED,BLACK,"Motor:OFF ");
#endif
example_main_one_shot_lps22hb();
first_pressure=pressure_hPa;
first_height=height;
while (1)
{
printf("------LoRawan sensor board data------\n");
Gui_DrawFont_GBK16(5,50,YELLOW,BLACK,"---------------");
example_main_one_shot_lps22hb();
HTS221_Get_Temperature(&temperature);
HTS221_Get_Humidity(&report_humidity);
report_temperature= temperature_degC;
report_height=(height-first_height)*1000;
if(pressure_hPa<0)
report_pressure=-pressure_hPa*100;
else
report_pressure=pressure_hPa*100;
sprintf(temp,"Temp:%2.1f ",report_temperature);
Gui_DrawFont_GBK16(5,65,WHITE,BLACK,temp);
sprintf(temp,"Humi:%2.1f ", report_humidity / 10.0);
Gui_DrawFont_GBK16(5,80,WHITE,BLACK,temp);
sprintf(temp,"Pa:%2.2f ",pressure_hPa);
Gui_DrawFont_GBK16(5,95,WHITE,BLACK,temp);
sprintf(temp,"Height:%d ", (int)report_height);
Gui_DrawFont_GBK16(5,110,WHITE,BLACK,temp);
printf("LPS22HB_pressure[hPa]:%0.2f,height[mm]:%d\r\n", pressure_hPa,(int)report_height);
printf("LPS22HB_temperature [degC]:%0.2f\r\n",report_temperature);
printf("HTS221_temperature : %2.1f\n", temperature/10.0);
printf("HTS221_humidity : %2.1f\n", report_humidity / 10.0);
sum1++;
printf("sum:%d\r\n",sum1);
tos_task_delay(500);
#ifdef LORA_REPORT
if(sum1>=report_period)
{
sum1=0;
quantity++;
printf("quantity : %d\n", quantity);
printf("LED_Status : %d\n",report_power_switch);
printf("motor_Status: %d\n",report_motor_fan);
dev_data_wrapper.u.dev_data.temperature = report_temperature;
dev_data_wrapper.u.dev_data.humidity = report_humidity / 10;
dev_data_wrapper.u.dev_data.period = report_period;
dev_data_wrapper.u.dev_data.quantity = quantity;
dev_data_wrapper.u.dev_data.power_switch= report_power_switch;
dev_data_wrapper.u.dev_data.motor_fan = report_motor_fan;
dev_data_wrapper.u.dev_data.pressure = report_pressure;
dev_data_wrapper.u.dev_data.height = report_height;
tos_lora_module_send(dev_data_wrapper.u.serialize, sizeof(dev_data_t));
}
#endif
}
}
(2)云平台实现
登陆iotexplorer平台即可快速创建LoRa项目
四、总结
利用LoRa极强的穿透力,实现对楼层中的机房环境进行监控。它安装方便,节省了人力物力和财力。所以LoRa物联网应用于机房或建设智慧建筑有先天的优势。如果使用NB模组,每年都要换卡或者缴费。使用WIFI设备呢,穿透力不够强,距离没有LoRa传输得远。 本案例需要增强改进的地方是,检测机房断路器通断,交流接触器动作等器件的工作状态。也可以直接和PLC控制器进行通讯,直接读取PLC采集的数据,然后通过LoRa上传数据。 参考资料: [1] 基于 TencentOS tiny 的 LoRaWAN 开发入门指南: https://github.com/Tencent/TencentOS-tiny/blob/master/doc/16.TencentOS_tiny_LoRaWAN_Getting_Started_Guide.md [2] LoRa 温湿度传感器接入指引: https://cloud.tencent.com/document/product/1081/41112?from=10680 [3] LoRa节点源码和微信小程序源码及PPT链接: https://share.weiyun.com/5u2vejl 密码:8szgyr [4] 源码说明:源码中需要搭配TencentOS tiny的框架,只需要覆盖原来原来的lorawan案例的源码和rhf76的头文件。推荐阅读
我们用区块链技术保护了1000万篇原创文章
![ecd1dd720f616f6f3402168071d65b6f.gif](https://i-blog.csdnimg.cn/blog_migrate/31aa358fb2dfe74e0350b98faa086952.gif)