NodeMCU + SSD1306 + MQTT整合應用

對很多人來說,使用物聯網裝置連接了感測器之後,最重要的就是能夠讓感測的結果可以顯示出來,同時可以放到網路上以便後續的應用。在本文的例子中,我們就來學習如何把溫濕度的感測值,利用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")

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *