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
- 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. - Kartı USB'ye takarken BOOTSEL butonunu basılı tutun.
RPI-RP2adlı bir sürücü olarak görünür. - UF2 dosyasını sürücüye kopyalayın. Kart otomatik olarak MicroPython ile yeniden başlar.
- 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
offlineyayınlar. Retainedonlinemesajı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.simpleotomatik 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ı
OSErrorfı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.



