天天看點

【IoT應用創新大賽】基于LoRa的機房環境監控案例

【IoT應用創新大賽】基于LoRa的機房環境監控案例
【IoT應用創新大賽】基于LoRa的機房環境監控案例
【IoT應用創新大賽】基于LoRa的機房環境監控案例

基于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技術來實作對機房的環境參數的采集與控制是最節省資源的辦法。它的穿透力适合布局到整個辦公大樓。進而把它變成智慧建築是可行的。

【IoT應用創新大賽】基于LoRa的機房環境監控案例

LoRa網絡拓補圖

【IoT應用創新大賽】基于LoRa的機房環境監控案例

設計架構

【IoT應用創新大賽】基于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網關将資料上傳到物聯網雲平台,實作對終端裝置的控制和資料監控。

【IoT應用創新大賽】基于LoRa的機房環境監控案例

LoRa套件

2、LCD顯示

液晶屏是ST7735R,用于顯示實時采集的資料。例如溫度度,壓強,海拔等,以及控制的狀态訓示。采用模拟I2C的方式來實作寫指令。

【IoT應用創新大賽】基于LoRa的機房環境監控案例

LCD顯示采集的資料和控制狀态

3、繼電器設計

繼電器子產品主要用于220V交流電的開關,實作對電機或電燈的電源控制。電路中采用的是光耦進行電氣隔離,防止回流時對MCU的沖擊。依據這個電路,可以擴充出多路繼電器,實作控制各類裝置。

【IoT應用創新大賽】基于LoRa的機房環境監控案例

繼電器電路

【IoT應用創新大賽】基于LoRa的機房環境監控案例

繼電器電路實物

4、E53子產品應用

采用E53 SC1子產品,我是從小熊派物聯網開發套件中拿來用的。這個擴充子產品內建有LED路燈,光照強度傳感器BH1750以及EEPROM晶片24Cxx。我的設計思想是,通過光照強度傳感器檢測機房亮暗度來決定是否開啟應急燈的充電或開啟機房燈光,保證應急搶修的需要。同時把相關控制資訊存儲到EEPROM,實作曆史記錄的查詢。以下是子產品原理圖:

【IoT應用創新大賽】基于LoRa的機房環境監控案例

擴充子產品接口原理圖

【IoT應用創新大賽】基于LoRa的機房環境監控案例

光照強度傳感器原理圖

【IoT應用創新大賽】基于LoRa的機房環境監控案例

EEPROM原理圖

【IoT應用創新大賽】基于LoRa的機房環境監控案例

E53智慧路燈擴充子產品

5、LoRa節點整體外觀

右邊的兩個黑色按鍵和開發闆上的藍色按鍵分别實作LED路燈、繼電器和LCD背光的本地控制。設計思路是脫離網絡友善本地控制。

【IoT應用創新大賽】基于LoRa的機房環境監控案例

各個子產品拼湊起來的LoRa控制電路

二)、軟體設計

1、LoRa源碼實作

該套件可以很快實作上雲,通過官方提供的教程LoRa 溫濕度傳感器接入指引,打通資料連接配接,随後就是修改TencentOS tiny源碼中的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項目

【IoT應用創新大賽】基于LoRa的機房環境監控案例

建立項目

【IoT應用創新大賽】基于LoRa的機房環境監控案例

定義屬性

【IoT應用創新大賽】基于LoRa的機房環境監控案例

資料解析

【IoT應用創新大賽】基于LoRa的機房環境監控案例

實時檢視資料變化

3、微信小程式實作

小程式內建了LoRa裝置和NB裝置,這樣就可以切換頁面檢視并控制不同終端裝置。這個小程式是通過官方提供demo進行二次開發的。

【IoT應用創新大賽】基于LoRa的機房環境監控案例

小程式首頁面

【IoT應用創新大賽】基于LoRa的機房環境監控案例

LoRa模組小程式頁面

【IoT應用創新大賽】基于LoRa的機房環境監控案例

NB模組小程式頁面

四、總結

利用LoRa極強的穿透力,實作對樓層中的機房環境進行監控。它安裝友善,節省了人力物力和财力。是以LoRa物聯網應用于機房或建設智慧建築有先天的優勢。如果使用NB模組,每年都要換卡或者繳費。使用WIFI裝置呢,穿透力不夠強,距離沒有LoRa傳輸得遠。

本案例需要增強改進的地方是,檢測機房斷路器通斷,交流接觸器動作等器件的工作狀态。也可以直接和PLC控制器進行通訊,直接讀取PLC采集的資料,然後通過LoRa上傳資料。

備注:LoRa節點源碼和微信小程式源碼及PPT文檔連結:https://share.weiyun.com/5u2vejl 密碼:8szgyr

源碼說明:源碼中需要搭配TencentOS tiny源碼架構,隻需要覆寫原來的lorawan案例的源碼和rhf76的頭檔案。