Raspberry Pi

BME680 ve MQTT ile Raspberry Pi Hava Kalitesi Ölçer

Bir BME680'i Raspberry Pi'ye bağlayın, gaz temel çizgisini kalibre edin, basit bir iç mekan hava kalitesi skoru hesaplayın ve her şeyi her yerden izleyebileceğiniz bir MQTT broker'a aktarın.

Gaz, nem ve sıcaklık ölçümlerini bir MQTT panosuna gönderen BME680 sensör kartlı Raspberry Pi hava kalitesi ölçer
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

Bosch BME680 etrafında kurulan bir Raspberry Pi hava kalitesi ölçer, bir ofise, atölyeye veya yatak odasına koyabileceğiniz en faydalı küçük sensör projelerinden biridir. Bu eğitimde sensörü bağlayacak, Python ile sıcaklık, nem, basınç ve gaz direncini okuyacak, bu ham değerleri basit bir iç mekan hava kalitesi (IAQ) tahminine dönüştürecek ve herhangi bir panonun veya telefonun canlı takip edebilmesi için her şeyi MQTT üzerinden yayınlayacaksınız.

BME680 Gerçekte Neyi Ölçer?

BME680, dört ölçümü tek bir küçük pakette birleştirir: sıcaklık, bağıl nem, barometrik basınç ve ısıtılmış metal oksit gaz katmanının direnci. İlk üçü basit fiziksel değerlerdir. Dördüncüsü ise ilginç olanı ve aynı zamanda en sık yanlış anlaşılanıdır.

Gaz sensörü belirli bir gazı veya ppm cinsinden bir konsantrasyonu raporlamaz. Temizlik ürünlerinden, yemek pişirmekten, boyadan, insanlardan ve mobilyalardan çıkan uçucu organik bileşikler (VOC'ler) ısıtılmış algılama katmanıyla tepkimeye girer ve direncini düşürür. Temiz hava yüksek, kirli hava daha düşük direnç verir. Bu da ham değeri göreli bir gösterge yapar: eğilimleri ve olayları ("birisi yemek pişirmeye başladı", "odanın havalandırılması gerekiyor") tespit etmek için harika, ama bir laboratuvar ölçümü değil.

Bosch, bu ölçümleri 0 ile 500 arasında kalibre edilmiş bir IAQ endeksine ve tahmini CO2 eşdeğerlerine dönüştüren BSEC adlı kapalı kaynaklı bir kütüphane sunar. İyi çalışır, ancak kendi lisansı ve entegrasyon eforu olan ikili bir dosyadır. Hobi veya laboratuvar amaçlı bir ölçer için temel çizgiye dayalı şeffaf bir skor çoğu zaman yeterlidir; burada kuracağımız da budur. Daha sonra BSEC'e ihtiyaç duyarsanız projenin MQTT tarafı tamamen aynı kalır.

Ölçüm Birim Tipik iç mekan aralığı Size ne söyler
Sıcaklık °C 18 ile 26 arası Konfor ve gaz katmanı için bir düzeltme faktörü
Bağıl nem % 30 ile 60 arası Konfor, küf riski, IAQ skorunun bir parçası
Basınç hPa 950 ile 1050 arası Hava durumu eğilimi, hava kalitesi değil
Gaz direnci Ohm Onlarca ile yüzlerce kOhm arası Göreli VOC seviyesi; yüksek olan daha temizdir

Parçalar ve Kablolama

İhtiyacınız olanlar:

  1. Raspberry Pi OS çalıştıran, 40 pinli konnektöre sahip herhangi bir Raspberry Pi (Zero 2 W, 3, 4 veya 5).
  2. Bir BME680 breakout kartı. Adafruit, Pimoroni ve birçok jenerik kart çalışır; sizinkinin 0x76 mı yoksa 0x77 I2C adresini mi kullandığını kontrol edin.
  3. Dört jumper kablo.

Breakout kartı Pi'ye I2C üzerinden bağlayın:

BME680 pini Raspberry Pi pini
VIN / 3V3 Pin 1 (3,3 V)
GND Pin 6 (GND)
SDA / SDI Pin 3 (GPIO 2, SDA)
SCL / SCK Pin 5 (GPIO 3, SCL)

Sensörü Pi'nin kendisinden uzağa monte edin. İşlemci ve güç regülatörü kartı ısıtır; doğrudan SoC'nin üzerinde duran bir sensör birkaç derece yüksek okur ve nemi aşağı çeker. 10 ila 15 cm'lik bir kablo veya küçük bir aralayıcı belirgin bir fark yaratır.

Raspberry Pi'yi Hazırlamak

I2C'yi etkinleştirin, sensörün göründüğünü doğrulayın ve bir Python sanal ortamı oluşturun (Raspberry Pi OS Bookworm ve sonrası, pip kurulumları için bunu zorunlu kılar):

sudo raspi-config nonint do_i2c 0
sudo apt update && sudo apt install -y i2c-tools python3-venv
i2cdetect -y 1          # expect 76 or 77 in the grid

python3 -m venv ~/aq-env
source ~/aq-env/bin/activate
pip install adafruit-circuitpython-bme680 paho-mqtt

i2cdetect boş bir tablo gösteriyorsa SDA ve SCL'yi yeniden kontrol edin (karıştırmak kolaydır) ve kartın 3,3 V'tan beslendiğinden emin olun. Standart olmayan bir imaj kullanıyorsanız resmi Raspberry Pi yapılandırma dokümantasyonu I2C kurulumunu daha ayrıntılı anlatıyor.

Raspberry Pi Hava Kalitesi Ölçer Betiğini Oluşturmak

Aşağıdaki betik dört şey yapar: sensörü her on saniyede bir okur, gaz temel çizgisini oluşturmak için beş dakikalık bir ısınma (burn-in) süreci çalıştırır, gaz ve nemden bir IAQ tahmini hesaplar ve broker.connectmq.com adresindeki ücretsiz genel test broker'ına bir JSON mesajı yayınlar. Ayrıca ölçer çevrimdışı olduğunda abonelerin bilmesi için bir Last Will ayarlar.

#!/usr/bin/env python3
"""Raspberry Pi air quality monitor: BME680 -> MQTT."""
import json
import time
import uuid

import board
import adafruit_bme680
import paho.mqtt.client as mqtt

BROKER = "broker.connectmq.com"
PORT = 1883
DEVICE_ID = "pi-aq-" + uuid.uuid4().hex[:6]
BASE_TOPIC = f"connectmq/demo/{DEVICE_ID}/air"
I2C_ADDRESS = 0x77          # change to 0x76 for Pimoroni-style boards
INTERVAL = 10               # seconds between readings
BURN_IN = 300               # seconds used to learn the clean-air baseline
HUM_BASELINE = 40.0         # ideal indoor humidity in percent
HUM_WEIGHT = 0.25           # share of the score coming from humidity


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.publish(f"{BASE_TOPIC}/status", "online", qos=1, retain=True)


def iaq_score(gas, hum, gas_baseline):
    """0-100, higher is better. Simple, transparent estimate, not Bosch BSEC."""
    hum_offset = hum - HUM_BASELINE
    if hum_offset > 0:
        hum_score = (100 - HUM_BASELINE - hum_offset) / (100 - HUM_BASELINE)
    else:
        hum_score = (HUM_BASELINE + hum_offset) / HUM_BASELINE
    hum_score *= HUM_WEIGHT * 100

    gas_offset = gas_baseline - gas
    if gas_offset > 0:
        gas_score = (gas / gas_baseline) * (100 - HUM_WEIGHT * 100)
    else:
        gas_score = 100 - HUM_WEIGHT * 100
    return round(max(0.0, min(100.0, hum_score + gas_score)), 1)


def main():
    i2c = board.I2C()
    sensor = adafruit_bme680.Adafruit_BME680_I2C(i2c, address=I2C_ADDRESS)
    sensor.sea_level_pressure = 1013.25

    client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=DEVICE_ID)
    client.will_set(f"{BASE_TOPIC}/status", "offline", qos=1, retain=True)
    client.on_connect = on_connect
    client.connect(BROKER, PORT, keepalive=60)
    client.loop_start()

    print(f"Burn-in for {BURN_IN} s, publishing to {BASE_TOPIC}/#")
    samples = []
    start = time.time()
    while time.time() - start < BURN_IN:
        samples.append(sensor.gas)
        time.sleep(1)
    gas_baseline = sum(samples[-50:]) / len(samples[-50:])
    print(f"Gas baseline: {gas_baseline:.0f} Ohm")

    while True:
        gas = sensor.gas
        hum = sensor.relative_humidity
        payload = {
            "ts": int(time.time()),
            "temperature_c": round(sensor.temperature, 2),
            "humidity_pct": round(hum, 1),
            "pressure_hpa": round(sensor.pressure, 1),
            "gas_ohm": int(gas),
            "iaq_score": iaq_score(gas, hum, gas_baseline),
        }
        client.publish(f"{BASE_TOPIC}/telemetry", json.dumps(payload), qos=1)
        print(payload)
        time.sleep(INTERVAL)


if __name__ == "__main__":
    main()

Betiği python aq_monitor.py ile çalıştırın. Isınma süresince ısıtıcı kararlı hale gelir; yepyeni bir sensör ilk bir iki gününde kayma gösterir, bu yüzden en ilk çalıştırmadaki temel çizgiye güvenmeyin. Pratik bir alışkanlık, betiği temiz havada başlatmaktır (ilk beş dakika bir pencere açın), çünkü temel çizgi oturumun geri kalanında "temiz"in ne anlama geldiğini tanımlar.

IAQ tahminini yorumlamak

Skor, Bosch'un endeksine göre terstir: 100, ideal nemle birlikte temel çizgi kadar temiz hava demektir; daha düşük değerler daha kötüdür. Kabaca bir okuma rehberi:

Skor Anlamı Tipik eylem
80 ile 100 arası Temel çizgiye yakın Yapılacak bir şey yok
60 ile 80 arası Fark edilir VOC'ler veya hedef dışı nem Takipte kalın
40 ile 60 arası Temel çizgiden açıkça kötü Odayı havalandırın
40'ın altı Yakında güçlü bir kaynak var Kaynağı bulun, hemen havalandırın

Temel çizgi göreli olduğu için skorları farklı cihazlar arasında değil, aynı odada zaman içinde karşılaştırın.

Verileri Canlı İzlemek

İkinci bir terminal açın (Pi'de veya dizüstü bilgisayarınızda) ve Mosquitto istemcisiyle abone olun. Cihaz kimliğini betiğinizin yazdırdığı kimlikle değiştirin:

mosquitto_sub -h broker.connectmq.com -p 1883 -i aq-viewer-$RANDOM \
  -t "connectmq/demo/pi-aq-1a2b3c/air/#" -v

Önce retained online durumunu, ardından her on saniyede bir telemetri mesajını görmelisiniz. Python betiğini Ctrl+C ile durdurduğunuzda, keepalive süresi dolduktan sonra broker offline Last Will mesajını iletir. Genel MQTT test broker'ının topic'i bilen herkes tarafından okunabildiğini unutmayın; oda düzeyindeki hava verileri sorun değildir, ancak oraya kişisel hiçbir şey gönderilmemelidir.

Ölçeri Gözetimsiz Çalıştırmak

SSH oturumunuzu kapattığınızda duran bir sensör pek de bir ölçer sayılmaz. Betiğin açılışta başlaması ve hatalardan sonra yeniden başlaması için bir systemd birimi oluşturun:

# /etc/systemd/system/aq-monitor.service
[Unit]
Description=BME680 air quality monitor
After=network-online.target
Wants=network-online.target

[Service]
User=pi
ExecStart=/home/pi/aq-env/bin/python /home/pi/aq_monitor.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now aq-monitor
journalctl -u aq-monitor -f

Kullanıcı adını ve yolları kurulumunuza göre ayarlayın. Aynı model, diğer sensörler için DS18B20 sıcaklık projesinde ve DHT22 nem eğitiminde daha ayrıntılı açıklanıyor; bunları tek bir Pi üzerinde bu projeyle birleştirebilirsiniz.

Özel Bir Broker'a Geçiş

Deneylerin ötesindeki her şey için kimlik bilgileri ve TLS ile kendi broker'ınıza yayın yapın. ConnectMQ'da kaydolur, bir broker oluşturur ve otomatik oluşturulan bir kullanıcı adı, parola ve client ID alırsınız. Ardından bağlantı bloğunu değiştirin:

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set()                       # system CA store validates the Let's Encrypt certificate
client.will_set(f"{BASE_TOPIC}/status", "offline", qos=1, retain=True)
client.connect("broker.connectmq.com", 8883, keepalive=60)

Barındırılan bir MQTT broker ile bir Mosquitto örneğini kendiniz yamalı ve erişilebilir tutmak zorunda kalmazsınız; portalın canlı topic gezgini de ek araç gerektirmeden gelen telemetriyi gösterir. Ayrıca iaq_score veya humidity_pct üzerinde bir eşik alarm kuralı ekleyebilirsiniz; böylece portalın alarm günlüğü oda bir sınırı her aştığında bunu kaydeder.

Sorun Giderme

  1. ValueError: No I2C device at address: adres yanlış. i2cdetect'in gösterdiği adresi (0x76 veya 0x77) kullanın.
  2. Gaz direnci çok düşükte takılı kalıyor ve hiç yükselmiyor: sensör hâlâ şartlanıyor. Birkaç saat boyunca enerjili bırakın; ilk kullanımdaki kayma normaldir.
  3. Sıcaklık birkaç derece fazla: Pi'den veya sensörün kendi ısıtıcısından gelen ısı. Sensörü karttan uzaklaştırın veya bir referans termometreyle karşılaştırdıktan sonra sabit bir ofset uygulayın.
  4. Özel broker'da bağlantı reddediliyor: client ID'nin verilen kimlik bilgileriyle birebir eşleştiğini kontrol edin; ConnectMQ client ID'leri kimlik bilgilerine bağlar.
  5. Kısa bir ağ kesintisinden sonra mesajlar duruyor: loop_start() çalışırken paho otomatik olarak yeniden bağlanır, ancak çevrimdışıyken yayınlanan QoS 1 mesajları yalnızca bellekte kuyruğa alınır. Uzun kesintiler için yerel bir tampon ekleyin.

Projeyi Genişletme Fikirleri

Veri akmaya başladıktan sonra gerisi tamamen MQTT'dir. Node-RED abone olup bir röle üzerinden havalandırma fanını sürebilir. Telegraf, uzun vadeli grafikler için JSON'u InfluxDB'ye yazabilir. Başka bir odadaki ikinci bir Pi kendi cihaz kimliğiyle yayın yaparak alanları yan yana karşılaştırmanızı sağlayabilir. Platforma yeniyseniz Raspberry Pi MQTT eğitimi, bu projenin üzerine kurulduğu istemci, topic ve QoS temellerini ele alıyor.

ConnectMQ ile Başlayın

Raspberry Pi hava kalitesi ölçerinizi birkaç dakika içinde genel test broker'ından TLS ile korunan özel bir broker'a taşıyın. ConnectMQ, tarayıcı içi MQTT istemcisi, canlı topic gezgini ve eşik alarmları sunan yönetilen bir broker sağlar. Kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve betiğinizi ona yönlendirin.

Sık Sorulan Sorular

BME680 IAQ değeri Bosch BSEC endeksiyle aynı mı?

Hayır. Bu eğitimdeki skor, gaz temel çizgisine ve neme dayanan şeffaf bir tahmindir. Bosch'un BSEC kütüphanesi otomatik temel çizgi takibiyle kalibre edilmiş 0 ile 500 arası bir endeks üretir ve MQTT topic'leri değiştirilmeden daha sonra devreye alınabilir.

BME680'in ısınması ne kadar sürer?

Isıtıcı birkaç dakika içinde kararlı hale gelir; betiğin beş dakikalık bir ısınma süresi kullanmasının nedeni budur. Yepyeni bir sensör çalışmasının ilk bir iki gününde kaymaya devam eder; ölçümler bundan sonra daha tutarlı hale gelir.

BME680 ile CO2 ölçebilir miyim?

Doğrudan hayır. BME680 VOC'lere tepki verir ve ondan türetilen her CO2 değeri bir tahmindir. Gerçek CO2 ölçümü için SCD40 veya SCD41 gibi bir NDIR sensör kullanın ve bunu BME680 verileriyle birlikte yayınlayın.

Ev tipi bir hava kalitesi ölçer için hangi MQTT broker'ı kullanmalıyım?

Genel test broker'ı denemeler için uygundur, ancak herkes onu okuyabilir. Kalıcı kullanım için ücretsiz bir ConnectMQ Serverless broker gibi kimlik bilgileri ve TLS içeren özel bir broker verilerinizi gizli tutar.

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