對很多人來說,使用物聯網裝置連接了感測器之後,最重要的就是能夠讓感測的結果可以顯示出來,同時可以放到網路上以便後續的應用。在本文的例子中,我們就來學習如何把溫濕度的感測值,利用SSD1306這個0.96吋的小顯示器把它顯示出來,同時也利用MQTT讓這些感測到的資訊也可以傳遞到網際網路上。
先來看看硬體裝置的連接方式:
在這個例子中,我們使用了DHT11用來感測溫濕度,它的資料線連接的是NoduMCU的d0,接著,SSD1306的SCL連接到d1,SDA連接到d2,其它的就只是電源的部份,依正負極連接即可。以下是程式碼,同學們在練習的時候,別忘了要把自己的基地台SSID和password填入,才能夠連接上網際網路:
import dht, time, network, ssd1306
from umqtt.simple import MQTTClient
from machine import I2C, Pin
from ntptime import settime
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
d = dht.DHT11(Pin(16))
mqttc = MQTTClient("umqtt_client", "192.168.69.126")
def show_message(msg, x, y):
oled.fill(0)
oled.text(msg, x, y)
oled.show()
show_message("Starting...", 0, 0)
wlan = network.WLAN(network.STA_IF)
wlan.active()
wlan.connect("ssid", "password")
show_message("Connecting...", 0, 0)
oled.show()
while not wlan.isconnected():
pass
show_message("Connected!", 0, 0)
while True:
settime()
utc = time.mktime(time.localtime())
year, month, day, hour, minute, second, _, _ = time.localtime(utc+28800)
d.measure()
t = d.temperature()
h = d.humidity()
oled.fill(0)
oled.text("NKUST", 0, 0)
oled.text("{}-{}-{}".format(year, month, day), 0, 16)
oled.text("{}:{}:{}".format(hour, minute, second), 0, 24)
oled.text("{},{}%".format(t, h), 0, 32)
oled.show()
mqttc.connect()
mqttc.publish(b"nkust/minhuang", b"{}:{}:{}-{},{}%".format(hour, minute, second, t, h))
mqttc.disconnect()
time.sleep(2)
在上述的程式中,我們的MQTT伺服器是192.168.69.126,它是利用樹莓派所建立的mosquitto伺服器,由於傳送端和伺服器是不同的機器,所以在建立mosquitto伺服器時,還需要把它監聽的IP設定為anonymous才行。
此外,在NodeMCU上也可以不需要安裝任何模組的方式直接發佈MQTT的訊息,但是如果你在執行下列的範例程式時出現找不到umqtt模組的訊息,或是你使用的是NodeMCU的話,那麼可能要以如下所示的指令(在Mu Editor的REPL模式或是以PuTTY連線的方式下達指令)安裝umqtt模組(下面的「>>>」是命令提示字元,請勿輸入):
>>> import upip
>>> upip.install("micropython-umqtt.simple")