基于STM32+SIM800C+華為云IoT設計的森林火災預警系統(聯動控制)

      網友投稿 755 2022-05-30

      1. 功能介紹

      自從地球上出現森林以來,每年平均發生森林火災超過20萬次。森林火災不僅燒毀樹木,直接減少森林面積,而且嚴重破壞森林結構和森林環境,導致森林生態系統失衡,森林生物量下降,生產力下降,牲畜減少和鳥類減少,甚至犧牲一些重要東西。高強度的火災會破壞土壤的化學和物理性質,降低水的積累和土壤,使部分林區地下水位升高而潰敗,造成沼澤;此外,通過焦化和使土壤表面變暖,也會加速焦土的干燥,導致雜草過度生長。近年來,世界各地每年都會發生許多火災。大多數國家的火災直接損失超過國民經濟總量的0.2%。事實上,除了直接的經濟死亡和財產損失外,火災后還有重大的間接損失,因此,有必要發展和加強防火和火災報警。

      這篇文章就采用華為云iot物聯網平臺快速搭建一個森林火災預警聯動控制系統模型,模擬演示檢測到森林火災之后,如何快速上報到云平臺,向關聯的指定服務器發送數據報告,并自動向抽水泵發送指令,打開開關抽水滅火。

      硬件平臺介紹:

      MCU: STM32F103ZET6

      物聯網云平臺: 華為IOT云平臺

      氣體檢測傳感器: MQ2-煙霧傳感器、MQ135-空氣質量檢測傳感器

      火焰檢測: 采用火焰檢測傳感器

      抽水機: 采用直流電機模擬水泵,打開開關抽水噴水滅火

      上網網卡: 采用GSM模塊SIM800C,使用的是物聯網專用卡,包年只能上網這種。

      與云端服務器的通信協議: 終端設備采用MQTT3.1.1協議與華為云服務器進行登錄連接。

      溫濕度檢測傳感器: DHT11

      供電方式: 電池+太陽能供電

      為了演示聯動控制,火警(煙霧)檢測裝置和滅火(直流電機)裝置分為兩個獨立的設備,分別連接上云端。

      火警檢測裝置連接上物聯網服務器之后,可以在服務器上配置數據處理規則,如果煙霧濃度超標,可以自動向滅火裝置發送指令,進行滅火操作。服務器收到火警檢測裝置上傳的煙霧濃度、空氣質量等數據后,可以向自己的私有服務器轉發數據,方便自己服務器收到數據后做分析存儲處理,比如: 向指定郵箱發送郵件、手機APP推送通知欄、向指定用戶推送短消息提示等等。

      2. 創建產品(火警預警裝置)

      打開官網鏈接:??https://www.huaweicloud.com/s/JeeJqeiBlOe9kSU

      (1)選擇設備接入IotTDA選項。

      (2)選擇免費試用。

      (3)在產品頁面選擇創建新的產品。

      (4)填入產品信息,創建產品

      (5)選擇自己剛才創建的產品,創建數據模型,點擊自定義模型

      (6)選擇添加屬性

      這個添加的屬性就是設備端上報的數據類型。 比如: MQ2煙霧傳感器檢測的煙霧數據值類型。

      在這個頁面上還有一個添加命令的功能,這是用于云端下發指令給設備端使用的。當前這個設備是火警檢測裝置,只需要上報數據給服務器,不需要下發指令,這里就只需要添加屬性就行了。

      根據自己的設備的具體情況填寫即可,如果上報的數據有多種類型就創建多個屬性。

      3. 創建產品(滅火裝置)

      創建的流程和上面一樣,這是多增加了一個命令下發的功能,方便云端遠程控制電機開啟和關閉,實現滅火功能。

      (1)創建產品

      (2)產品創建完畢之后,添加服務器ID

      (3)添加屬性,電機屬性是可以讀可以寫的,范圍設置為0和1,只能開關

      (4)添加命令,這個命令用于云端遠程向設備下發指令,設備收到指令后可以做出相應的邏輯處理

      接著選擇新增輸入參數:

      最后點擊確定即可。

      現在產品已經創建完畢。

      4. 創建設備(火警預警裝置)

      (1)在設備頁面,選擇注冊設備,選擇自己的對應的產品,設備標識碼一般填自己設備的硬件標號。

      (2)設備創建成功之后會彈出彈窗,點擊保存并關閉,會自動彈出下載窗口,是個文本文件,存放了密匙信息

      登錄后復制

      { "device_id": "61bacdc02b2aa20288c5a094_QQ1126626497", "secret": "1126626497" }

      5. 創建設備(滅火裝置)

      流程與上面火警預警裝置設備一樣的。

      登錄后復制

      { "device_id": "61bad0564d9b020287193be2_QQ1126626497", "secret": "1126626497" }

      6. 生成MQTT協議登錄ID和密匙

      設備創建完成接來下生成MQTT登錄賬號、密匙,方便設備登錄云端平臺。

      官網工具地址:??https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

      填入剛才創建設備時,保存下載文件里的信息,對著彈窗填入,最后生成了ID、用戶名、pass參數,用于MQTT協議登錄使用。

      (1)火警預警裝置生成登錄參數

      登錄后復制

      ClientId 61bacdc02b2aa20288c5a094_QQ1126626497_0_0_2021121605 Username 61bacdc02b2aa20288c5a094_QQ1126626497 Password 43ed43bcbddc48772694fc2b18ec1112170f4d6cc52fbf1e01401c2ea1748475

      (2)滅火裝置

      登錄后復制

      ClientId 61bad0564d9b020287193be2_QQ1126626497_0_0_2021121605 Username 61bad0564d9b020287193be2_QQ1126626497 Password 43ed43bcbddc48772694fc2b18ec1112170f4d6cc52fbf1e01401c2ea1748475

      7. 上報屬性格式與主題訂閱格式

      產品設備、MQTT登錄參數都到位了,接下來需要了解設備向服務器上報數據時,如何上報,格式是怎么樣的。

      (1)第一個問題是:華為云IoT物聯網服務器的IP和端口號是多少?

      在總覽選項頁面,點擊多協議接入選項,就能看到了。

      如果選擇MQTT協議接入:

      登錄后復制

      域名是: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com 如果你的設備不能解析域名,也可以直接填IP地址 121.36.42.100 端口號: 1883

      (2)第二個問題是:發布數據的主題和訂閱數據的主題怎么填?

      在產品頁面,選擇自己的產品,進去之后就能看到主題的格式介紹頁面了。

      為了方便后續復制粘貼,這里總結下格式:

      火警預警裝置:

      登錄后復制

      格式: $oc/devices/{device_id}/sys/messages/down //訂閱主題: 平臺下發消息給設備 $oc/devices/61bacdc02b2aa20288c5a094_QQ1126626497/sys/messages/down 格式: $oc/devices/{device_id}/sys/properties/report //設備上報數據 $oc/devices/61bacdc02b2aa20288c5a094_QQ1126626497/sys/properties/report

      滅火裝置:

      登錄后復制

      格式: $oc/devices/{device_id}/sys/messages/down //訂閱主題: 平臺下發消息給設備 $oc/devices/61bad0564d9b020287193be2_QQ1126626497/sys/messages/down 格式: $oc/devices/{device_id}/sys/properties/report //設備上報數據 $oc/devices/61bad0564d9b020287193be2_QQ1126626497/sys/properties/report

      (3)第三個問題是:上報屬性時,數據格式是什么?

      官方文檔介紹:??https://support.huaweicloud.com/devg-iothub/iot_01_2127.html

      總結下格式:?上報的數據就是JSON格式,一次性可以上傳多個屬性數據,JSON數組里按照順序增加即可。

      重要的字段含義解釋:這兩個字段后面的數據需要自己根據自己的設備產品去填充的。

      登錄后復制

      service_id 示設備服務的ID。 properties 是設備服務的屬性列表,具體字段在設備關聯的產品模型中定義。

      火警預警裝置上傳的數據:

      登錄后復制

      {"services": [{"service_id": "MQ2","properties":{"MQ2":100}}]}

      滅火裝置上傳的數據:

      登錄后復制

      {"services": [{"service_id": "motor","properties":{"motor":1}}]}

      8. 使用MQTT客戶端模擬設備測試

      (1)登錄火警預警裝置

      (2)滅火裝置登錄

      可以看到,設備已經成功登錄服務器,完成了數據上報。這也證明服務器端設備創建已經全部OK,正常。

      9. 配置設備聯動

      (1)創建規則

      (2)填寫規則信息

      (3)添加觸發條件,選擇需要處理數據的設備,設置條件:當煙霧濃度大于等于100就觸發

      (4)添加執行動作,當煙霧濃度超過100就下發指令給滅火裝置

      (3)最后點擊創建規則,生效規則

      (4)測試效果

      使用兩個MQTT客戶端分別模擬火警預警裝置和滅火裝置,當煙霧濃度超過100時,查看滅火裝置是否收到云端下發的指令。

      10. 數據轉發

      如果數據需要轉發到其他地方,可以自己創建規則配置。

      基于STM32+SIM800C+華為云IoT設計的森林火災預警系統(聯動控制)

      11. 硬件設備測試

      設備端采用GSM模塊SIM800C完成上網功能,主控MCU采用STM32F103ZET6。

      任意只要能上網的設備都可以使用當前代碼連接服務器,因為當前模擬的是戶外設備,只能采用GSM模塊上網。

      如果是智能家居,屋里小區的設備,有WIFI的可以采用ESP8266這些無線網卡。

      代碼校對較多,這里只貼出核心代碼,需要完整工程的在評論區留言。

      1. SIM800C.c

      這是SIM800C的配置代碼

      登錄后復制

      #include "sim800c.h" /* 函數功能:向SIM800C模塊發送指令 函數參數: char *cmd 發送的命令 char *check_data 檢測返回的數據 返回值: 0表示成功 1表示失敗 */ u8 SIM800C_SendCmd(char *cmd,char *check_data) { u16 i,j; for(i=0;i<5;i++) //測試的總次數 { USART2_RX_FLAG=0; USART2_RX_CNT=0; memset(USART2_RX_BUFF,0,sizeof(USART2_RX_BUFF)); USART_X_SendString(USART2,cmd); //發送指令 for(j=0;j<500;j++) //等待的時間(ms單位) { if(USART2_RX_FLAG) { USART2_RX_BUFF[USART2_RX_CNT]='\0'; if(strstr((char*)USART2_RX_BUFF,check_data)) { return 0; } else break; } delay_ms(20); //一次的時間 } } return 1; } /* 函數 功能:GSM模塊初始化檢測 函數返回值:1表示模塊檢測失敗,0表示成功 */ u8 SIM800C_InitCheck(void) { if(SIM800C_SendCmd("AT\r\n","OK"))return 1; else printf("SIM800模塊正常!\r\n"); if(SIM800C_SendCmd("ATE0\r\n","OK"))return 2; else printf("設置模塊不回顯成功!\r\n"); if(SIM800C_SendCmd("AT+CGMI\r\n","OK"))return 3; else printf("查詢制造商名稱成功!%s\r\n",USART2_RX_BUFF); if(SIM800C_SendCmd("AT+CGMM\r\n","OK"))return 4; else printf("查詢模塊型號成功!%s\r\n",USART2_RX_BUFF); DelayMs(1000); DelayMs(1000); if(SIM800C_SendCmd("AT+CNUM\r\n","+CNUM:"))return 5; else printf("獲取本機號碼成功!%s\r\n",USART2_RX_BUFF); /* 返回格式如下: +CNUM: "","+8613086989413",145,7,4 OK */ return 0; } /* 函數 功能:GSM模塊短信模式設置 函數返回值:0表示模塊設置成功 */ u8 SIM800C_SetNoteTextMode(void) { if(SIM800C_SendCmd("AT+CSCS=\"GSM\"\r\n","OK"))return 1;// "GSM"字符集 else printf("短信GSM字符集設置成功!\r\n"); if(SIM800C_SendCmd("AT+CMGF=1\r\n","OK"))return 2; //文本模式 else printf("短信文本模式設置成功!\r\n"); return 0; } /* 函數功能:發送短信 函數參數: num:電話號碼 text:短信內容 函數返回值:0表示發送成功 */ u8 SIM800C_SendNote(u8 *num,u8 *text,u16 len) { char data[50]; char send_buf[2]; sprintf(data,"AT+CMGS=\"%s\"\r\n",num); if(SIM800C_SendCmd(data,">"))return 1; //設置發送的手機號 USART_X_SendData(USART2,text,len); //發送短信內容 send_buf[0] = 0x1a; send_buf[1] = '\0'; if(SIM800C_SendCmd(send_buf,"+CMGS"))return 2; //發送結束符號 return 0; } /* 函數功能:NTP網絡同步時間 */ void SIM800C_NtpUpdate(void) { SIM800C_SendCmd("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK");//配置承載場景1 SIM800C_SendCmd("AT+SAPBR=3,1,\"APN\",\"CMNET\"\r\n","OK"); SIM800C_SendCmd("AT+SAPBR=1,1\r\n","OK"); //激活一個GPRS上下文 DelayMs(5); SIM800C_SendCmd("AT+CNTPCID=1\r\n","OK"); //設置CNTP使用的CID SIM800C_SendCmd("AT+CNTP=\"202.120.2.101\",32\r\n","OK"); //設置NTP服務器和本地時區(32時區 時間最準確) SIM800C_SendCmd("AT+CNTP\r\n","+CNTP: 1"); //同步網絡時間 printf("同步網絡時間:%s\r\n",USART2_RX_BUFF); } /* 函數功能:GPRS數據通信初始化 返 回 值: 0表示成功 */ u8 SIM800C_GPRS_Init(void) { SIM800C_SendCmd("AT+CIPCLOSE=1\r\n","CLOSE OK"); //關閉連接 SIM800C_SendCmd("AT+CIPSHUT\r\n","SHUT OK"); //關閉移動場景 if(SIM800C_SendCmd("AT+CGCLASS=\"B\"\r\n","OK"))return 1; //設置GPRS移動臺類別為B,支持包交換和數據交換 if(SIM800C_SendCmd("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n","OK"))return 2;//設置PDP上下文,互聯網接協議,接入點等信息 if(SIM800C_SendCmd("AT+CGATT=1\r\n","OK"))return 3; //附著GPRS業務 if(SIM800C_SendCmd("AT+CIPCSGP=1,\"CMNET\"\r\n","OK"))return 4; //設置為GPRS連接模式 if(SIM800C_SendCmd("AT+CIPHEAD=1\r\n","OK"))return 5; //設置接收數據顯示IP頭(方便判斷數據來源) return 0; } /* 函數功能: 連接TCP服務器 函數參數: ipaddr:ip地址 port:端口 返 回 值: 0表示成功,其他值表示失敗 */ u8 SIM800C_Connect_TCP_Server(char *ipaddr,char *port) { char cmd_buff[100]; SIM800C_SendCmd("AT+CIPCLOSE=1\r\n","CLOSE OK"); //關閉連接 SIM800C_SendCmd("AT+CIPSHUT\r\n","SHUT OK"); //關閉移動場景 sprintf(cmd_buff,"AT+CIPSTART=\"TCP\",\"%s\",\"%s\"\r\n",ipaddr,port); if(SIM800C_SendCmd(cmd_buff,"OK"))return 1; //發起連接 return 0; } /* 函數功能: TCP客戶端模式下發送數據 返 回 值: 0表示成功,其他值表示失敗 */ u8 SIIM800C_TCP_SendData(u8 *data,u32 len) { char send_buf[2]; //準備發送數據 if(SIM800C_SendCmd("AT+CIPSEND\r\n",">")==0) { //發送數據 USART_X_SendData(USART2,data,len); //發送結束符號 DelayMs(50); send_buf[0] = 0x1a; send_buf[1] = '\0'; if(SIM800C_SendCmd(send_buf,"SEND OK"))return 2; else return 0; } return 1; }

      2. adc.c

      這是煙霧傳感器的ADC通道配置代碼。

      登錄后復制

      ////////////////////////////////////////////////////////////////////////////////// // 功能描述 : 智能環境檢測系統 // 時間 : 20190605 // 版本 : v3.3 //Copyright(C) DS小龍哥 2016 - 2020 /////////////////////////////////////////////////////////////////////////////////// #include "adc.h" /* 函數功能: ADC1的初始化 規則通道方式 */ void ADC1_Init(void) { /*1. 配置ADC采集輸入的IO口*/ RCC->APB2ENR |= 1 << 3;//PB GPIOB->CRL &= 0xFFFFFFF0; GPIOB->CRL |= 0x00000000;//配置PB0為模擬輸入模式 /*2.配置ADC1時鐘*/ RCC->APB2ENR|=1<<9; //開啟ADC1時鐘 RCC->APB2RSTR|=1<<9; //開啟復位時鐘 RCC->APB2RSTR&=~(1<<9); //關閉復位時鐘 /*3. 配置ADC的預分頻器*/ RCC->CFGR&=~(0x3<<14); //清空預分頻 RCC->CFGR|=0x2<<14; //12MHZ /*4. 配置ADC CR1基本寄存器*/ ADC1->CR1&=~(0xF<<16); //0000:獨立模式 ADC1->CR2|=1<<23; //1:啟用溫度傳感器和VREFINT。 //ADC1->CR2|=1<<22; //1:開始轉換規則通道。 ADC1->CR2|=1<<20; //1:使用外部事件啟動轉換 ADC1->CR2|=0x7<<17; //111: SWSTART ADC1->CR2&=~(1<<11); //0:右對齊; ADC1->CR2&=~(1<<1); //0:單次轉換模式; /*5. 配置ADC規則序列寄存器*/ ADC1->SQR1&=~(0xF<<20); //0000: 1個轉換 ADC1->SMPR2|=0x7<<3; //配置通道1 111: 239.5周期 ADC1->SMPR1|=0x7<<18; //配置通道16 111: 239.5周期 ADC1->CR2|=1<<0; //1:開啟ADC并啟動轉換。 ADC1->CR2|=1<<3; //1:初始化校準寄存器。 ADC1->CR2|=1<<2; //1:開始校準 while(ADC1->CR2&1<<2){} //等待校準結束 } /* 函數功能: 獲取指定通道的ADC值 函數參數: u8 ch 通道號 */ u16 ADC1_GetCHx(u8 ch) { ADC1->SQR3&=0xFFFFFFE0; //00000 ADC1->SQR3|=ch<<0; //規則序列中的第1個轉換 ADC1->CR2|=1<<22; //1:開始轉換規則通道。 while(!(ADC1->SR&1<<1)){} //等待轉換完成 return ADC1->DR; //返回接收到的數據值 }

      3. DHT11.c

      這是溫濕度檢測代碼。

      登錄后復制

      ////////////////////////////////////////////////////////////////////////////////// // 功能描述 : 智能環境檢測系統 // 時間 : 20190605 // 版本 : v3.3 //Copyright(C) DS小龍哥 2016 - 2020 /////////////////////////////////////////////////////////////////////////////////// #include "dht11.h" #include "delay.h" /* 復位DHT1 */ void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主機拉高20~40us } /* 等待DHT11的回應 返回1:未檢測到DHT11的存在 返回0:存在 */ u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry<100)//DHT11會拉低40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后會再次拉高40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; return 0; } /* 從DHT11讀取一個位 返回值:1/0 */ u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100)//等待變為低電平 { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry<100)//等待變高電平 { retry++; delay_us(1); } delay_us(40);//等待40us if(DHT11_DQ_IN)return 1; else return 0; } /* 從DHT11讀取一個字節 返回值:讀到的數據 */ u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for(i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } /* 從DHT11讀取一次數據 temp:溫度值(范圍:0~50°) humi:濕度值(范圍:20%~90%) 返回值:0,正常;1,讀取失敗 */ u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++)//讀取40位數據 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *temp=buf[2]; } }else return 1; return 0; } /* 初始化DHT11的IO口 DQ 同時檢測DHT11的存在 返回1:不存在 返回0:存在 */ u8 DHT11_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTG口時鐘 GPIOA->CRL&=0XFF0FFFFF;//PORTG.11 推挽輸出 GPIOA->CRL|=0X00300000; GPIOA->ODR|=1<<5; //輸出1 DHT11_Rst(); return DHT11_Check(); }

      IoT TCP/IP

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Mybatis經典9種設計模式【可收藏】(mybatis使用的設計模式)
      下一篇:對于七段數碼數字模型進行改進:一個關鍵的數字1的問題
      相關文章
      亚洲国产人成网站在线电影动漫| 久久久无码精品亚洲日韩软件| 亚洲精品无码成人片久久| 久久精品国产亚洲av天美18| 亚洲乱亚洲乱妇24p| 亚洲中文无码永久免费| 亚洲国产av一区二区三区丶| 精品亚洲麻豆1区2区3区| 亚洲午夜久久影院| 亚洲午夜在线电影| 亚洲黄色在线观看| 亚洲成av人片不卡无码| 亚洲人xxx日本人18| 亚洲色大成网站www尤物| 亚洲乱码av中文一区二区| 亚洲AV性色在线观看| www亚洲精品久久久乳| 亚洲Av无码乱码在线znlu| 亚洲精品无码永久在线观看| 亚洲综合色视频在线观看| 国产亚洲美日韩AV中文字幕无码成人| 亚洲伊人久久综合影院| 亚洲中文字幕在线乱码| 亚洲成A人片在线观看WWW| 亚洲国产天堂在线观看| 亚洲国产精品成人精品软件| 亚洲AV无码一区二区三区在线| jiz zz在亚洲| 国内成人精品亚洲日本语音| 亚洲精品国产电影| 狠狠综合久久综合88亚洲| 亚洲AV永久无码精品水牛影视| 久久精品亚洲一区二区三区浴池| 亚洲欧洲日产国码二区首页| 激情综合亚洲色婷婷五月 | 亚洲人成网站18禁止一区| 亚洲无人区午夜福利码高清完整版| 亚洲av无码精品网站| 亚洲精品免费在线| 亚洲成av人在线观看网站| 中文字幕无码精品亚洲资源网|