樹莓派 + Windows IoT Core 搭建環境監控系統

  • 2019 年 10 月 3 日
  • 筆記

前言:Windows IoT 是微軟為嵌入式開發板設計的一種物聯網作業系統,運行Windows UWP(C# 開發),可以設計出豐富的交互介面,驅動GPIO,連接一些感測器做有意思的事,本文詳細介紹如何使用它搭建一個環境監控系統,並將數據上傳到Microsoft Flow雲伺服器。

工具:一台Windows 10電腦,樹莓派3B/3B+,8GB(以上)容量SD卡,讀卡器。

感測器:DHT11溫濕度感測器、BMP180氣壓計、BH1750FVI光強感測器、MQ-2煙霧感測器、蜂鳴器、若干杜邦線。

 

系統框架:

實現室內溫濕度,光線強度,氣壓高度的採集,火災情況的報警,數據的上傳到雲端。

(全是微軟的一套,PowerBi部分沒做)

 

PS:

1. 本系統感測器驅動程式碼來自 https://github.com/ZhangGaoxing/windows-iot-demo

搬運至碼雲,加速Clone:https://gitee.com/xKryo/windows-iot-demo

2. DHT11項目程式碼有一些問題,修改版本網盤下載:https://pan.baidu.com/s/11-EofiscGOnMuSyPgvFO1w 提取碼:a2p1

3. 本系統的完整程式碼:https://pan.baidu.com/s/1gTaC3vrEigzjzqDfF_uA1Q 提取碼:quau

4.  Microsoft Flow伺服器現在HTTP請求觸發需要註冊高級賬戶


 

正文:

一、開發平台的搭建

1.樹莓派安裝Windows IoT

下載Windows 10 IoT Core Dashboard 和最新的韌體:https://docs.microsoft.com/en-us/windows/iot-core/downloads,下載完成後解壓出FFu韌體,打開Dashboard並選擇韌體,設置密碼,寫入SD卡。

將SD卡插入樹莓派,漫長的等待數次重啟,中間需要通過滑鼠對樹莓派進行設置,最後進入系統:

通過儀錶盤(Dashboard)的“我的設備”可以掃描到區域網的樹莓派,瀏覽器輸入IP:8080,輸入用戶名Administrator和剛剛設置的密碼,進入Windows IoT的管理頁面。

 

2.Visual Studio 2017安裝,可以通過下載Visual Studio Installer安裝:

 

二、第一個感測器驅動(DHT11 Demo)

以驅動DHT11為例,講解將感測器連接樹莓派,並編譯打包程式並部署到樹莓派。

1.DHT11連接樹莓派,DHT11和樹莓派的引腳定義如圖,將DHT11的數據輸出引腳連接GPIO4(07號引腳),電源(VCC)和地(GND)就近接入但不要接反。

 

2.VS 2017打開DHT11 Demo 項目(IDE可能會要求安裝一些依賴的組件)

生成解決方案時,可能會出現證書過期:

 

雙擊打開項目Package.appxmanifest文件:

在新的窗口中選擇打包一欄,彈出的窗口選擇配置證書—創建測試證書(任意名稱)

 

重新生成解決方案:

 

我的VS 2017出現了問題,不能遠程調試,如果調試設置出現以下資訊,則可以直接遠程調試安裝應用不用打包部署:

3.打包項目的安裝程式包:

右鍵項目 – 應用商店 – 創建應用程式包 – 創建旁載入包:

選擇生成包的路徑,勾選合適的體系結構,點擊創建,漫長等待生成完成:

進入瀏覽器後台管理頁的Apps Manager選擇打包好的應用,點擊Install安裝:

安裝成功:

 

運行效果:

三、接入所有感測器

下載系統完整程式碼,用VS2017打開,裡面有詳細的注釋,程式碼模組較為清晰,這裡就不再分析程式碼功能了。

通過重新設計交互介面,接入BMP180氣壓計、BH1750FVI光強感測器、MQ-2煙霧感測器。

圖中可看到感測器功能都已經實現,關於數據上傳部分在後面會講解。

 

 

系統設計的電路圖:

對應樹莓派引腳的連接圖:

 

 

實物圖如下,先在麵包板上調試,再把所有感測器模組焊接在實驗板上。

 

四、Microsoft Flow雲服務

系統通過HTTP POST的方式,將數據打包成的JSON文件POST到流,伺服器解析後執行流。

推薦先觀看此影片:https://b23.tv/av21526828使用Microsoft Flow 快速採集IoT設備數據。

注意:微軟Flow的伺服器升級後,HTTP請求的觸發器已不再支援免費的賬戶,如果不想註冊,則跳過該部分,通過其他的方式上傳到所需要的其他伺服器。

 

儘管如此,還是記錄一下之前連接Flow的過程。

以影片中的例子為基礎,程式碼中數據封裝及HTTP POST部分:

 1 using System;   2 using System.Diagnostics;   3 using System.IO;   4 using System.Threading.Tasks;   5   6 namespace Windows_IoT_Core   7 {   8     class PostFlow   9     {  10         private string Url { get; set; }  11         private string Str { get; set; }  12         public PostFlow(String httpUri , String jsonStr)  13         {  14             this.Url = httpUri;  15             this.Str = jsonStr;  16         }  17         public PostFlow(ViewModel view)  18         {  19             //由MS-Flow產生的Https請求Url  20             Url = "https://XXX";  21  22             //有效負載的請求正文 JSON架構  23             Str = "{nt"Temp" : " "+view.Temp+"" ,nt"Hum" : ""+view.Hum+"" ,nt"Bright" : ""+view.Ill+"" ,nt"Alt" : ""+view.Alt+"" ,nt"Press" : ""+view.Press+"" ,nt"Fire" : ""+view.Fire+"" ,nt"Time" : ""+view.Time+""n}";  24         }  25         public async Task DoPostAsync()  26         {  27             var request = System.Net.WebRequest.Create(new Uri(Url));  28             request.ContentType = "application/json";  29             request.Method = "POST";  30  31             using (var requestStrem = await request.GetRequestStreamAsync())  32             {  33                 var writer = new StreamWriter(requestStrem);  34                 writer.Write(Str);  35                 writer.Flush();//清空快取並發送  36             }  37  38             using (var resp = await request.GetResponseAsync())  39             {  40                 using (var responseStream = resp.GetResponseStream())  41                 {  42                     var reader = new StreamReader(responseStream);  43                     var result = reader.ReadToEnd();  44                     Debug.WriteLine(result.ToString());  45                 }  46             }  47         }  48     }  49 }

 

伺服器HTTP端觸發JSON配置:

{      "type": "object",      "properties": {          "Temp": {              "type": "string"          },          "Hum": {              "type": "string"          },          "Bright": {              "type": "string"          },          "Alt": {              "type": "string"          },          "Press": {              "type": "string"          },          "Fire": {              "type": "string"          },          "Time": {              "type": "string"          }      },      "required": [          "Temp",          "Hum",          "Bright",          "Alt",          "Press",          "Fire",          "Time"      ]  }

View Code

 

1. 進入Microsoft Flow官網,註冊免費賬戶

 

2. 在“我的流”中新建,選擇觸發條件,通過搜索框搜索HTTP添加觸發條件,填入JSON配置,現在免費賬戶搜索不到。

添加條件分支,如果發生燃氣泄漏情況,推送報警和Outlook發送郵件,最終會將數據插入到Excel(OneDrive)。

 

具體郵件內容的設置:

 

 

 3. 製作好帶表頭的Excel文件,上傳到OneDrive,Flow連接OneDrive,可以找到文件,然後關聯JSON程式碼內容:

 

上傳多次數據,可以看到表格中的內容如下:

 

如圖發生燃氣泄漏,Flow會推送郵箱內容:

 

Microsoft Flow APP在Googe Paly 中下載,通過Flow APP 和OneDrive APP 在移動端查收:

五、總結

樹莓派搭載Windows IoT接入感測器,基本的環境數據採集、數據展示、數據上傳都已完成。使用微軟的一套東西進行開發著實令人崩潰,所以不再深入了,1年前開發的,有些具體的步驟還不夠清晰,現在總結起來感覺有點low。