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:
- Raspberry Pi OS çalıştıran, 40 pinli konnektöre sahip herhangi bir Raspberry Pi (Zero 2 W, 3, 4 veya 5).
- Bir BME680 breakout kartı. Adafruit, Pimoroni ve birçok jenerik kart çalışır; sizinkinin
0x76mı yoksa0x77I2C adresini mi kullandığını kontrol edin. - 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
ValueError: No I2C device at address: adres yanlış.i2cdetect'in gösterdiği adresi (0x76veya0x77) kullanın.- 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.
- 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.
- Ö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.
- 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.



