前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【IoT应用创新大赛】基于LoRa的机房环境监控案例

【IoT应用创新大赛】基于LoRa的机房环境监控案例

原创
作者头像
极速紫韵
修改2020-04-16 19:07:34
4.8K0
修改2020-04-16 19:07:34
举报
文章被收录于专栏:腾讯云IoT
基于LoRa的机房环境监控.pptx

视频演示:

PPT讲解+实验演示+机房现场测试

一、概述

LoRa是semtech公司创建的低功耗局域网无线标准,低功耗一般很难覆盖远距离,远距离一般功耗高,LoRa的名字就是远距离无线电(Long Range Radio),它最大特点就是在同样的功耗条件下比其他无线方式传播的距离更远,实现了低功耗和远距离的统一,它在同样的功耗下比传统的无线射频通信距离扩大3-5倍。

LoRa技术是物联网应用中的无线技术有多种,可组成局域网或广域网。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技术来实现对机房的环境参数的采集与控制是最节省资源的办法。它的穿透力适合布局到整个办公大楼。从而把它变成智慧建筑是可行的。

LoRa网络拓补图
LoRa网络拓补图
设计框架
设计框架
智慧建筑
智慧建筑

三、方案实现

请参考教程基于 TencentOS tiny 的 LoRaWAN 开发入门指南 的介绍完成开发环境搭建,包括 MDK 软件的安装及配置、ST-Link 驱动安装、串口软件的安装。

一)、硬件设计

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网关将数据上传到物联网云平台,实现对终端设备的控制和数据监控。

LoRa套件
LoRa套件

2、LCD显示

液晶屏是ST7735R,用于显示实时采集的数据。例如温度度,压强,海拔等,以及控制的状态指示。采用模拟I2C的方式来实现写指令。

LCD显示采集的数据和控制状态
LCD显示采集的数据和控制状态

3、继电器设计

继电器模块主要用于220V交流电的开关,实现对电机或电灯的电源控制。电路中采用的是光耦进行电气隔离,防止回流时对MCU的冲击。依据这个电路,可以扩展出多路继电器,实现控制各类设备。

继电器电路
继电器电路
继电器电路实物
继电器电路实物

4、E53模块应用

采用E53 SC1模块,我是从小熊派物联网开发套件中拿来用的。这个扩展模块集成有LED路灯,光照强度传感器BH1750以及EEPROM芯片24Cxx。我的设计思想是,通过光照强度传感器检测机房亮暗度来决定是否开启应急灯的充电或开启机房灯光,保证应急抢修的需要。同时把相关控制信息存储到EEPROM,实现历史记录的查询。以下是模块原理图:

扩展模块接口原理图
扩展模块接口原理图
光照强度传感器原理图
光照强度传感器原理图
EEPROM原理图
EEPROM原理图
E53智慧路灯扩展模块
E53智慧路灯扩展模块

5、LoRa节点整体外观

右边的两个黑色按键和开发板上的蓝色按键分别实现LED路灯、继电器和LCD背光的本地控制。设计思路是脱离网络方便本地控制。

各个模块拼凑起来的LoRa控制电路
各个模块拼凑起来的LoRa控制电路

二)、软件设计

1、LoRa源码实现

该套件可以很快实现上云,通过官方提供的教程LoRa 温湿度传感器接入指引,打通数据连接,随后就是修改TencentOS tiny源码中的LoRa案例。

以下是需要上报云端的参数,注意参数的顺序要和云端解析顺序一致,否则会解码失败而读到错误的数据。

代码语言:c
复制
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显示出来并反馈到云端。

代码语言:javascript
复制
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连接到网关,检测连接状态,定时上报数据以及一些需要换算的参数。

代码语言:javascript
复制
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项目

建立项目
建立项目
定义属性
定义属性
数据解析
数据解析
实时查看数据变化
实时查看数据变化

3、微信小程序实现

小程序集成了LoRa设备和NB设备,这样就可以切换页面查看并控制不同终端设备。这个小程序是通过官方提供demo进行二次开发的。

小程序主页面
小程序主页面
LoRa模组小程序页面
LoRa模组小程序页面
NB模组小程序页面
NB模组小程序页面

四、总结

利用LoRa极强的穿透力,实现对楼层中的机房环境进行监控。它安装方便,节省了人力物力和财力。所以LoRa物联网应用于机房或建设智慧建筑有先天的优势。如果使用NB模组,每年都要换卡或者缴费。使用WIFI设备呢,穿透力不够强,距离没有LoRa传输得远。

本案例需要增强改进的地方是,检测机房断路器通断,交流接触器动作等器件的工作状态。也可以直接和PLC控制器进行通讯,直接读取PLC采集的数据,然后通过LoRa上传数据。

备注:LoRa节点源码和微信小程序源码及PPT文档链接:https://share.weiyun.com/5u2vejl 密码:8szgyr

源码说明:源码中需要搭配TencentOS tiny源码框架,只需要覆盖原来的lorawan案例的源码和rhf76的头文件。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
物联网开发平台
腾讯云物联网开发平台(IoT Explorer)是面向智慧生活与产业物联应用的一站式物联网PaaS平台,为各行业用户提供一站式设备智能化服务。平台提供海量设备连接与消息通信能力,基于腾讯连连小程序应用开发能力、音视频能力及AI增值服务,聚合腾讯生态内容能力。提升传统行业设备智能化的效率,降低用户的开发运维成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档