IoT Otomasyon

CO2 ve PM2.5 Sensörleri ve MQTT ile İç Ortam Hava Kalitesi Ölçer Yapın

Bir SCD41 CO2 sensörünü ve bir PMS5003 partikül sensörünü ESP32'ye bağlayın, ölçümleri MQTT üzerinden JSON olarak yayınlayın ve hava ağırlaştığında ya da tozlandığında havalandırma uyarıları kurun.

ESP32 kartı üzerinde CO2 ve PM2.5 sensörleri bulunan ve verileri Wi-Fi ile gönderen küçük iç ortam 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

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ı

  1. 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.
  2. Isınma süresi. Açılıştan sonraki ilk birkaç dakikanın ölçümlerini dikkate almayın.
  3. 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.
  4. 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.
  5. 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.

İlgili yazılar

Zigbee2MQTT Kurulum Rehberi: Koordinatörden Panoya

Zigbee2MQTT'yi Docker ile kurun, koordinatörü ve MQTT bağlantısını yapılandırın, cihazları eşleştirip yeniden adlandırın, onları MQTT üzerinden kontrol edin ve durumlarını bir panoda görüntüleyin; önce ücretsiz herkese açık bir broker'da test edin.

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