Bir pico w pilli mqtt sensörü, ancak kart ömrünün neredeyse tamamını uykuda ve yalnızca birkaç saniyesini uyanık geçirirse işe yarar. Bu rehberde bir zamanlayıcıyla uyanan, bir sensörü ve kendi pil voltajını okuyan, bir MQTT broker'a tek bir QoS 1 mesajı yayınlayan, radyoyu kapatan ve tekrar lightsleep'e geçen bir MicroPython sensör node'u oluşturacaksınız. Ayrıca hangi tasarım tercihlerinin pil ömrünü gerçekten etkilediğini ve hangilerinin boşa harcanan emek olduğunu öğreneceksiniz.
Pico W'de Pille Çalışmak Neden Zor
Pico W, ultra düşük güçlü bir sensör platformu olarak değil, ucuz ve esnek bir mikrodenetleyici kartı olarak tasarlanmıştır. RP2040'ın kendisi yeterince verimlidir, ancak pille çalışırken üç şey aleyhinize işler:
- CYW43439 Wi-Fi çipi, ağa bağlanırken ve veri gönderirken, mikrodenetleyicinin hesaplama yaparken çektiğinden çok daha fazla akım çeker. Radyonun açık kaldığı her saniye, dakikalarca uykudan daha pahalıdır.
- Kart üzerindeki buck-boost regülatör, RP2040 uyurken bile hiç kaybolmayan bir boşta akıma sahiptir.
- MicroPython'daki uyku modları, ESP32 gibi çiplere kıyasla sınırlıdır.
machine.lightsleep()saatleri durdurur ve RAM'i korur, bu kullanışlıdır, ancak kart yine de amaca yönelik düşük güçlü bir node'dan belirgin şekilde fazla akım çeker.
Pratik sonuç basittir: pil ömrünü belirleyen asıl şey ne sıklıkla uyandığınız ve Wi-Fi bağlantısının ne kadar sürdüğüdür. Bir sensörü okuyan Python kodunu optimize etmek neredeyse hiç fark yaratmaz. 30 saniyelik bir yayın aralığını 5 dakikaya çıkarmak veya bağlantı süresini sekiz saniyeden üç saniyeye indirmek ise büyük fark yaratır.
Bir Pico W'yi henüz hiç MQTT'ye bağlamadıysanız Raspberry Pi Pico W MQTT rehberiyle başlayın ve temel bir yayın çalıştığında buraya geri dönün.
Görev Döngüsü Tasarımı
Her uyanma aynı kısa senaryoyu izler. Bunu kesinlikle doğrusal tutmak (arka plan görevi yok, uzun ömürlü bağlantı yok) onu öngörülebilir kılan şeydir.
- Lightsleep'ten (veya bir elektrik kesintisinden sonra soğuk açılıştan) uyanın.
- Wi-Fi'yi açmadan önce pil voltajını okuyun.
- Sensörü okuyun.
- Wi-Fi'yi statik bir yapılandırma ve kesin bir zaman aşımıyla açın.
- Broker'a bağlanın, QoS 1 ile tek bir mesaj yayınlayın ve onayı bekleyin.
- Bağlantıyı temiz biçimde kesin, radyoyu kapatın ve deinit edin.
- Yapılandırılan aralık boyunca lightsleep'e geçin, ardından döngüyü tekrarlayın.
| Tasarım tercihi | Pil ömrüne etkisi | Öneri |
|---|---|---|
| Yayın aralığı | En büyük tekil faktör | Oda iklim verileri için 5 ila 15 dakika |
| Wi-Fi bağlantı süresi | İkinci en büyük faktör | Güçlü sinyal, WPA2, kısa zaman aşımı |
| Uyurken MQTT'yi bağlı tutma | Radyo kısmen aktif kalır | Pille çalışırken asla |
| QoS 1 yayını | Bir ek gidiş-dönüş | Değer, mesajın ulaştığını bilirsiniz |
Lightsleep vs meşgul time.sleep() |
Lightsleep saatleri durdurur | Döngüler arasında her zaman lightsleep |
| Durum için yanıp sönen LED | Küçük ama sürekli tüketim | Üretimde devre dışı bırakın |
| Harici zamanlayıcı çipi (TPL5110 veya benzeri) | Kartın gücünü tamamen keser | Aylarca süren ömür için en iyi seçenek |
Donanım ve Bağlantılar
Bir Pico W'ye (veya Pico 2 W), bir sensöre ve VSYS'e bağlı bir güç kaynağına ihtiyacınız var. Yaygın bir kurulum, VSYS'i doğrudan besleyen seri bağlı üç AA veya AAA pil ya da bir koruma kartı üzerinden tek bir LiPo hücresidir. Resmi veri sayfasındaki VSYS sınırından fazlasını vermeyin ve USB takılıyken bir diyot olmadan pilleri asla VBUS'a bağlamayın.
Sensör için düşük bekleme akımına sahip herhangi bir I2C parçası çalışır. Bu örnek I2C0 üzerinde (GP4 = SDA, GP5 = SCL) bir BME280 kullanıyor, ancak görev döngüsü mantığı sensörden bağımsızdır.
Pico W, 1:3 bölücü üzerinden VSYS'e bağlı olan ADC3'te kendi besleme voltajını ölçebilir. Pico W'de bu pin (GP29) Wi-Fi çipinin SPI saatiyle paylaşılır; bu nedenle onu radyo kapalıyken ve GP25 yüksek seviyede sürülürken okumanız gerekir. Voltaj okumasının döngüde ilk sırada yapılmasının nedeni budur.
MicroPython'u ve MQTT Kütüphanesini Hazırlayın
Resmi Raspberry Pi dokümantasyonundan Pico W için güncel bir MicroPython sürümü yükleyin, ardından mpremote ile umqtt.simple kütüphanesini ve bir BME280 sürücüsünü kurun:
pip install mpremote
mpremote mip install umqtt.simple
mpremote cp bme280.py :bme280.py
Kimlik bilgilerinin ana betiğin dışında kalması için kartta bir secrets.py oluşturun:
# secrets.py
WIFI_SSID = "your-ssid"
WIFI_PASSWORD = "your-wifi-password"
MQTT_HOST = "broker.connectmq.com"
MQTT_PORT = 1883
MQTT_CLIENT_ID = "pico-bat-7f3a91" # boş olmamalı ve benzersiz olmalı
MQTT_USER = None # özel bir broker için YOUR_USERNAME ayarlayın
MQTT_PASSWORD = None # özel bir broker için YOUR_PASSWORD ayarlayın
TOPIC = "connectmq/demo/7f3a91/garden/climate"
INTERVAL_S = 600 # okumalar arasında 10 dakika
broker.connectmq.com adresindeki herkese açık test broker'ı, boş olmayan herhangi bir client ID ile anonim bağlantıları kabul eder. Orada yayınlanan her şeyi herkes okuyabilir; bu yüzden rastgele bir topic öneki kullanın ve asla kişisel veri göndermeyin. Ücretsiz herkese açık MQTT broker rehberi sınırlarını listeler.
Eksiksiz Pilli MQTT Betiği
Bunu main.py olarak kaydedin. Her açılışta otomatik olarak çalışır ve döngü sıfırlama yerine lightsleep kullandığı için döngü sayacı gibi RAM durumu uyanmalar arasında korunur.
# main.py - battery-powered Pico W MQTT sensor
import time
import json
import network
import machine
from machine import Pin, ADC, I2C
from umqtt.simple import MQTTClient
import bme280
import secrets
led = Pin("LED", Pin.OUT)
led.off()
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=100_000)
cycle = 0
def read_vsys():
"""Read VSYS on the Pico W. Must run while the Wi-Fi chip is off."""
Pin(25, Pin.OUT).value(1) # CYW43 SPI veri yolunun seçimini kaldır
Pin(29, Pin.IN, None) # paylaşılan pini ADC için serbest bırak
adc = ADC(3)
total = 0
for _ in range(8):
total += adc.read_u16()
time.sleep_ms(2)
raw = total / 8
return round(raw * 3.3 * 3 / 65535, 3)
def read_sensor():
sensor = bme280.BME280(i2c=i2c)
t, p, h = sensor.read_compensated_data()
# Sürücü derecenin yüzde birini, Pa*256 ve %RH*1024 döndürür
return round(t / 100, 2), round(h / 1024, 1), round(p / 25600, 1)
def wifi_up(timeout_ms=10_000):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.WIFI_SSID, secrets.WIFI_PASSWORD)
start = time.ticks_ms()
while not wlan.isconnected():
if time.ticks_diff(time.ticks_ms(), start) > timeout_ms:
return wlan, False
time.sleep_ms(100)
return wlan, True
def wifi_down(wlan):
try:
wlan.disconnect()
except OSError:
pass
wlan.active(False)
wlan.deinit()
def publish(payload):
client = MQTTClient(
secrets.MQTT_CLIENT_ID,
secrets.MQTT_HOST,
port=secrets.MQTT_PORT,
user=secrets.MQTT_USER,
password=secrets.MQTT_PASSWORD,
keepalive=30,
)
client.connect()
# QoS 1: publish(), broker PUBACK döndürene kadar bekler
client.publish(secrets.TOPIC, payload, qos=1)
client.disconnect()
while True:
cycle += 1
vbat = read_vsys()
try:
temp_c, rh, hpa = read_sensor()
except OSError:
temp_c, rh, hpa = None, None, None
awake_start = time.ticks_ms()
wlan, ok = wifi_up()
if ok:
msg = json.dumps({
"t": temp_c, "rh": rh, "hpa": hpa,
"vbat": vbat, "cycle": cycle,
"rssi": wlan.status("rssi"),
"awake_ms": time.ticks_diff(time.ticks_ms(), awake_start),
})
try:
publish(msg)
except OSError as exc:
print("MQTT failed:", exc)
wifi_down(wlan)
# Pilleri korumak için pil zayıfken aralığı daha fazla uzat
sleep_s = secrets.INTERVAL_S if vbat > 3.3 else secrets.INTERVAL_S * 3
machine.lightsleep(sleep_s * 1000)
Bazı ayrıntılar bilinçlidir. Betik her mesajda awake_ms ve rssi değerlerini bildirir; böylece broker tarafından bir node'un bağlanmak için çok fazla zaman harcayıp harcamadığını görebilirsiniz. Düşük pil dalı tamamen durmak yerine aralığı üç katına çıkarır; bu da node'u kaybetmeden pilleri değiştirmek için zaman kazandırır. active(False) sonrasındaki deinit() ise kart uyumadan önce CYW43 sürücüsünün radyoyu serbest bırakmasını sağlar.
Pico W Pilli MQTT Mesajlarını Test Edin
Pille çalıştırmadan önce USB üzerinde 30 saniye gibi kısa bir aralıkla test edin. Dizüstü bilgisayarınızdan abone olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i laptop-7f3a91 \
-t 'connectmq/demo/7f3a91/#' -v
Her döngüde bir JSON mesajı görmelisiniz. awake_ms alanını izleyin. Sağlıklı bir ağda dar ve tekrarlanabilir bir aralığa oturur. Büyük ölçüde değişiyorsa sorun kodunuzda değil, erişim noktasındadır.
Pico W USB üzerinden uyuduğunda seri REPL'in bağlantısının kesildiğini unutmayın. Bu normaldir. Kontrolü yeniden kazanmak için kabloyu çıkarın, gerekirse BOOTSEL'e basılı tutun veya main.py ilk uykusuna girmeden önce, güç verildikten hemen sonra mpremote kullanın. Kullanışlı bir hile, main.py'nin en başına bir GPIO pinindeki bir düğme basılı tutulursa REPL'e çıkan iki saniyelik bir pencere eklemektir.
Pico W'den Daha Fazla Pil Ömrü Elde Etme
Temel döngü çalıştığında bu iyileştirmeler en iyi geri dönüşü sağlar:
- Önce aralığı uzatın. Uyanma sayısını yarıya indirmek, en büyük tüketici olan radyo enerjisini kabaca yarıya indirir.
- Okumaları toplu gönderin. Lightsleep sırasında sensörü her dakika okuyun, değerleri bir listede tutun ve hepsini on dakikada bir tek bir mesajda yayınlayın. Wi-Fi'nin bedelini on kez yerine bir kez ödersiniz.
- Wi-Fi yolunu iyileştirin. Node'u sinyalin güçlü olduğu bir yere yerleştirin. Zayıf sinyal; yeniden denemeler, daha düşük veri hızları ve daha uzun uyanık kalma süresi demektir.
- Harici bir güç zamanlayıcısı kullanın. Tüm kartın gücünü kesen ve bir programa göre yeniden veren bir zamanlayıcı çipi, regülatör ve uyku akımlarını tamamen ortadan kaldırır. Bu tasarımda betik soğuk açılıştan bir kez çalışır, yayın yapar, ardından zamanlayıcıya kapanma sinyali verir. Döngüler arasında RAM'i kaybedersiniz; bu yüzden sayaçları flash belleğe idareli şekilde kaydedin ya da durumu retained message'lar aracılığıyla broker'ın tutmasına izin verin.
- Yanıp sönen her şeyi devre dışı bırakın. Pico'daki ve sensör breakout kartlarındaki durum LED'leri sürekli akım çeker. Mümkün olan breakout'larda güç LED'ini sökün veya hattını kesin.
Üretim: Özel Kimlik Bilgilerine ve TLS'e Geçiş
Herkese açık broker geliştirme için idealdir, ancak sahaya kurulan bir sensör kendi kimlik bilgilerinizi kullanmalıdır. ConnectMQ gibi bir yönetilen MQTT broker üzerinde portalda bir broker oluşturur ve üretilen bir kullanıcı adı, parola ve client ID alırsınız. Bunları secrets.py içine YOUR_USERNAME, YOUR_PASSWORD ve YOUR_CLIENT_ID olarak koyun. Client ID verilen kimlik bilgilerine bağlıdır; bu nedenle her node kendisi için üretileni kullanmalıdır.
Port 8883'te TLS her uyanmaya bir el sıkışma ekler; bu da ek uyanık kalma süresine ve dolayısıyla pil tüketimine mal olur. Güvenilir bir ev ağındaki sensörler için bazı kişiler düz TCP'yi kabul eder; binanın dışına çıkan her şey için şifreleme bu maliyete değer. Pico W ile TLS üzerinden MQTT rehberi MicroPython için SSL context kurulumunu gösterir. Node'unuzdaki gerçek etkiyi bilmek için öncesinde ve sonrasında awake_ms değerini ölçün.
Retained message'lar burada da kullanışlıdır. Son okumayı retain bayrağıyla yayınlarsanız, saatler sonra açılan bir pano bir sonraki uyanma için on dakikaya kadar beklemek yerine en son değeri hemen gösterir. ConnectMQ tüm planlarda retained message'ları destekler ve portal panosu ile canlı topic gezgini, bir subscriber yazmadan her node'un mesajlarının gelişini izlemenizi sağlar.
Sorun Giderme
| Belirti | Olası neden | Çözüm |
|---|---|---|
vbat sıfıra yakın veya rastgele okunuyor |
ADC, Wi-Fi aktifken okunmuş | VSYS'i wlan.active(True) öncesinde okuyun |
| Node bir kez yayın yapıp duruyor | Wi-Fi lightsleep öncesinde deinit edilmemiş | active(False) ve deinit() çağırın |
Bağlanırken OSError: -2 |
DNS başarısız veya Wi-Fi tam olarak ayağa kalkmamış | isconnected() kontrol edin ve bir kez yeniden deneyin |
awake_ms sürekli artıyor |
Zayıf sinyal veya yoğun erişim noktası | Node'u veya erişim noktasını taşıyın |
| Pil beklenenden çok daha erken bitiyor | LED, sensör bekleme modu veya regülatör tüketimi | LED'leri sökün, sensör uyku modunu kontrol edin, bir güç zamanlayıcısı ekleyin |
ConnectMQ ile Başlayın
Pico W prototipiniz tezgâhtan ayrılmaya hazır olduğunda app.connectmq.com adresindeki ConnectMQ portalında özel bir broker oluşturun. Ücretsiz Serverless planı kredi kartı gerektirmez, QoS 1'i ve 25 bağlantıya kadar destekler; bu da küçük bir pilli sensör filosunu rahatça karşılar. Daha fazla Pi projesi için Raspberry Pi MQTT rehberi serinin tamamını bir araya getirir.
Sık Sorulan Sorular
Bir Pico W, MQTT ile pille ne kadar dayanır?
Bu çoğunlukla yayın aralığına, Wi-Fi bağlantı süresine ve kullandığınız pillere bağlıdır; bu yüzden tek bir rakama güvenmek yerine kendi node'unuzu ölçün. Birkaç gün boyunca awake_ms ve vbat değerlerini kaydetmek, tahmin yürütebileceğiniz güvenilir bir trend verir.
Pico W uyurken MQTT'ye bağlı kalabilir mi?
Pil dostu bir şekilde değil. MQTT oturumunu canlı tutmak radyonun ağa bağlı kalmasını gerektirir; bu da pilleri hızla tüketir, bu yüzden bunun yerine her uyanmada yeniden bağlanın.
Pilli bir sensör için QoS 0 mı yoksa QoS 1 mi kullanmalıyım?
QoS 1 genellikle daha iyi bir seçimdir, çünkü publish() siz radyoyu kapatmadan önce broker'ın onayını bekler. Ek gidiş-dönüş, Wi-Fi'ye katılmanın maliyetine kıyasla küçüktür.
Pico W'de machine.deepsleep, lightsleep'ten daha mı iyi?
RP2040 MicroPython portunda fark mütevazıdır ve deepsleep kartı sıfırladığı için RAM durumunu kaybedersiniz. En uzun ömür için gücü tamamen kesen harici bir zamanlayıcı her ikisinden de üstündür.



