CO2 ve ince partikülleri ölçen bir iç ortam hava kalitesi ölçer, insanlar yorgunluk hissetmeye ya da öksürmeye başlamadan çok önce bir odanın temiz havaya veya filtrelemeye ihtiyaç duyduğunu size söyler. Bu eğitimde bir ESP32, bir Sensirion SCD41 CO2 sensörü ve bir Plantower PMS5003 partikül sensörüyle böyle bir cihaz yapacak, ölçümleri MQTT üzerinden JSON olarak yayınlayacak ve bir ConnectMQ broker'ında havalandırma uyarıları kuracaksınız.
Sensörler Neyi Ölçer?
- CO2 (ppm), kullanılan odalarda havalandırmanın en iyi göstergesidir. Dış hava yaklaşık 400 ile 450 ppm arasındadır. Bina havalandırma yönergeleri genellikle 800 ile 1.000 ppm civarındaki değerleri, odadaki kişi sayısına göre temiz hava beslemesinin yetersiz olduğunun işareti olarak kabul eder. SCD41, VOC ölçümlerinden tahmin yürüten bir sensör değil, gerçek bir fotoakustik NDIR sensörüdür.
- PM2.5 (metreküp başına mikrogram); yemek pişirme, mum, dış ortam kirliliği veya inşaat tozundan gelen ince partikülleri ölçer. PMS5003 lazer saçılımı kullanır ve PM1.0, PM2.5 ile PM10 değerlerini raporlar.
- Sıcaklık ve nem SCD41 ile ücretsiz olarak gelir ve konfor açısından bağlam sağlar.
VOC ölçümü faydalı bir eklentidir. Bir Sensirion SGP41 veya Bosch BME680, temizlik ürünlerine ve malzemelerden yayılan gazlara tepki veren bir VOC indeksi ekler. Kodu kısa tutmak için ana yapıya dahil edilmemiştir.
Parçalar ve Bağlantılar
| Parça | Pin | ESP32 pini | Notlar |
|---|---|---|---|
| SCD41 | VDD | 3V3 | Breakout kartlarında genellikle pull-up dirençleri bulunur |
| SCD41 | GND | GND | |
| SCD41 | SDA | GPIO 21 | I2C veri |
| SCD41 | SCL | GPIO 22 | I2C saat |
| PMS5003 | VCC | 5V (VIN) | Fan 5 V gerektirir |
| PMS5003 | GND | GND | |
| PMS5003 | TX | GPIO 16 (RX2) | Sensör veri lojik seviyesi 3,3 V'tur |
| PMS5003 | RX | GPIO 17 (TX2) | İsteğe bağlı, yalnızca komutlar için |
esp32 kart paketiyle (core 3.x) Arduino IDE 2.x kullanın ve Library Manager'dan Sensirion I2C SCD4x (sürüm 1.x) ile PubSubClient kütüphanelerini kurun. PMS5003 çerçevesi doğrudan sketch içinde ayrıştırıldığı için ek bir kütüphaneye gerek yoktur.
Ölçeri pencerelerden, kapılardan ve hava üfleme menfezlerinden uzakta, nefes alma yüksekliğine yerleştirin ve PMS5003'ün hava girişini açık tutun. Açık bir pencerenin yanındaki sensör odayı değil, dış ortamı ölçer.
Sketch'in Tamamı
#include <WiFi.h>
#include <Wire.h>
#include <PubSubClient.h>
#include <SensirionI2cScd4x.h>
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
// Herkese açık test broker'ı. Üretimde 8883 + WiFiClientSecure ve portal kimlik bilgilerini kullanın.
const char* BROKER = "broker.connectmq.com";
const int PORT = 1883;
const char* TOPIC = "connectmq/demo/iaq-3hv9/office-201/air";
const unsigned long PUBLISH_MS = 30000;
WiFiClient net;
PubSubClient mqtt(net);
SensirionI2cScd4x scd4x;
HardwareSerial pmsSerial(2);
uint16_t co2 = 0;
float tempC = NAN, rh = NAN;
uint16_t pm1 = 0, pm25 = 0, pm10 = 0;
bool pmValid = false;
unsigned long lastPublish = 0;
// 32 baytlık bir PMS5003 çerçevesi oku: 0x42 0x4D, uzunluk, 13 veri kelimesi, sağlama toplamı
bool readPms() {
static uint8_t buf[32];
while (pmsSerial.available() >= 32) {
if (pmsSerial.peek() != 0x42) { pmsSerial.read(); continue; }
pmsSerial.readBytes(buf, 32);
if (buf[1] != 0x4D) continue;
uint16_t sum = 0;
for (int i = 0; i < 30; i++) sum += buf[i];
uint16_t check = (buf[30] << 8) | buf[31];
if (sum != check) continue;
// "atmosferik ortam" değerleri
pm1 = (buf[10] << 8) | buf[11];
pm25 = (buf[12] << 8) | buf[13];
pm10 = (buf[14] << 8) | buf[15];
return true;
}
return false;
}
void connectWifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(250);
}
void connectMqtt() {
while (!mqtt.connected()) {
String id = "iaq-" + String((uint32_t)ESP.getEfuseMac(), HEX);
if (!mqtt.connect(id.c_str())) delay(3000);
}
}
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
pmsSerial.begin(9600, SERIAL_8N1, 16, 17);
scd4x.begin(Wire, SCD41_I2C_ADDR_62);
scd4x.stopPeriodicMeasurement(); // yazılımsal sıfırlamadan sonra çalışıyor olabilir
delay(500);
if (scd4x.startPeriodicMeasurement() != 0) {
Serial.println("SCD41 not found, check wiring");
}
connectWifi();
mqtt.setServer(BROKER, PORT);
mqtt.setBufferSize(512);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) connectWifi();
if (!mqtt.connected()) connectMqtt();
mqtt.loop();
if (readPms()) pmValid = true;
bool ready = false;
if (scd4x.getDataReadyStatus(ready) == 0 && ready) {
uint16_t c; float t, h;
if (scd4x.readMeasurement(c, t, h) == 0 && c != 0) {
co2 = c; tempC = t; rh = h;
}
}
if (millis() - lastPublish >= PUBLISH_MS && co2 > 0) {
lastPublish = millis();
char msg[256];
snprintf(msg, sizeof(msg),
"{\"co2_ppm\":%u,\"temp_c\":%.1f,\"rh\":%.1f,\"pm1\":%u,\"pm25\":%u,\"pm10\":%u,\"pm_valid\":%s,\"rssi\":%d}",
co2, tempC, rh, pm1, pm25, pm10, pmValid ? "true" : "false", WiFi.RSSI());
mqtt.publish(TOPIC, msg);
Serial.println(msg);
}
}
SCD41 periyodik modda her beş saniyede bir yeni ölçüm üretir, PMS5003 ise yaklaşık saniyede bir çerçeve gönderir. Sketch en son değerleri tutar ve 30 saniyede bir yayınlar; bu, oda hava kalitesi için fazlasıyla yeterlidir.
Verilerin Gelişini İzleyin
Bir terminalden abone olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i iaq-view-3hv9 -t "connectmq/demo/iaq-3hv9/#" -v
Şuna benzer mesajlar görmelisiniz:
connectmq/demo/iaq-3hv9/office-201/air {"co2_ppm":742,"temp_c":23.4,"rh":41.8,"pm1":3,"pm25":6,"pm10":7,"pm_valid":true,"rssi":-58}
SCD41'in yakınında hafifçe nefes verin; CO2 değeri bir dakika içinde yükselir. Yakında bir kibrit yakıp söndürün; PM2.5 aniden artar. Her ikisi de sensörlerin ve ayrıştırıcının çalıştığını gösteren hızlı doğrulamalardır. Bu aşama için hesap gerektirmeyen ücretsiz herkese açık MQTT broker idealdir.
TLS Üzerinden Özel Bir Broker'a Geçiş
Oda hava verileri insanların ne zaman orada olduğunu ortaya koyar; bu nedenle üretimdeki ölçerler özel bir broker kullanmalıdır. ConnectMQ portalında bir broker oluşturun ve bağlantı kodunu değiştirin:
#include <WiFiClientSecure.h>
WiFiClientSecure net; // WiFiClient yerine
const int PORT = 8883;
// setup() içinde, mqtt.setServer() öncesinde:
// Tam doğrulama için ISRG Root X1 (Let's Encrypt) sertifikasını yükleyin:
// net.setCACert(ISRG_ROOT_X1_PEM);
// connectMqtt() içinde:
// mqtt.connect("YOUR_CLIENT_ID", "YOUR_USERNAME", "YOUR_PASSWORD");
Client ID'yi tam olarak verildiği şekilde kullanın, çünkü ConnectMQ client ID'leri kimlik bilgilerine bağlar. ESP32 MQTT eğitimimiz, ESP32'de sertifika yönetimini daha ayrıntılı açıklar.
Havalandırma Uyarıları
ConnectMQ portalında co2_ppm ve pm25 alanları için eşik uyarı kuralları tanımlayın. Yerel yönergelere ve odanın kullanımına göre uyarlamanız gereken önerilen başlangıç değerleri:
| Seviye | CO2 | PM2.5 | Önerilen eylem |
|---|---|---|---|
| İyi | 800 ppm altı | 12 altı | Yapılacak bir şey yok |
| Orta | 800 ile 1.200 ppm | 12 ile 35 | Havalandırmayı artırın, filtreyi kontrol edin |
| Kötü | 1.200 ppm üstü | 35 üstü | Pencereleri açın veya havalandırmayı güçlendirin, partikül kaynağını bulun |
Kurallar eşiği aşan her değerde tetiklenir ve uyarı günlüğü geçmişi saklar; böylece hangi odaların belirli saatlerde düzenli olarak havasız kaldığını görebilirsiniz. Bir fanı veya damperi otomatik olarak çalıştırmak için hava topic'ine bir Node-RED akışından veya Home Assistant otomasyonundan abone olun ve aktüatörü kendi MQTT komut topic'i üzerinden kontrol edin. Home Assistant MQTT entegrasyonu, birkaç satır YAML ile ölçerin sensör varlıkları olarak görünmesini sağlar.
Verileri Zaman İçinde Okumak
Tekil ölçümler, günlük örüntülerden daha az bilgi verir. Tipik bir toplantı odasında CO2 her toplantı boyunca istikrarlı biçimde yükselir ve oda boşaldığında geri düşer; ne kadar hızlı düştüğü, odanın ne kadar iyi havalandırıldığını gösterir. Herkes çıktıktan bir saat sonra hâlâ 1.000 ppm'in üzerinde olan bir odanın sorunu doluluk değil, havalandırmadır. PM2.5 ise iç ortamda genellikle düşük kalır ve yemek pişirme, yazdırma, temizlik ya da trafik yoğunluğu ve duman gibi dış olaylardan kaynaklanan kısa sıçramalar gösterir.
Bu geçmişi saklamak için her mesajı bir zaman serisi veritabanına yazan bir abone çalıştırın veya Telegraf'ın hava topic'lerine abone olmasını sağlayın. Odaları yan yana karşılaştırın ve ortalamaya değil, her günün en kötü saatine bakın; çünkü ortalamalar, insanların havayı gerçekten ağır hissettiği anları gizler. Tesis yönetimi ekibiyle basit bir haftalık grafik paylaşmak, çoğu zaman bir havalandırma programının değiştirilmesi için yeterlidir.
Birden fazla ölçer çalıştırıyorsanız her topic'i cihaza göre değil odaya göre adlandırın; böylece değiştirilen bir kart aynı yere yayın yapar ve geçmiş kesintisiz kalır.
Kalibrasyon ve Doğruluk İpuçları
- CO2 otomatik kalibrasyonu. SCD41'de varsayılan olarak otomatik öz kalibrasyon etkindir; bu özellik, sensörün düzenli olarak dış ortam seviyesinde temiz hava gördüğünü varsayar. Hiçbir zaman tam olarak havalandırılmayan odalarda bunu devre dışı bırakın ve bunun yerine dış ortamda zorunlu yeniden kalibrasyon yapın.
- Isınma süresi. Açılıştan sonraki ilk birkaç dakikanın ölçümlerini dikkate almayın.
- Kendi kendini ısıtma. ESP32'yi ve varsa voltaj regülatörünü SCD41'den uzak tutun; aksi halde sıcaklık ölçümü yüksek çıkar.
- Partikül sensörü ömrü. PMS5003'ün fanı ve lazeri zamanla aşınır. Uzun süreli kurulumlarda SET pinini kullanarak ölçümler arasında sensörü uyku moduna alın.
- Nem ve PM. Optik partikül sensörleri çok nemli havada, su damlacıkları ışığı saçtığı için olduğundan yüksek ölçer. Yaklaşık yüzde 80 bağıl nemin üzerindeki PM ölçümlerine temkinle yaklaşın.
Tüm Binaya Ölçeklendirme
Her toplantı odası veya açık ofis bölgesi başına bir ölçer iyi bir yoğunluktur. Her cihazın kendi kimlik bilgilerine ve bina hiyerarşisi altında bir topic'e ihtiyacı vardır, örneğin acme/ist01/hq/f03/meeting-301/air. Bir düzine ölçer ve bir panodan oluşan bir pilot uygulama, ücretsiz Serverless planının 25 bağlantısına sığar. Hava kalitesini ofis doluluk sensörleri ve HVAC izleme ile birleştirmek, havasızlığın çok fazla kişiden mi yoksa yetersiz havalandırmadan mı kaynaklandığını gösterir. Barındırılan bir MQTT broker, binada herhangi bir sunucu çalıştırma ihtiyacını ortadan kaldırır; IoT otomasyon rehberi ise aynı broker üzerinde kurabileceğiniz daha fazla projeyi listeler.
ConnectMQ ile Başlayın
app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun. Sketch'i kimlik bilgilerinizle yükleyin, canlı topic gezginini açın ve ilk CO2 uyarınızı kurun. TLS, kimlik doğrulama ve kesintisiz çalışma ile ConnectMQ ilgilenir.
Sık Sorulan Sorular
Hangi CO2 seviyesi bir odanın daha fazla havalandırmaya ihtiyacı olduğunu gösterir?
Birçok havalandırma yönergesi, yaklaşık 1.000 ppm'in üzerinde süregelen değerleri, odadaki kişi sayısına göre yetersiz temiz havanın işareti olarak kabul eder. Yerel yönergeleri esas alın ve tekil ölçümler yerine eğilimleri izleyin.
Bir VOC sensörü gerçek bir CO2 sensörünün yerini tutabilir mi?
Hayır. "Eşdeğer CO2" raporlayan sensörler bunu VOC'lerden tahmin eder ve gerçek değerden çok uzak olabilir. Gerçek CO2 için SCD41 gibi bir NDIR veya fotoakustik sensör kullanın.
İç ortam hava kalitesi ölçer ne sıklıkla yayın yapmalı?
30 ile 60 saniyede bir yeterlidir. Hava kalitesi dakikalar içinde değişir ve daha seyrek yayın yapmak enerji ile broker trafiğinden tasarruf sağlar.
PMS5003 5 V gerektirir mi?
Fanı 5 V beslemeye ihtiyaç duyar, ancak seri çıkışı 3,3 V lojik seviyesindedir; bu nedenle TX pini doğrudan bir ESP32 girişine bağlanabilir.



