項目3任務6-物聯網APP顯示溫濕度_第1頁
項目3任務6-物聯網APP顯示溫濕度_第2頁
項目3任務6-物聯網APP顯示溫濕度_第3頁
項目3任務6-物聯網APP顯示溫濕度_第4頁
項目3任務6-物聯網APP顯示溫濕度_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

VIP免費下載

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2相關知識34任務小結與練習1任務實施任務引入與目標物聯網APP顯示溫濕度一、任務引入與目標任務目標ESP32上報:通過DHT11傳感器監測溫濕度值,MQTT消息topic="/手機號/my_ESP32/post",MQTT消息payload="{"temperature":16}",或者"{"humidity":43}"。APP收到后,將溫度值解析后顯示在text21中,將濕度值解析后顯示在text22中。任務6分解為2個環節:網關數據上報、APP設計。第一個環節是在Arduino環境下編寫DHT11相關庫的檢測函數,再調用客戶端的publish方法;第二個環節是將任務5的MQTT.fx客戶端ID換成ESP32客戶端ID,解析后更新UI控件,從text23改為text21和text22。任務引入任務5讓MQTT.fx客戶端發送包含虛擬傳感器值的MQTT消息,由APP訂閱、接收、解析并展示。本任務讓ESP32網關連接真實的傳感器,檢測溫濕度并上報,由APP訂閱、接收、解析并展示,構建一個溫濕度的遠程監控系統。二、相關知識DHT11傳感器簡介DHT11傳感器是一款含有已校準數字信號輸出的溫濕度傳感器,應用數字模塊采集技術和溫濕度傳感技術,確保產品具有極高的可靠性和工作穩定性。傳感器包括一個電阻式感濕元件和一個NTC測溫元件,并與一個高性能8位單片機相連。DHT11采用單線制串行接口,使系統集成變得簡易快捷,節約硬件資源。產品為4針單排引腳封裝,連接方便。課堂討論你還知道有哪些單總線的傳感器?二、相關知識DHT11傳感器應用電路VCC供電電壓的范圍為3~5.5V,GND接地。DATA為單串行數據總線,可和單片機的數據引腳相連,如圖3-31所示。注意:數據引腳需要完成輸入和輸出雙向傳輸,故引腳的工作模式在初始化時不必設置,而是在檢測時按照時序配置引腳的工作模式。圖3-31DHT11傳感器應用電路二、相關知識DFRobot_DHT11庫用戶通過外設庫的封裝,可以較為方便地使用相關外設,而不需要關心復雜的配置和時序知識。用戶可在Arduino開發環境中調用DFRobot_DHT11庫,使用DHT11傳感器。項目1已經將DFRobot_DHT11外設庫下載到Arduino安裝目錄的libraries文件夾中,在Arduino工程中,用戶通過以下語句即可調用:#include"DFRobot_DHT11.h"其他關鍵語句如下:DFRobot_DHT11DHT;//創建溫濕度傳感器對象DHTDHT.read(DHT11_PIN);//DHT對象調用read方法,完成一次溫濕度檢測DHT檢測溫濕度后,溫度值和濕度值會分別賦值給DHT對象的temperature屬性和humidity屬性。三、任務實施實施設備ESP32網關和DHT11溫濕度傳感器各一個,杜邦線若干,安裝了Arduino開發環境和AndroidStudio開發環境的計算機,部署了MQTT服務器的云服務器。1.網關與傳感器硬件連接DHT11_DAT———ESP32_IO26DHT11_GND———ESP32_GNDDHT11_VCC———ESP32_VCCDHT11的單數據總線接ESP32的Pin26。實施過程三、任務實施2.網關程序設計(1)頭文件、宏、變量、對象定義。#include<WiFi.h>#include<PubSubClient.h>#include<ArduinoJson.h>//需要加載ArduinoJson和DFRobot_DHT11庫,否則報錯#include"DFRobot_DHT11.h"#defineDHT11_PIN26/*配置WIFI名和密碼*/constchar*WIFI_SSID/="YYY_11_101";constchar*WIFI_PASSWORD="lxy413026";/*配置域名和端口號*/constchar*mqtt_server="47.99.107.169";constuint16_tPORT=1883;constchar*mqtt_id=ESP";constchar*mqtt_username="";constchar*mqtt_password="";/*需要操作的產品標識符(溫度、濕度)*/StringTempIdentifier="temperature";StringHumiIdentifier="humidity";/*需要上報和訂閱的TOPIC*/constchar*pubTopic="my_ESP32/post";//******發布WiFiClientespClient;PubSubClientclient(espClient);//創建了MQTT客戶端,即ESP32硬件DFRobot_DHT11DHT;三、任務實施程序中:①調用了WiFi庫、PubSubClient庫(用于創建MQTT客戶端)、ArduinoJson庫(用于JSON解析)、DFRobot_DHT11(用于DHT11溫濕度傳感器);②定義了DHT11的數據引腳、配置了WiFi通信時的賬號密碼、MQTT服務器的IP地址和端口號、MQTT客戶端ID、客戶端訪問服務器時的用戶名和密碼;③定義了JSON對象(上報的消息載荷)里的溫度和濕度字段、要發布的消息topic;④創建了WiFi客戶端,進一步創建了MQTT客戶端對象client,并創建了溫濕度傳感器對象DHT。三、任務實施voidsetup(){Serial.begin(115200);connectWiFi();client.setServer(mqtt_server,PORT);//沒有提供用戶名和密碼,因為EMQX服務器允許公開訪問,如果設置的話是需要提供的/*設置回調函數,當收到訂閱信息時會執行回調函數*/client.setCallback(callback);/*連接到MQTT服務器*/reconnect();}(2)初始化函數。初始化函數中:設置串口0的波特率為115200,對應的電腦串口調試助手波特率要一致;進行WiFi連接;設置MQTT客戶端要訪問的MQTT服務器;設置MQTT客戶端收到消息后的回調處理函數,并連接到MQTT服務器。三、任務實施voidreconnect(){while(!client.connected()){Serial.print("AttemptingMQTTconnection...");if(client.connect(mqtt_id,mqtt_username,mqtt_password)){Serial.println("connected");}else{Serial.print("failed,rc=");Serial.print(client.state());Serial.println("tryagainin5seconds");delay(5000);}}}(3)reconnect函數。在reconnect函數中,client對象會調用connected方法判斷是否連接到MQTT服務器;如果未連接,會嘗試調用connect方法進行連接;如果嘗試連接失敗,間隔一段時間后會再次調用connect方法進行連接。循環是通過While語句實現的。三、任務實施uint8_ttempTime=0;voidloop(){if(!client.connected()){reconnect();}/*兩分鐘上報兩次溫濕度信息*/if(tempTime>240){tempTime=0;DHT.read(DHT11_PIN);Serial.print("DHT.temperature=");Serial.println(DHT.temperature);Serial.print("DHT.humidity=");Serial.println(DHT.humidity);client.publish(pubTopic,("{\""+TempIdentifier+"\":"+DHT.temperature+"}").c_str());}else{tempTime++;delay(500);}client.loop();}(4)loop函數。loop函數中,MQTT客戶端每2分鐘上報一次消息,消息的topic="/手機號/my_ESP32/post"。假如采集到的溫度值是16℃,消息載荷="{"temperature":16}"。程序中,DHT對象通過read方法檢測溫濕度,溫度值和濕度值會分別賦值給DHT對象的temperature屬性和humidity屬性。三、任務實施為什么是每隔2分鐘上報一次MQTT消息?如果想修改間隔時間為3分鐘,有哪些辦法?消息中的“\”是什么意思,有什么作用?課堂討論3.APP設計(1)消息topic。如圖3-32所示,APP是作為接收消息的MQTT客戶端使用的,只要修改一下訂閱的消息topic就可以了,即將"/手機號/my_FX/post"修改為"/手機號/my_ESP32/post",至于發布和訂閱消息的內容,都保持不變。圖3-32修改訂閱的消息topic三、任務實施(2)消息payload解析。APP的MQTT客戶端收到消息后,通過Handler回傳到UI線程處理,原來是解析后展示在tet23,現在修改為解析溫度展示在text21文本框中。代碼如下:case3://MQTT收到消息回傳if(msg.obj.toString().contains("temperature")){StringT_val=msg.obj.toString().substring(msg.obj.toString().indexOf("temperature")+13,msg.obj.toString().indexOf("}"));Stringtext_val=T_val+"℃";binding2.text21.setText(text_val);}//Toast.makeText(SecondActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();break;三、任務實施4.結果展示上傳程序,打開Arduino開發環境的串口監視器,會顯示連接MQTT服務器成功。然后觀察溫濕度檢測結果,如圖3-33所示。對應的,如圖3-34所示,在虛擬手機上可以看到溫度值,和串口打印的溫度值是一樣的。圖3-33串口0打印的溫濕度值圖3-34APP的溫度顯示三、任務實施5.濕度上報顯示在溫度值上報顯示的基礎上,完成濕度值的上報顯示。APP和網關程序都需要簡單修改一下。(1)APP解析部分代碼完善。case3://MQTT收到消息回傳if(msg.obj.toString().contains("temperature")){StringT_val=msg.obj.toString().substring(msg.obj.toString().indexOf("temperature")+13,msg.obj.toString().indexOf("}"));Stringtext_val=T_val+"℃";binding2.text21.setText(text_val);}if(msg.obj.toString().contains("humidity")){StringH_val=msg.obj.toString().substring(msg.obj.toString().indexOf("humidity")+10,msg.obj.toString().indexOf("}"));Stringtext_val=H_val+"%";binding2.text22.setText(text_val);}//Toast.makeText(SecondActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();break;APP的MQTT客戶端收到消息后,通過Handler回傳到UI線程處理,對濕度值的解析處理和對溫度值的解析處理思路是一樣的,把濕度值更新到text22中即可。三、任務實施(2)網關程序部分代碼完善。每2分鐘上報一次消息,在上報溫度消息語句后面,再調用client的publish方法發布(上報)一條濕度消息。消息的topic="/手機號/my_ESP32/post"。假如采集到的濕度值是43%,消息載荷="{"humidity":43}"。uint8_ttempTime=0;voidloop(){if(!client.connected()){reconnect();}/*兩分鐘上報兩次溫濕度信息*/if(tempTime>240){tempTime=0;DHT.rea

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論