Raspberry Pi

Raspberry Pi Zero 2 W MQTT Sensör Düğümü: Kompakt, Düşük Güçlü ve Güvenilir

BME280 okuyan, ortam ve sağlık verilerini MQTT 5 ile yayınlayan, daha az güç tüketen ve aylarca gözetimsiz çalışabilen küçük, ekransız bir Raspberry Pi Zero 2 W sensör düğümü kurun.

Bir raspberry pi zero 2 w mqtt sensör düğümünde, küçük bir muhafaza içinde BME280 sensörüyle ölçümleri buluta gönderen minik Raspberry Pi Zero 2 W
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

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

  1. Resmi veya yüksek kaliteli bir adaptör kullanın; vcgencmd get_throttled çalıştırın ve throttled=0x0 bekleyin.
  2. Günlüğü RAM'de tutun ve yayın döngüsünde dosya yazmaktan kaçının.
  3. Donmuş bir çekirdeğin yeniden başlaması için /etc/systemd/system.conf içinde RuntimeWatchdogSec=15 ile donanım watchdog'unu etkinleştirin.
  4. BME280'i karttan uzakta, kısa bir kabloyla monte edin; Zero etrafındaki havayı ısıtır.
  5. Sağlık verilerini yayınlayın ve düğüm kaybolduğunda status topic'inin offline göstermesi için last will ayarlayın.
  6. 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.

İ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.