Bir Raspberry Pi Zero 2 W MQTT düğümü, size sakız paketi boyutunda tam bir Linux bilgisayar verir; bu da onu Python, TLS ve uzaktan erişim gerektiren ama tam boy bir karta ihtiyaç duymayan sensör düğümleri için mükemmel kılar. Bu rehberde ekransız (headless) bir Zero 2 W kuracak, güç tüketimini azaltacak, bir BME280 ortam sensörünü okuyacak ve ölçümleri cihaz sağlığı verileriyle birlikte MQTT 5 üzerinden yayınlayacaksınız; aylarca gözetimsiz çalışmak için gereken sağlamlaştırma adımları da dahil.
Zero 2 W Neden İyi Bir Sensör Düğümüdür
Zero 2 W dört çekirdekli 64 bit Arm Cortex-A53 işlemciye, 512 MB RAM'e, 2,4 GHz Wi-Fi ve Bluetooth'a ve standart 40 pinli GPIO başlığına sahiptir. Bu; Python'u, TLS'li paho-mqtt'yi ve birkaç sensörü bolca boş kapasiteyle çalıştırmaya yeter ve bunu bir Pi 4 veya Pi 5'ten belirgin şekilde daha az güç çekerek yapar.
Ancak bir mikrodenetleyici değildir. Ölçümler arasında derin uykuya geçemez ve Linux'u bir SD karttan başlatır. Düğümünüzün aylarca pille çalışması gerekiyorsa ESP32 daha iyi bir araçtır; Raspberry Pi vs ESP32 karşılaştırmamız bu ödünleşimi açıklar. Zero 2 W, şebeke veya USB gücünün mevcut olduğu ve son miliwatt yerine Linux araçlarına, SSH erişimine ve Python'a değer verdiğiniz yerlerde parlar.
Parça Listesi
| Parça | Amaç |
|---|---|
| Raspberry Pi Zero 2 W | Düğümün kendisi |
| Kaliteli 5 V 2,5 A micro USB adaptör | Düşük voltaj, çökmelerin en yaygın sebebidir |
| A2 sınıfı microSD kart, 16 GB veya üzeri | İşletim sistemi ve uygulama |
| BME280 breakout kartı (I2C) | Sıcaklık, nem, basınç |
| Lehimli 40 pin başlık veya lehimlenen kablolar | Zero 2 W başlıksız gelir |
Raspberry Pi OS Lite ile Ekransız Kurulum
Raspberry Pi OS Lite (64 bit) yazmak için Raspberry Pi Imager'ı kullanın. Gelişmiş seçeneklerde hostname'i belirleyin, SSH'yi açık anahtarla etkinleştirin, Wi-Fi ağınızı ve ülkenizi girin ve kullanıcınızı oluşturun. Lite imajında masaüstü yoktur; bu da RAM, depolama yazmaları ve güçten tasarruf sağlar. Zero'yu başlatın, bir dakika bekleyin, ardından bağlanın:
ssh pi@zero-node-01.local
sudo apt update && sudo apt full-upgrade -y
sudo raspi-config nonint do_i2c 0
sudo apt install -y python3-venv i2c-tools
Zero 2 W'nin yalnızca 2,4 GHz Wi-Fi desteklediğini unutmayın. Ağda hiç görünmüyorsa erişim noktanızın 2,4 GHz bandında yayın yaptığını ve Wi-Fi ülke ayarının doğru olduğunu kontrol edin.
Güç Tüketimini ve SD Kart Aşınmasını Azaltmak
Şu satırları /boot/firmware/config.txt dosyasına ekleyin ve yeniden başlatın:
# Disable Bluetooth if you do not need it
dtoverlay=disable-bt
# Turn off the activity LED
dtparam=act_led_trigger=none
Ardından rutin loglamanın SD kartı aşındırmaması için sistem günlüğünü (journal) RAM'de tutun:
sudo mkdir -p /etc/systemd/journald.conf.d
printf "[Journal]\nStorage=volatile\nRuntimeMaxUse=16M\n" | \
sudo tee /etc/systemd/journald.conf.d/volatile.conf
sudo systemctl restart systemd-journald
sudo systemctl disable --now bluetooth hciuart 2>/dev/null || true
Bir güç ayarı bilinçli bir ödünleşimdir. Wi-Fi güç tasarrufu tüketimi azaltır, ancak gelen paketleri keepalive zaman aşımlarına ve yeniden bağlanmalara yol açacak kadar geciktirebilir. Loglarınızda sık bağlantı kopmaları görürseniz sudo iw wlan0 set power_save off ile kapatın ve NetworkManager üzerinden kalıcı hale getirin. Yalnızca yayın yapan bir düğüm için güç tasarrufunu açık bırakmak çoğu zaman sorun yaratmaz.
BME280 Bağlantıları
| BME280 | Zero 2 W |
|---|---|
| VIN | 3.3 V (fiziksel pin 1) |
| GND | GND (fiziksel pin 6) |
| SCL | GPIO3 / SCL (fiziksel pin 5) |
| SDA | GPIO2 / SDA (fiziksel pin 3) |
i2cdetect -y 1 komutunu çalıştırın. Sensörü 0x76 veya 0x77 adresinde görmelisiniz. Hangisi olduğunu not edin; betik varsayılan olarak 0x76 kullanır.
Python Ortamını Kurmak
mkdir -p ~/node && cd ~/node
python3 -m venv .venv
source .venv/bin/activate
pip install "paho-mqtt>=2.0" adafruit-circuitpython-bme280
Raspberry Pi Zero 2 W MQTT Betiği
Bu betik MQTT 5 kullanır; böylece her ölçüm bir mesaj süresi dolum aralığı (message expiry interval) taşıyabilir: kalıcı oturuma sahip bir abone beş dakikadan uzun süre çevrim dışı kalırsa, eskimiş ölçümler geç teslim edilmek yerine atılır. Ayrıca CPU sıcaklığı, Wi-Fi sinyali ve çalışma süresini içeren bir sağlık mesajı yayınlar; düğüm bir dolabın içine gizlendiğinde bu çok değerlidir. node.py olarak kaydedin:
#!/usr/bin/env python3
"""Pi Zero 2 W sensor node: BME280 + health metrics over MQTT 5."""
import json
import os
import time
import uuid
import board
import paho.mqtt.client as mqtt
from adafruit_bme280 import basic as adafruit_bme280
from paho.mqtt.packettypes import PacketTypes
from paho.mqtt.properties import Properties
BROKER = os.getenv("MQTT_HOST", "broker.connectmq.com")
PORT = int(os.getenv("MQTT_PORT", "1883"))
USERNAME = os.getenv("MQTT_USERNAME")
PASSWORD = os.getenv("MQTT_PASSWORD")
CLIENT_ID = os.getenv("MQTT_CLIENT_ID", f"zero2w-{uuid.uuid4().hex[:8]}")
PREFIX = os.getenv("MQTT_PREFIX", "connectmq/demo/4b9e27/zero-node-01")
INTERVAL = int(os.getenv("PUBLISH_INTERVAL", "60"))
BME_ADDRESS = int(os.getenv("BME280_ADDRESS", "0x76"), 16)
i2c = board.I2C()
bme = adafruit_bme280.Adafruit_BME280_I2C(i2c, address=BME_ADDRESS)
expiry = Properties(PacketTypes.PUBLISH)
expiry.MessageExpiryInterval = 300
def cpu_temp():
with open("/sys/class/thermal/thermal_zone0/temp") as f:
return round(int(f.read()) / 1000, 1)
def wifi_rssi():
try:
with open("/proc/net/wireless") as f:
for line in f:
if line.strip().startswith("wlan0:"):
return float(line.split()[3].rstrip("."))
except (OSError, ValueError, IndexError):
pass
return None
def uptime_s():
with open("/proc/uptime") as f:
return int(float(f.read().split()[0]))
def on_connect(client, userdata, flags, reason_code, properties):
if reason_code.is_failure:
print(f"Connection refused: {reason_code}")
return
print(f"Connected as {CLIENT_ID}")
client.publish(f"{PREFIX}/status", "online", qos=1, retain=True)
client = mqtt.Client(
mqtt.CallbackAPIVersion.VERSION2,
client_id=CLIENT_ID,
protocol=mqtt.MQTTv5,
)
client.on_connect = on_connect
client.will_set(f"{PREFIX}/status", "offline", qos=1, retain=True)
client.reconnect_delay_set(min_delay=2, max_delay=120)
if USERNAME:
client.username_pw_set(USERNAME, PASSWORD)
if PORT == 8883:
client.tls_set()
client.connect(BROKER, PORT, keepalive=60)
client.loop_start()
try:
while True:
now = int(time.time())
reading = {
"temperature": round(bme.temperature, 2),
"humidity": round(bme.relative_humidity, 1),
"pressure": round(bme.pressure, 1),
"ts": now,
}
health = {
"cpu_temp": cpu_temp(),
"rssi": wifi_rssi(),
"uptime": uptime_s(),
"ts": now,
}
client.publish(f"{PREFIX}/env", json.dumps(reading), qos=1, properties=expiry)
client.publish(f"{PREFIX}/health", json.dumps(health), qos=0, properties=expiry)
print(reading, health)
time.sleep(INTERVAL)
except KeyboardInterrupt:
pass
finally:
client.publish(f"{PREFIX}/status", "offline", qos=1, retain=True).wait_for_publish(2)
client.loop_stop()
client.disconnect()
Betiği önce python node.py ile ön planda test edin, ardından başka bir makineden izleyin:
mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-4b9e27 -V mqttv5 \
-t 'connectmq/demo/4b9e27/#' -v
Ücretsiz genel MQTT broker'ı MQTT 5'i destekler ve bu kontrol için uygundur; ancak üzerindeki her şey herkes tarafından okunabilir, bu yüzden 4b9e27 gibi rastgele bir önek kullanın.
Gözetimsiz Çalıştırma
Bir sensör düğümü ancak bir güç kesintisi veya çökme sonrasında kendi kendine geri gelirse işe yarar. /etc/systemd/system/sensor-node.service dosyasını oluşturun:
[Unit]
Description=Zero 2 W MQTT sensor node
After=network-online.target
Wants=network-online.target
[Service]
User=pi
WorkingDirectory=/home/pi/node
EnvironmentFile=/home/pi/node/node.env
ExecStart=/home/pi/node/.venv/bin/python node.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Bağlantı ayarlarınızı /home/pi/node/node.env dosyasına koyun ve chmod 600 ile erişimi kısıtlayın:
MQTT_HOST=broker.connectmq.com
MQTT_PORT=8883
MQTT_USERNAME=YOUR_USERNAME
MQTT_PASSWORD=YOUR_PASSWORD
MQTT_CLIENT_ID=YOUR_CLIENT_ID
MQTT_PREFIX=site1/office/zero-node-01
sudo systemctl enable --now sensor-node ile etkinleştirin. Servis dosyaları ve loglar hakkında daha fazlası için Python MQTT betiğini açılışta çalıştırma yazısına bakın.
Sahadaki Düğümleri Güncellemek
Bir düğüm duvara monte edildikten sonra da kodunu değiştirmek isteyeceksiniz. Uygulamayı bir git deposunda tutun ve SSH üzerinden git pull ardından sudo systemctl restart sensor-node ile güncelleyin. Bağlantı ayarları betikte değil node.env içinde durduğu için aynı kod her düğümde çalışır ve yalnızca ortam dosyası farklıdır. Bir değişikliği tüm düğümlere göndermeden önce birinde test edin ve bir gün boyunca health ve status topic'lerini izleyin. Sağlık mesajı yayınlamayı bırakan ama hâlâ online görünen bir düğüm genellikle bir sensör okumasında takılmıştır; bu, donanım erişiminin etrafına zaman aşımları eklemeniz gerektiğine dair bir ipucudur.
Sağlamlaştırma Kontrol Listesi
- Resmi veya yüksek kaliteli bir adaptör kullanın;
vcgencmd get_throttledçalıştırın vethrottled=0x0bekleyin. - Günlüğü RAM'de tutun ve yayın döngüsünde dosya yazmaktan kaçının.
- Donmuş bir çekirdeğin yeniden başlaması için
/etc/systemd/system.confiçindeRuntimeWatchdogSec=15ile donanım watchdog'unu etkinleştirin. - BME280'i karttan uzakta, kısa bir kabloyla monte edin; Zero etrafındaki havayı ısıtır.
- Sağlık verilerini yayınlayın ve düğüm kaybolduğunda status topic'inin
offlinegöstermesi için last will ayarlayın. - Düğüm masanızdan ayrılmadan önce TLS ve cihaz başına kimlik bilgileri kullanın.
Çok Sayıda Düğüme Ölçeklenmek
Bir Zero 2 W bir projedir; yirmi tanesi bir filodur. Her düğüme kendi kimlik bilgilerini ve client ID'sini, site1/<room>/<node>/env gibi öngörülebilir bir topic'i ve aynı imajı verin. Bir barındırılan MQTT broker, kendi sunucunuzu çalıştırma ve güvenliğini sağlama ihtiyacını ortadan kaldırır. ConnectMQ ile her düğümün client ID'si kimlik bilgilerine bağlanır, portalın cihazlar görünümü düğümleri topic hiyerarşilerine göre listeler ve bir eşik alarm kuralı bir oda fazla nemli olduğunda sizi uyarabilir. Ücretsiz Serverless planı 25 bağlantıya kadar izin verir; bu da küçük bir filoyu ve bir dashboard'u karşılar.
Daha basit sensörler kullanmayı tercih ederseniz Raspberry Pi DS18B20 MQTT rehberi Zero 2 W'de değişiklik yapmadan çalışır; Raspberry Pi MQTT rehberi ise bu düğümün arkasındaki yayınlama ve abone olma temellerini ele alır.
ConnectMQ ile Başlayın
Zero 2 W düğümlerinizi her ağdan ulaşabilecekleri bir bulut MQTT broker'ına bağlayın. Kredi kartı gerekmeden ConnectMQ'ya ücretsiz kaydolun, bir broker oluşturun ve oluşturulan kullanıcı adını, parolayı ve client ID'yi node.env dosyasına yapıştırın. Düğümünüz 8883 portunda TLS üzerinden MQTT 5 ile bağlanır ve her ölçüm canlı topic gezgininde görünür.
Sık Sorulan Sorular
Raspberry Pi Zero 2 W pille çalışabilir mi?
Yalnızca kısa süreler için; çünkü derin uykuya geçemez ve sürekli güç çeker. Uzun pil ömrü için ESP32 gibi bir mikrodenetleyici kullanın ve Zero 2 W'yi güç bulunan yerlere ayırın.
Bir MQTT sensör düğümü için 512 MB RAM yeterli mi?
Evet. paho-mqtt, TLS ve bir sensör kütüphanesi içeren bir Python betiği, Raspberry Pi OS Lite üzerinde bunun küçük bir kısmını kullanır ve ikinci bir servis için yer bırakır.
Zero 2 W'm neden sürekli MQTT bağlantısını kaybediyor?
Olağan sebepler zayıf bir güç kaynağı, kötü bir 2,4 GHz sinyali veya agresif Wi-Fi güç tasarrufudur. vcgencmd get_throttled çıktısını ve sağlık mesajındaki RSSI değerini kontrol edin, güç tasarrufunu kapatmayı deneyin.
Zero 2 W MQTT 5'i destekler mi?
Evet. MQTT 5 bir istemci kütüphanesi özelliğidir ve paho-mqtt 2.x, mesaj süresi dolumu ve user property'ler dahil onu tam olarak destekler.



