在前一個單元中,我們已經為NodeMCU加上網路連線的能力了,現在,是時候把NodeMCU所偵測到的感測器資料透過 WiFi網路傳送到網路上的主機了。
在前一個單元中,我們使用了 network 中的函數可以讓NodeMCU連線到無線基地台,這表示NodeMCU已具有可以連線上網的能力了。在這個單元中,我們打算利用這個網路的連線能力,把量測到的資料上傳到著名的ThingSpeak.com的伺服器上。
首先,讓我們來修改一下NodeMCU的boot.py的內容,讓此NodeMCU的板子能夠在一接上電源的時候就可以馬上連上WiFi基地台,以下是boot.py的程式碼:
# This file is executed on every boot (including wake-boot from deepsleep)
import esp
esp.osdebug(None)
import gc
import network
def connectAP(ssid, pwd):
wlan = network.WLAN(network.STA_IF)
if not wlan.isconnected():
wlan.active(True)
wlan.connect(ssid, pwd)
while not wlan.isconnected():
pass
connectAP("YourSSID", "YourSSIDPWD")
#import webrepl
#webrepl.start()
gc.collect()
其中,第16行需要輸入無線基地台的SSID以及連線密碼。上述的程式檔案是boot.py,需要透過以下的指令上傳到NodeMCU中:
ampy --port COM3 get boot.py
上傳之後只要程式能夠順利地執行,當下次我們以PuTTY連線到NodeMCU的時候,在一進入介面時就可以使用以下的指令查詢目前的連線狀況:
>>> wlan = network.WLAN(network.STA_IF)
>>> wlan.status()
5
>>> wlan.ifconfig()
('192.168.43.127', '255.255.255.0', '192.168.43.1', '192.168.43.1')
如果有看到IP位址,那就表示可以順利地連上基地台,上網當然就沒有問題了。ThingSpeak帳號的申請,請參考「這篇文章」。
在建立好帳號及Channel之後,會在網頁上得到一個像是下面這樣的網址:
GET https://api.thingspeak.com/update?api_key=6JQFR*******TB&field1=0
其中GET指的是協定,在程式中我們只要使用後面的網址就可以了,而field1指的是第一個欄位,而field2則是第二個欄位的資料項目,依此類推。
上面的網址其實就是一個觸發的動作,一般來說只要使用瀏覽器去存取這個網址就可以更新在網站伺服器上的資料庫內容,雖然我們在NodeMCU中沒有瀏覽器可以用,但是卻有一個程式庫可以幫我們做類似瀏覽器去網路取得網址所提供的資料的動作,這個程式庫就是urequests模組,在這裡我們使用的是它的get函數,範例程式如下:
from machine import Pin, Timer
import dht
import urequests as req
def m(t):
d.measure()
url = "https://api.thingspeak.com/update?api_key={}&field1={}&field2={}".format(
"6JQFRE******TB",
d.temperature(), d.humidity())
req.get(url)
d = dht.DHT22(Pin(5))
t = Timer(0)
t.init(period=60000, mode=Timer.PERIODIC, callback=m)
上述的程式請存成main.py,然後上傳到NodeMCU即可。當然,第8行的API Key要使用的是你自己申請的Channel中的API才行。
上述的程式每隔1分鐘即會更新一筆資料到ThingSpeak網站,過了一段時間之後的Channel圖形如下: