Raspberry Pi

MicroPython ile Raspberry Pi Pico W MQTT: Sensör Verisi Yayınlayın ve Komut Alın

Çıplak bir Raspberry Pi Pico W'den bağlı bir MQTT cihazına uzanan eksiksiz, test edilmiş bir yol. MicroPython yükleyin, umqtt.simple kurun, dahili sıcaklık sensörünü yayınlayın, LED'i her yerden anahtarlayın ve Wi-Fi kopmalarında bağlantıyı canlı tutun.

Dahili sıcaklık okumalarını Wi-Fi üzerinden bulut broker'a yayınlayan Raspberry Pi Pico W MQTT projesi
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Raspberry Pi Pico W MQTT projeleri, bağlı donanım dünyasına harika bir ilk adımdır: kart ucuzdur, MicroPython kolay okunur ve MQTT size okumaları buluta göndermenin ve geri komut almanın hafif bir yolunu sunar. Bu eğitimde MicroPython yükleyecek, umqtt.simple kütüphanesini kuracak, Pico W'nin dahili sıcaklığını her on saniyede bir broker'a yayınlayacak, dahili LED'i bilgisayarınızdan anahtarlayacak ve tüm sistemin Wi-Fi ve broker kopmalarını atlatmasını sağlayacaksınız.

Neye İhtiyacınız Var

Parça Notlar
Raspberry Pi Pico W (veya pin başlıklı Pico WH) Düz Pico'da Wi-Fi yoktur; W harfini kontrol edin
Micro-USB veri kablosu Birçok ucuz kablo yalnızca şarj içindir ve kartı göstermez
Thonny veya mpremote yüklü bir bilgisayar Yeni başlayanlar için en kolay seçenek Thonny'dir
2,4 GHz Wi-Fi ağı Pico W'nin CYW43439 radyosu 5 GHz desteklemez
Bir MQTT broker Test için broker.connectmq.com kullanıyoruz

Ek sensör gerekmez. RP2040'ın ADC kanal 4 üzerinde dahili bir sıcaklık sensörü vardır; bu da gerçek donanım bağlamadan önce veri yolunu kanıtlamak için mükemmeldir. Hâlâ kartlar arasında seçim yapıyorsanız, ESP32 ile Raspberry Pi Pico W karşılaştırmamız ve Pico W ile Pico 2 W rehberimiz artılarını ve eksilerini ele alır.

Adım 1: MicroPython Yükleyin

  1. Raspberry Pi Pico W (kart adı RPI_PICO_W) için en son MicroPython UF2 dosyasını MicroPython indirme sayfasından veya Raspberry Pi MicroPython dokümantasyonundan indirin. Düz Pico sürümünde Wi-Fi desteği yoktur, bu yüzden W varyantını seçtiğinizden emin olun.
  2. Kartı USB'ye takarken BOOTSEL butonunu basılı tutun. RPI-RP2 adlı bir sürücü olarak görünür.
  3. UF2 dosyasını sürücüye kopyalayın. Kart otomatik olarak MicroPython ile yeniden başlar.
  4. Thonny'yi açın, sağ alt köşeden yorumlayıcı olarak MicroPython (Raspberry Pi Pico) seçin; >>> istemini görmelisiniz.

İstemde import network yazın. Hatasız çalışıyorsa Wi-Fi sürümüne sahipsiniz.

Adım 2: umqtt.simple Kurun

MicroPython, umqtt.simple kütüphanesini her firmware sürümünde değil, micropython-lib içinde bir paket olarak sunar. Kart internete erişebildiğinde, Wi-Fi'ye bağlandıktan sonra REPL'den mip kullanarak onu bir kez kurun:

import network, time, mip
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("YOUR_WIFI_SSID", "YOUR_WIFI_PASSWORD")
while not wlan.isconnected():
    time.sleep(0.5)
mip.install("umqtt.simple")

Alternatif olarak, kart USB üzerinden bağlıyken bilgisayarınızdan:

pip install mpremote
mpremote mip install umqtt.simple

Thonny'de ayrıca umqtt.simple araması yapabileceğiniz Tools → Manage packages menüsü de vardır. Üç yöntemden herhangi biri kütüphaneyi karttaki /lib klasörüne yerleştirir.

Adım 3: Topic'leri ve Client ID'yi Planlayın

Her MQTT istemcisinin benzersiz ve boş olmayan bir client ID'ye ihtiyacı vardır. Pico W'nin kullanabileceğimiz benzersiz bir kart kimliği vardır; böylece aynı kodu çalıştıran iki kart asla çakışmaz. Topic'ler için kendi seçtiğiniz rastgele bir dizeyle bir demo öneki kullanıyoruz:

Amaç Topic
Sıcaklık okumaları connectmq/demo/pw7c3e/pico1/temperature
LED komutları connectmq/demo/pw7c3e/pico1/led/set
LED durumu connectmq/demo/pw7c3e/pico1/led/state
Çevrimiçi/çevrimdışı durumu connectmq/demo/pw7c3e/pico1/status

broker.connectmq.com adresindeki ücretsiz genel MQTT broker, 1883 portunda anonim bağlantıları kabul eder, ancak orada yayınlanan her şey abone olan herkes tarafından görülebilir. Benzersiz bir önek kullanın ve yalnızca test verisi gönderin.

Adım 4: Eksiksiz Raspberry Pi Pico W MQTT Programı

Açılışta çalışması için bunu kartta main.py olarak kaydedin. Wi-Fi kimlik bilgilerini değiştirin ve pw7c3e yerine kendi dizenizi yazın.

# main.py - Raspberry Pi Pico W MQTT example (MicroPython + umqtt.simple)
import time
import network
import machine
import ubinascii
import rp2
from umqtt.simple import MQTTClient

WIFI_SSID = "YOUR_WIFI_SSID"
WIFI_PASSWORD = "YOUR_WIFI_PASSWORD"
COUNTRY = "GB"                      # your two-letter country code

BROKER = "broker.connectmq.com"
PORT = 1883
PREFIX = "connectmq/demo/pw7c3e/pico1"
CLIENT_ID = "pico-" + ubinascii.hexlify(machine.unique_id()).decode()

PUBLISH_INTERVAL_MS = 10_000
KEEPALIVE_S = 60

led = machine.Pin("LED", machine.Pin.OUT)
sensor = machine.ADC(4)


def read_temperature():
    # RP2040 internal sensor: 27 C at 0.706 V, slope -1.721 mV/C
    voltage = sensor.read_u16() * 3.3 / 65535
    return round(27 - (voltage - 0.706) / 0.001721, 2)


def connect_wifi():
    rp2.country(COUNTRY)
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.config(pm=0xA11140)        # disable power saving for a responsive link
    if not wlan.isconnected():
        wlan.connect(WIFI_SSID, WIFI_PASSWORD)
        for _ in range(30):
            if wlan.isconnected():
                break
            led.toggle()
            time.sleep(0.5)
    if not wlan.isconnected():
        raise OSError("Wi-Fi connection failed, status %d" % wlan.status())
    print("Wi-Fi connected:", wlan.ifconfig()[0])
    led.off()


def on_message(topic, msg):
    topic = topic.decode()
    msg = msg.decode().strip().upper()
    print("Received", topic, msg)
    if topic == PREFIX + "/led/set":
        if msg in ("ON", "1"):
            led.on()
        elif msg in ("OFF", "0"):
            led.off()
        client.publish(PREFIX + "/led/state", "ON" if led.value() else "OFF", retain=True)


def connect_mqtt():
    c = MQTTClient(CLIENT_ID, BROKER, port=PORT, keepalive=KEEPALIVE_S)
    c.set_last_will(PREFIX + "/status", "offline", retain=True, qos=1)
    c.set_callback(on_message)
    c.connect()
    c.publish(PREFIX + "/status", "online", retain=True, qos=1)
    c.subscribe(PREFIX + "/led/set", qos=1)
    print("MQTT connected as", CLIENT_ID)
    return c


client = None


def main():
    global client
    connect_wifi()
    client = connect_mqtt()
    last_publish = time.ticks_ms() - PUBLISH_INTERVAL_MS
    last_ping = time.ticks_ms()

    while True:
        client.check_msg()                         # handle incoming commands
        now = time.ticks_ms()

        if time.ticks_diff(now, last_publish) >= PUBLISH_INTERVAL_MS:
            temp = read_temperature()
            payload = '{"value": %s, "unit": "C"}' % temp
            client.publish(PREFIX + "/temperature", payload)
            print("Published", payload)
            last_publish = now
            last_ping = now

        elif time.ticks_diff(now, last_ping) >= (KEEPALIVE_S // 2) * 1000:
            client.ping()                          # keep the session alive
            last_ping = now

        time.sleep_ms(100)


while True:
    try:
        main()
    except OSError as e:
        print("Connection problem:", e, "- retrying in 5 s")
        try:
            if client:
                client.disconnect()
        except Exception:
            pass
        time.sleep(5)

Thonny'de Run'a tıklayın veya kartı sıfırlayın. Kabukta Wi-Fi adresi, MQTT bağlantısı ve her on saniyede bir yayın görünmelidir.

Program nasıl çalışıyor

  • Benzersiz client ID. machine.unique_id() flaş yongasından okunur; böylece her kart otomatik olarak kendi ID'sini alır.
  • Last Will. Pico temiz bir bağlantı kesme olmadan kaybolursa, broker onun adına durum topic'ine offline yayınlar. Retained online mesajıyla birlikte, her abone cihazın çalışıp çalışmadığını görebilir.
  • Engellemeyen döngü. check_msg() okunacak bir şey olmadığında hemen döner; böylece döngü bir zamanlayıcıyla yayın yapabilir ve yine de LED komutlarına yaklaşık saniyenin onda biri içinde tepki verebilir.
  • Keepalive ping'leri. umqtt.simple otomatik olarak ping göndermez. ping() çağrıları olmadan sessiz bir bağlantı, keepalive aralığından sonra broker tarafından kapatılırdı.
  • Yeniden bağlanma. Herhangi bir soket hatası OSError fırlatır; dış döngü beş saniye bekler ve gerekirse Wi-Fi dahil her şeye baştan başlar.

Adım 5: Bilgisayarınızdan Test Edin

Pico'nun yayınladığı her şeyi izleyin:

mosquitto_sub -h broker.connectmq.com -p 1883 -i laptop-pw7c3e -v -t "connectmq/demo/pw7c3e/#"

LED'i anahtarlayın:

mosquitto_pub -h broker.connectmq.com -p 1883 -i cmd-pw7c3e -t "connectmq/demo/pw7c3e/pico1/led/set" -m "ON"
mosquitto_pub -h broker.connectmq.com -p 1883 -i cmd-pw7c3e -t "connectmq/demo/pw7c3e/pico1/led/set" -m "OFF"

LED komutları izlemeli ve abone yeni durumu göstermelidir. Pico'nun fişini çekin; keepalive süresinden sonra abone, Last Will'den gelen offline mesajını alır.

Sorun Giderme

Sorun Olası neden ve çözüm
ImportError: no module named 'network' Düz Pico firmware'ini yüklediniz; RPI_PICO_W sürümünü yeniden yükleyin
ImportError: no module named 'umqtt' Kütüphane kurulu değil; Adım 2'yi tekrarlayın ve /lib klasörünü kontrol edin
Wi-Fi durumu -2 veya -3 Ağ bulunamadı veya parola yanlış; 2,4 GHz SSID'yi ve ülke kodunu doğrulayın
Bağlanırken OSError: -2 DNS çözümlemesi başarısız; Wi-Fi'nin bir IP'si ve çalışan bir DNS sunucusu olduğunu kontrol edin
Bağlanıyor, ardından yaklaşık bir dakika sonra kopuyor Eksik ping'ler; ping mantığını koruyun veya KEEPALIVE_S değerini düşürün
Yeniden bağlandıktan hemen sonra bağlantı reddediliyor Başka bir cihaz veya oturum aynı client ID'yi kullanıyor
Sıcaklık yüksek görünüyor Dahili sensör odayı değil yongayı ölçer; ortam okumaları için harici bir sensör kullanın

Dahili sensör ayrıca tam referans voltajına duyarlıdır; bu yüzden okumalar birkaç derece sapabilir. Bu eğitim için sorun değildir; gerçek ölçümler için bir DS18B20, BME280 veya SHT31 bağlayın.

Demodan Üretime

Genel broker paylaşımlı ve açıktır; bu yüzden üretimdeki cihazlar kendi kimlik bilgileri ve TLS ile bağlanmalıdır. ConnectMQ üzerinde portalda bir broker oluşturun ve oluşturulan kullanıcı adını, parolayı ve client ID'yi kopyalayın. Client ID'ler verilen kimlik bilgilerine bağlıdır; bu yüzden karttan türetilen ID yerine portaldaki YOUR_CLIENT_ID değerini aynen kullanın ve MQTTClient'a user="YOUR_USERNAME" ile password="YOUR_PASSWORD" parametrelerini verin. Ardından sertifika doğrulamalı olarak 8883 portuna geçin; bu, TLS üzerinden Pico W MQTT yazısında adım adım anlatılır. Pille çalışan tasarımlar için pille çalışan Pico W MQTT yazısına bakın.

ConnectMQ gibi barındırılan bir MQTT broker, cihazın etrafında araçlar da sunar: portalın tarayıcı içi MQTT istemcisi ve canlı topic gezgini, hiçbir şey kurmadan Pico'nun topic'lerini kontrol etmenizi sağlar; eşik tabanlı uyarı kuralları da aralık dışına çıkan bir sıcaklığı işaretleyebilir. Tam boyutlu kartlar dahil daha fazla Raspberry Pi projesi için Raspberry Pi MQTT eğitimi ile başlayın.

Pico W'nizi ConnectMQ'ya Bağlayın

app.connectmq.com adresinden kredi kartı gerekmeden ücretsiz Serverless plana kaydolun. Bir broker oluşturun, kimlik bilgilerini main.py dosyasına kopyalayın; Pico W'niz birkaç dakika içinde özel bir broker'la konuşmaya başlar. Ücretsiz planın 25 bağlantısı, koca bir raf dolusu Pico W kartını karşılar.

Sık Sorulan Sorular

Pico W'de hangi MQTT kütüphanesini kullanmalıyım?

micropython-lib içindeki umqtt.simple, MicroPython için standart seçimdir. Küçüktür; QoS 0 ve 1'i, Last Will'i, retained mesajları ve TLS'yi destekler ve mip ile kurulur.

Raspberry Pi Pico W, TLS üzerinden MQTT'yi destekler mi?

Evet. MicroPython'un ssl modülü Pico W üzerinde çalışır ve umqtt.simple, sertifika doğrulamalı olarak 8883 portuna bağlanabilir; ancak el sıkışma, kripto hızlandırmalı yongalara göre belirgin şekilde daha uzun sürer.

Pico W'm neden bir dakika sonra MQTT broker'dan kopuyor?

umqtt.simple kendi başına keepalive ping'leri göndermez. client.ping() fonksiyonunu düzenli olarak, en az her keepalive aralığında bir kez çağırın veya bağlantıyı aktif tutacak sıklıkta yayın yapın.

Pico W'yi MicroPython yerine Arduino ile kullanabilir miyim?

Evet. Arduino-Pico çekirdeği Pico W'nin Wi-Fi'sini destekler ve PubSubClient gibi kütüphaneler onunla çalışır. MicroPython prototipleme için genellikle daha hızlıdır; C/C++ ise bellek ve zamanlama üzerinde daha fazla kontrol sağlar.

İlgili yazılar

RC522 Okuyucu ile Raspberry Pi RFID MQTT Erişim Kaydı

Bir RC522 RFID okuyucuyu Raspberry Pi'ye bağlayın, etiketleri Python ile okuyun, yerel bir izin listesiyle karşılaştırın ve her erişim denemesini kayıt araçlarının, panellerin ve uyarı araçlarının tüketebileceği bir MQTT olayı olarak yayınlayın.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.