2023年3月3日 星期五

物聯網雲端平台: Adafruit.IO 應用3 _取用金鑰與記錄物聯數據

在之前各單元已經學習過如何利用 ESP8266  MicroPython 網路HTTP傳輸 、 ESP8266 MicroPython 無線基地台連線、 Adafruit.IO 服務平台的申請使用,現在就來將這些相關學習串連起來。

本實作將利用ESP8266建立無線網路連線將DHT11溫溼度模組所取得的溫濕度資料上傳到  Adafruit.IO 服務平台上加以記錄。

[[DHT11溫濕度測量模組]]
* Supply voltage: 3.3 ~ 5.5V DC
* Output: single-bus digital signal
* Measuring range: Humidity 20-90% RH, Temperature 0 ~ 50 ℃
* Accuracy: Humidity + -5% RH, temperature + -2 ℃
* Resolution: Humidity 1% RH, temperature 1 ℃
* Long-term stability: <± 1% RH / Year

[模組材料] 
 1. 8266 D1 mini x 1 
 2. DHT11溫溼度測量模組 x1 
 3. 杜邦連接線 x 3條

ESP32 與 OLED 接腳設定
【ESP8266】3.3V →【DHT11】VCC
【ESP8266】GND →【DHT11】GND
【ESP8266】D0 →【DHT11】DATA



取得 Adafruit.IO 金鑰 (AIO KEY)
當我們想把資料上傳到 Adafruit.IO 的 FEED 資料欄位時,除了必要的使用者名稱 Username 外還需要金鑰 Active Key,這是最基本的身分認證資訊。所以當我們要把資料上傳時就必須同時送上專屬的 Username 與  Active Key。請登入 Adafruit.IO 後點選 IO 頁籤->My Key 按鈕。

在 YOUR ADAFRUIT IO KEY 畫面中即可見到最基本的身分認證資訊 Username 與  Active Key:

上傳資料的HTTP POST請求格式如下:
https://io.adafruit.com/api/{Username}/feeds/{feed_key}/data/data?X-AIO-Key={Active Key}
https://io.adafruit.com/api/{使用者名稱}/feeds/{Feeds key欄位值}/data?X-AIO-Key={金鑰}
格式中的參數{Username}、{Active Key}請替換成正確的身分認證資訊 Username 與  Active Key,{feed_key}參數請使用 Feeds 的 key 欄位值,如下圖所示:

撰寫實驗程式如下:
from machine import Pin
import dht, utime, urequests, network, ujson

sensor = dht.DHT11(Pin(16))

#指定 Adafruit.IO 使用者名稱與金鑰
IO_USERNAME="{使用者名稱}"
IO_KEY="{金鑰}"
FEED1="wen-du" #溫度FEED資料欄位的key值
FEED2="shi-du" #濕度FEED資料欄位的key值

#設定網路連線帳號密碼
SSID = ""        # WiFi名稱
PASSWORD = ""    # WiFi密碼

#自訂無線基地台連線函式
def connect_wifi(ssid, passwd):
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    if not sta.isconnected():
       print("連線中... \n")
       sta.connect(ssid, passwd)
       while not sta.isconnected():
          pass
    print("連線成功... \n")
#進行網路連線
connect_wifi(SSID, PASSWORD)

try:
    while 1:
        sensor.measure()
        print("溫度: ", sensor.temperature())
        print("溼度: ", sensor.humidity())
        
        #建立與Adafruit.IO服務器間的標頭交換資訊,因為Adafruit IO 服務器會在標頭中查找 Adafruit IO Key
        headers = {'X-AIO-Key': IO_KEY, 'Content-Type': 'application/json'}
        
        #上傳溫度
        url  = "https://io.adafruit.com//api/v2/"
        url += IO_USERNAME   #使用者名稱
        url += "/feeds/" + FEED1  #寫入溫度資料的FEED Key
        url += "/data" 
        data1= {"value": str(sensor.temperature())} #溫度
        urequests.post(url,json=data1, headers=headers) #將資料寫雲端平台
        
        #上傳濕度
        url  = "https://io.adafruit.com//api/v2/"
        url += IO_USERNAME   #使用者名稱
        url += "/feeds/" + FEED2  #寫入濕度資料的FEED Key
        url += "/data"
        data2 = {"value": str(sensor.humidity())} #濕度
        urequests.post(url,json=data2, headers=headers) #將資料寫雲端平台

        print("_______________")
        utime.sleep_ms(180000) #3分鐘後重複執行迴圈
except Exception as e: print(e)
程式在Thonny執行畫面如下:
當上列程式碼順利執行後,取得的溫溼度資料就會上傳到 Adafruit.IO 服務平台加以記錄,在 IO->FEED 頁籤畫面中即可看到已記錄的最後資料值與最後記錄時間。

先點選 IO-->Dashboards 頁籤,再點選相對應的儀表板項目即可看到由FEED欄位資料所轉換成的圖表,本例為:花園溫溼度記錄。