百度雲天工平臺+20行代碼DIY一個智能家居環境監測站

20行代碼

load('api_dht.js');
load('api_mqtt.js');
load('api_timer.js');// GPIO pin which has a DHT sensor data wire connected
let pin = 2;// Initialize DHT library
let dht = DHT.create(pin, DHT.DHT11);// This function reads data from the DHT sensor every 10 second
Timer.set(10000 )/* milliseconds */;
Timer.REPEAT, function() {  
    let t = dht.getTemp();
    let h = dht.getHumidity(); 
    if (isNaN(h) || isNaN(t)) 
        print('Failed to read data from sensor');
        return;
  }  
let data = {"reported":{ temperature:t, humidity:h }};  
let myData = JSON.stringify(data);  
let ok = MQTT.pub("$baidu/iot/shadow/xxxxxxxxxxx/update", myData, 1);  
print('Published:', ok ? 'yes' : 'no', ',message:', myData);  
print('Temperature:', t, '*C');  print('Humidity:', h, '%');
}, null);

點擊進入-百度雲天工平臺

1、準備清單

這裏寫圖片描述
這裏寫圖片描述

- 開發板

這裏我選擇的是一款叫做 NodeMCU 的開發板。這個是非常好用方便且便宜的物聯網開發板,自帶 USB 轉串口芯片、WiFi 及多個 GPIO 接口,可連接多個傳感器。硬件基於 ESP8266 構建,內置 WiFi 支持。

- 傳感器
我對精度要求不是很高,所以選擇一款廉價的溫溼度傳感器——DHT11。可以用來測試環境溫溼度,該傳感器的的溫度測量範圍爲 0 ~ 50°C,誤差爲 2 °C;溼度測量範圍爲在 0°C時爲30%-90%RH,環境溫度爲 25°C時,溼度測量範圍爲20%-90%RH,在50°C時,測量範圍是20%-80%。

- 雲平臺選擇
我的目的是要將數據報到雲端,然後做個展示。這裏爲了方便,選擇一個提供物聯網平臺的雲服務。
在評估了百度天工物聯網平臺、阿里物聯網套件、騰訊 IoT 套件後,決定選擇百度天工。主要是兩個方面的考慮:
• 百度天工支持標準的 MQTT 接入
• 存儲的過程無需編碼提供現成的可視化報表製作工具
小小的提醒:百度天工提供了物接入物管理兩個接入入口,但實際上物接入是裸協議,物管理會方便很多;日誌查詢交互有點反人類,默認進去無內容,需要點一下搜索纔出來,排查的時候以爲沒有報日誌上來。

- 雲平臺操作
點擊這裏查看平臺官方文檔
1.註冊百度雲天工賬號並認證 天工-物聯網平臺 在左側「產品服務」-「物聯網服務」中,選擇「物接入」,購買一個月的套餐(根據情況選擇消息條數,因爲我上報的數據比較多,所以我這裏選了200萬條)。 隨後,在左側菜單選擇「物管理」。進入物管理後,點擊「新建物模型」。 填寫「名稱」、「添加屬性」。這裏的屬性就是我們需要採集的上報的信息,所以這裏我加了兩個屬性:
• Temperature 溫度 number類型
• Humidity 溼度 number類型
這裏寫圖片描述

2、詳細步驟

  • 開發系統選擇

這款開發版柯林斯請立即獲取iTunes多種操作系統,如NodeMCU(LUA),ESPEasy(WebUI中),MicroPython,以及我們今天要使用的貓鼬OS(的NodeJS)。
不管是以上哪個固件,都可以跑通過MQTT。如在百度天工文檔中,NodeMCU固件下的lua版本NodeMCU。
因爲Mongoose OS刷系統不需要藉助第三方工具,有一個web的控制檯可以便於管理及調試,所以爲了方便,我這次就選擇了Mongoose OS的固件。

  • 接線

將傳感器與板子之間使用杜邦線連接起來.DHT11一般包含3個接頭,但根據生產商不同,標註和順序有所不同,接線時請查看模塊上的標註。我手上這顆是按如下順序標註的:
* VCC(+、3.3v等)
* DATA(D、S、SIG 等)
* GND(-、G 等)
VCC 和 GND 可與板子上對應標註位連接;DATA 接到 GPIO 口即可。
因爲 D4距離較近,於是 GPIO 口我就選了 D4 。
接線如圖:
這裏寫圖片描述
實物圖:
這裏寫圖片描述

  • 刷系統

安裝驅動
淘寶上可買到的 NodeMCU,所集成的 USB 轉串口的芯片一般有 CP2102 和 CH340 兩種,驅動下載地址分別爲:CP2102 CH-340。
安裝
隨後,我們要下載 Mongoose OS。根據你的操作系統,在 MongooseOS 官網 選擇對應方式進行安裝。
我的是 macOS,所以直接使用以下命令安裝。
curl -fsSL https://mongoose-os.com/downloads/mos/install.sh | /bin/bash~/.mos/bin/mos –help
~/.mos/bin/mos
安裝完成後,就會自動打開瀏覽器。這時候你會看到引導界面。
如果沒有啓動,可輸入 cd .mos/bin/ 或者進入自定義的安裝目錄,執行 ./mos 來運行管理界面。(Windows 用戶直接雙擊即可)
這裏寫圖片描述

接下來是燒錄固件。將板子用 Micro-USB 的數據線與電腦連接,在引導界面,選擇板子對應的接口,點擊 Select。
平臺會默認選擇(ESP8266),App 的部分我選擇了 demo-js,後面我會在這個 App 基礎上進行改動以將數據採集並上報。
WiFi 的部分填寫你希望板子連接到的熱點(注意:僅支持2.4G)。隨後點擊 Done 即可,這時板子上指示燈會以較快頻率閃動。

  • 採集並上報數據

燒錄完成後,即可在瀏覽器中看到代碼編輯界面。系統啓動後會執行init.js ,我們的代碼足夠少,所以這裏我們就全部寫到此文件。
這裏寫圖片描述
代碼如下
其中
pin 是按 ESP8266 的編號,我們上面接線的 D4 對應 ESP8266 2 號 GPIO 口,所以這裏填的2。
$baidu/iot/shadow/xxxxxxxxxxx/update 中的 xxxxxxxxxxx 替換爲你在前面百度天工中創建的物影子名稱。

load('api_dht.js');
load('api_mqtt.js');
load('api_timer.js');// GPIO pin which has a DHT sensor data wire connected
let pin = 2;// Initialize DHT library
let dht = DHT.create(pin, DHT.DHT11);// This function reads data from the DHT sensor every 10 second
Timer.set(10000 )/* milliseconds */;
Timer.REPEAT, function() {  
    let t = dht.getTemp();
    let h = dht.getHumidity(); 
    if (isNaN(h) || isNaN(t)) 
        print('Failed to read data from sensor');
        return;
  }  
let data = {"reported":{ temperature:t, humidity:h }};  
let myData = JSON.stringify(data);  
let ok = MQTT.pub("$baidu/iot/shadow/xxxxxxxxxxx/update", myData, 1);  
print('Published:', ok ? 'yes' : 'no', ',message:', myData);  
print('Temperature:', t, '*C');  print('Humidity:', h, '%');
}, null);

你一定會好奇,前面的連接信息哪裏去了。在MongooseOS裏,MQTT的連接信息是寫在配置文件的。點擊MongooseOS瀏覽器界面左側的DeviceConf,可看到MQTT配置界面。將前面的連接信息填寫進來,點擊左上角的Save即可!
這裏寫圖片描述

再回到 Projects 的代碼編寫界面,點擊那個長得像上傳的圖標,保存文件並傳輸到板子上重啓。

這時,你就可以看到 Logs 裏在打印溫溼度信息,並顯示上報成功(Yes)。如果爲 no,可以配合本地 Log 及天工裏「平臺通用功能」-「日誌」進行錯誤排查。
傳輸成功後,在天工「物影子詳情」頁面上就可以看到剛剛上報的數據了。
這裏寫圖片描述
至此,就完成了數據採集到上報的全過程。

等一哈…一開始的第二張圖不是有個好看的圖麼,難道是假的?
當然不是。接下來的部分不需要寫代碼了,直接在雲平臺上配置即可。

  • 數據存儲

我展示的圖表裏,有實時值和折線圖。其中折線圖是過去一段時間的歷史數據。所以,我們需要將數據存下來。在一開始,我想着把數據存到 MySQL 或者 MongoDB,在看了一些物聯網平臺,尤其是百度這個天工之後,發現「時序數據庫 TSDB」是一個更好的選擇。
隨後發現,在天工裏,我們上報到物影子的數據,如果需要簡單存儲到 TSDB,壓根不用寫代碼。不過如果需要複雜的邏輯處理,好像還是要寫代碼,或者用一個叫規則引擎的服務。
扯遠了,這次我們要存的東西比較簡單,所以就用現成的功能了。在「物詳情」頁面(之前獲取連接信息那有圖),點擊編輯,開啓「存儲配置」,把「不存儲」改成「上報即存儲」,選擇需要存到哪個數據庫(沒有的話先創建個,默認配置就夠用),度量名稱填寫 monitor ,點擊保存即可。
這裏寫圖片描述
這樣存儲的部分就配置好了,每次上報的數據,都會自動給存到 TSDB 裏。可以在左側導航選擇「時序數據庫」,點對應數據庫的「查詢面板」查看存進去的歷史數據了。
六 做個好看的報表
數據存好了,接下來就是展示出來。
同樣的,繼續使用天工的一個叫「物可視」的功能。這也是我選用百度這套平臺的主要原因之一。
這個功能的引導略少,我是看文檔才瞭解怎麼用,會了之後發現超級超級簡單方便。
我以做一張我截圖那種報表爲例,來大概說一下步驟:
• 首先進到物可視,點創建「儀表盤」
• 進入後,頂上有倆標籤,選擇「數據表」
• 左側新建數據表,因爲我有倆儀表指針圖和一個時序折線圖,所以這一步我要創建兩個數據表,一個時序數據庫類型,一個物管理類型
• 創建完後,返回「儀表盤」。將需要的圖拖動到空白處,點對應的圖,右側設置一下綁定數據,如下圖
這裏寫圖片描述
這裏介紹了一小部分功能,需要展示更多的部分,可以再看看文檔。
結束
至此,整個搭建到展示的過程完成。

一共花費爲 20 元 = (NodeMCU板 14.5 元)+ (DHT11傳感器 4.5元) + (時序數據庫 1 元)

這是套最基礎的溫溼度採集上報系統,在此基礎上,也可以做一些梗複雜的事情。比如加個紅外,當溫溼度到指定閾值,就觸發開關空調;做個手機 App 或微信小程序,控制板子上的紅外遙控……

場景還是很多的,就不一一引申了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章