Raspberry Pi Pico W + MQTT

可以連上網路的物聯網裝置,下一步當然是要利用網路功能,透過MQTT把感測到的資料傳遞出來,才能叫做物聯網裝置啊。在Pico W上使用物聯網也非常容易,現在就來看看如何使用吧。

同樣地,MQTT的連線函式我們也只要使用現成的,在下面這個網站中可以找到:

仔細看網頁中的內容,其中有一個umqttsimple.py的下載連結,把該程式下載,然後利用Thonny儲存到Pico W的板子中,如下圖所示:

然後,利用以下的程式,就可以輕易地把資料傳送出去了(此程式需要在有網路連線的情況下才能夠順利執行):

from umqttsimple import MQTTClient

mqtt = MQTTClient("00001", "your ip of mqtt server")
mqtt.connect()
mqtt.publish("minhuang/picow", "Hi")

以下是在Raspberry Pi中執行mosquitto的subscribe程式所接收到的內容:

有了這個MQTT的發佈程式,我們就可以把目前感測器中取得的資料,利用MQTT傳遞出去,如果這個程式把它命名為main.py,那麼它就可以了通電之後自行運作了。

由於使用MQTT一定要在網路是可以正常連線的情況下才能夠運作,所以一般來說,我們會把連網的程式碼一併放在發佈的程式中,如下所示:

import network
from umqttsimple import MQTTClient

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ssid", "password")
print("connecting...")
while not wlan.isconnected():
    pass
print("connected")
mqtt = MQTTClient("00001", "your mqtt broker IP address")
mqtt.connect()
mqtt.publish("minhuang/picow", "Hi")

結合前一篇文章的SSD1306以及溫濕度感測器,程式修改如下:

import network
import time, ntptime
from machine import Pin, I2C
from dht import DHT11
import ssd1306
from umqttsimple import MQTTClient

pin = Pin(22, Pin.OUT, Pin.PULL_UP)
sensor = DHT11(pin)
i2c = I2C(0, sda=Pin(16), scl=Pin(17))
disp = ssd1306.SSD1306_I2C(128, 64, i2c)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ssid", "password")
disp.fill(0)
disp.text("connecting...", 0, 0)
disp.show()
while not wlan.isconnected():
    pass
mqtt = MQTTClient("0001", "your MQTT borker's IP")
mqtt.connect()
disp.fill(0)
disp.text("connected", 0, 0)
disp.show()
try:
    ntptime.settime()
except:
    pass
while True:
    temp = time.mktime(time.localtime())
    temp += 8*3600
    y, m, d, h, M, s, _, _ = time.localtime(temp)
    try:   
        sensor.measure()
        temperature  = (sensor.temperature)
        humidity = (sensor.humidity)
        mqtt.publish("minhuang/picow/temperature", str(temperature))
        mqtt.publish("minhuang/picow/humidity", str(humidity))
        disp.fill(0)
        disp.text('NKUST CCET', 0, 0)
        disp.text('Min-Huang Ho', 0, 10)
        disp.text('{}-{}-{}'.format(y, m, d), 0, 25)
        disp.text('{}:{}:{}'.format(h, M, s), 0, 40)
        disp.text('{}, {}%'.format(temperature, humidity), 0, 55)
    except:
        pass
    disp.show()
    time.sleep(1)

以下是上述程式執行之後,我們在Raspberry Pi上以mosquitto_sub接收的成果畫面:

發佈留言

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