Jak zbudować prosty analizator jakości powietrza (PM2.5) z gotowych modułów ESP32

Własny analizator PM2.5 nie zastąpi stacji pomiarowej GIOŚ, ale potrafi odpowiedzieć na pytania, na które mapa jakości powietrza nie odpowiada: czy dym z kominka sąsiada dociera do mieszkania, kiedy najlepiej przewietrzyć pokój i jak szybko oczyszczacz usuwa pył po otwarciu okna.

Do zbudowania użytecznego urządzenia nie potrzeba projektować płytki drukowanej ani lutować elementów SMD. Wystarczą gotowa płytka ESP32, laserowy czujnik pyłu, kilka przewodów i opcjonalny ekran OLED. Najrozsądniejsza konfiguracja dla pierwszego projektu opiera się na module Plantower PMS5003. Jest popularny, komunikuje się przez UART i podaje gotowe wartości PM1.0, PM2.5 oraz PM10. Jego słabszą stroną jest wentylator: słychać go w bardzo cichym pomieszczeniu, zbiera kurz i nie powinien pracować w szczelnie zamkniętym pudełku.

Realny koszt podstawowego zestawu wynosi około 140–190 zł, zależnie od sprzedawcy, przewodów i obudowy. Tańsze konstrukcje są możliwe, ale oszczędzanie na samym czujniku pyłu często kończy się losowymi wskazaniami, problemami z protokołem transmisji albo brakiem wiarygodnej dokumentacji.

Jak dobrać podzespoły i nie przepłacić za czujnik

Najpierw trzeba podjąć jedną decyzję: czy analizator ma być tanim urządzeniem domowym, czy stabilnym czujnikiem przeznaczonym do wieloletniego działania. W pierwszym przypadku wybór PMS5003 jest prosty. W drugim warto rozważyć Sensirion SPS30, ale koszt projektu wyraźnie wzrośnie.

Wariant rozsądny cenowo: Plantower PMS5003

PMS5003 jest optycznym czujnikiem cząstek. Wbudowany wentylator zasysa powietrze do komory, a układ laserowy ocenia ilość światła rozpraszanego przez znajdujące się w nim drobiny. Moduł raportuje między innymi stężenia masowe PM1.0, PM2.5 i PM10.

Najważniejsze parametry:

  • zasilanie: 4,5–5,5 V,
  • typowe napięcie zasilania: 5 V,
  • poziom logiczny komunikacji: 3,3 V,
  • interfejs: UART,
  • najmniejsza deklarowana wykrywana cząstka: 0,3 µm,
  • pomiar PM1.0, PM2.5 i PM10,
  • dane przesyłane w ramkach binarnych.

Producent przewiduje zasilanie modułu napięciem 5 V, natomiast linie transmisji pracują z logiką pasującą do ESP32. Nie należy zasilać PMS5003 z wyjścia 3,3 V płytki. Czujnik może wtedy uruchamiać się niestabilnie, zawieszać transmisję albo zwracać skoki wartości podczas startu wentylatora.

W polskich sklepach sam PMS5003 kosztuje najczęściej około 95–125 zł brutto. Przykładowa oferta specjalistycznego sklepu wynosiła 99,19 zł, natomiast aukcje z dodatkową marżą przekraczały 120 zł. Przed zakupem trzeba sprawdzić, czy w zestawie znajduje się przewód z pasującą, drobną wtyczką. Dokupienie go osobno bywa bardziej irytujące niż samo składanie urządzenia.

Wariant dokładniejszy i trwalszy: Sensirion SPS30

SPS30 mierzy PM1, PM2.5, PM4 oraz PM10. Obsługuje UART i I²C, ma deklarowaną dokładność stężenia masowego na poziomie ±10% oraz przewidywaną żywotność przekraczającą 10 lat. Wymiary modułu to 41 × 41 × 12 mm, a napięcie zasilania mieści się w zakresie 4,5–5,5 V.

Jest lepszym wyborem, gdy:

  • urządzenie ma działać bez przerwy przez kilka lat,
  • wyniki z kilku egzemplarzy mają być porównywalne,
  • projekt będzie podstawą automatycznego sterowania wentylacją,
  • budżet jest mniej istotny niż stabilność.

Problemem jest cena. Sam SPS30 kosztuje w Polsce i europejskiej dystrybucji zwykle około 130–210 zł brutto, zależnie od dostawcy. Do tego może być potrzebny przewód ze złączem JST. Zestaw ewaluacyjny jest jeszcze droższy i do prostego analizatora nie ma sensu go kupować.

Do pierwszej konstrukcji wybrałbym PMS5003. SPS30 ma przewagę techniczną, ale nie na tyle dużą, by uzasadnić podwojenie kosztu urządzenia przeznaczonego do kontroli powietrza w jednym mieszkaniu.

ESP32 i pozostałe części

Płytka ESP32 DevKit z modułem ESP-WROOM-32 kosztuje zazwyczaj 23–35 zł. Wystarczy wersja z 30 wyprowadzeniami, 4 MB pamięci Flash i konwerterem USB CP2102 albo CH340. ESP32 zapewnia Wi-Fi 2,4 GHz, Bluetooth i kilka interfejsów UART, dlatego może jednocześnie odczytywać czujnik oraz udostępniać wynik przez stronę WWW lub system automatyki domowej.

Koszyk części dla podstawowej wersji wygląda następująco:

  • ESP32 DevKit: 23–35 zł,
  • PMS5003 z przewodem: 95–125 zł,
  • OLED SSD1306 0,96 cala, 128 × 64 px: 10–20 zł,
  • przewody połączeniowe: 5–10 zł,
  • przewód USB i zasilacz 5 V: 15–30 zł, jeśli nie ma ich w domu,
  • obudowa: 10–40 zł.

Łącznie należy przygotować około 140–190 zł bez nowego zasilacza albo 160–220 zł z zasilaczem i gotową obudową. Ekran nie jest konieczny. Podczas pierwszych testów można odczytywać wyniki w monitorze portu szeregowego, a później wyświetlać je w przeglądarce.

Typowy ekran SSD1306 komunikuje się przez I²C i może być zasilany napięciem 3,3 V. Moduły kosztujące około 10–17 zł są wystarczające; droższy ekran nie poprawi jakości pomiaru pyłu.

Montaż analizatora: zasilanie, połączenia i obudowa

Najwięcej błędów powstaje nie w programie, lecz podczas podłączania zasilania. ESP32 używa logiki 3,3 V, natomiast PMS5003 wymaga zasilania 5 V. Wspólna masa obu urządzeń jest obowiązkowa.

W podstawowej wersji potrzebne są cztery połączenia między PMS5003 i ESP32:

PMS5003 ESP32 Funkcja
VCC VIN lub 5V Zasilanie czujnika
GND GND Wspólna masa
TX GPIO16, RX2 Dane z czujnika do ESP32
RX GPIO17, TX2 Polecenia z ESP32 do czujnika

Do samego odbierania pomiarów wystarczą VCC, GND i TX czujnika. Podłączenie linii RX jest jednak przydatne, jeśli oprogramowanie ma później przełączać czujnik między trybem aktywnym i uśpieniem.

Wtyczka PMS5003 ma więcej przewodów niż potrzeba. Nie wolno kierować się wyłącznie ich kolorem, ponieważ różni sprzedawcy stosują inne wiązki. Kolejność pinów trzeba sprawdzić w dokumentacji modułu albo w opisie konkretnego przewodu. Pomylenie VCC z linią danych może uszkodzić czujnik lub ESP32.

OLED SSD1306 można podłączyć tak:

OLED ESP32
VCC 3V3
GND GND
SDA GPIO21
SCL GPIO22

Adres I²C większości ekranów wynosi 0x3C, ale zdarzają się moduły z adresem 0x3D. Jeżeli ekran pozostaje czarny mimo prawidłowego zasilania, pierwszym krokiem powinno być uruchomienie prostego skanera I²C, a nie wymiana biblioteki.

Zasilanie

Cały zestaw może być zasilany z portu USB ESP32. Stabilny zasilacz 5 V o wydajności co najmniej 1 A zapewnia wystarczający zapas dla płytki, Wi-Fi, ekranu i wentylatora czujnika.

Nie polecam zasilania z przypadkowego, starego zasilacza USB, jeżeli ESP32 resetuje się podczas łączenia z Wi-Fi. Taki objaw często wygląda jak błąd programu, ale przyczyną jest spadek napięcia. Podobny problem powodują bardzo cienkie lub długie przewody USB.

Zasilanie bateryjne komplikuje projekt. Wentylator i laser czujnika pobierają energię przez cały czas pracy, więc mały akumulator 1000 mAh nie zapewni wielodniowego monitoringu. Tryb okresowy jest możliwy, ale po wybudzeniu należy pozwolić czujnikowi ustabilizować przepływ powietrza. W dokumentacji Sensirion dla SPS30 zalecono co najmniej 30 sekund pracy przed wykorzystaniem wyniku przy pracy cyklicznej. W praktyce podobnej zasady warto trzymać się również w konstrukcji z PMS5003.

Obudowa, która nie fałszuje pomiaru

Najgorsza obudowa to szczelne pudełko z jednym małym otworem. Wentylator czujnika musi swobodnie pobierać i wyrzucać powietrze. Jeżeli wylot kieruje strumień z powrotem w stronę wlotu, czujnik zaczyna mierzyć częściowo to samo powietrze.

Obudowa powinna spełniać cztery warunki:

  • wlot i wylot PMS5003 pozostają odsłonięte,
  • między wlotem i wylotem znajduje się fizyczny odstęp,
  • ESP32 nie blokuje kanału powietrznego,
  • urządzenie można otworzyć i oczyścić bez odrywania przewodów.

Nie należy montować analizatora:

  • bezpośrednio nad grzejnikiem,
  • przy kuchence lub okapie,
  • w strumieniu oczyszczacza powietrza,
  • na parapecie nagrzewanym słońcem,
  • w łazience i innych miejscach o dużej wilgotności,
  • tuż przy uchylonym oknie, jeśli celem jest ocena całego pomieszczenia.

Do pomiaru warunków w pokoju urządzenie powinno stać mniej więcej 1–1,5 m nad podłogą, z dala od ścian i silnych źródeł przepływu. Nie chodzi o laboratoryjną geometrię, lecz o powtarzalność. Przenoszenie czujnika codziennie z biurka na parapet sprawia, że porównywanie wykresów traci sens.

Kuchnia ujawnia ograniczenia czujników optycznych szczególnie szybko. Smażenie, para z czajnika, aerozol z dezodorantu i dym ze świecy potrafią spowodować gwałtowny wzrost wskazań. Czujnik widzi cząstki rozpraszające światło, ale nie rozpoznaje ich składu chemicznego. Wysoki wynik po smażeniu nie mówi, czy w powietrzu znajduje się sadza, tłuszcz czy inny aerozol.

Programowanie, test pomiarów i interpretacja wyników

Najprościej zaprogramować ESP32 w środowisku Arduino IDE. W menedżerze płytek trzeba zainstalować pakiet ESP32 firmy Espressif, wybrać model odpowiadający posiadanej płytce oraz właściwy port USB.

PMS5003 wysyła dane przez UART. ESP32 ma kilka sprzętowych kontrolerów UART, dlatego czujnik można podłączyć do Serial2, pozostawiając podstawowy port Serial do programowania i diagnostyki.

Poniższy program odczytuje ramkę PMS5003 bez instalowania dodatkowej biblioteki. Sprawdza nagłówek, długość danych i sumę kontrolną, a następnie wypisuje wartości PM1.0, PM2.5 i PM10.

#include <Arduino.h>

HardwareSerial pmSerial(2);

constexpr int PM_RX_PIN = 16;
constexpr int PM_TX_PIN = 17;
constexpr size_t FRAME_SIZE = 32;

uint16_t readUInt16BE(const uint8_t *data, size_t index) {
  return (static_cast<uint16_t>(data[index]) << 8) | data[index + 1];
}

bool readPMS5003(uint16_t &pm1, uint16_t &pm25, uint16_t &pm10) {
  uint8_t frame[FRAME_SIZE];

  while (pmSerial.available() >= 2) {
    if (pmSerial.peek() != 0x42) {
      pmSerial.read();
      continue;
    }

    frame[0] = pmSerial.read();

    if (pmSerial.read() != 0x4D) {
      continue;
    }
    frame[1] = 0x4D;

    unsigned long start = millis();
    while (pmSerial.available() < FRAME_SIZE - 2) {
      if (millis() - start > 200) {
        return false;
      }
      delay(1);
    }

    for (size_t i = 2; i < FRAME_SIZE; i++) {
      frame[i] = pmSerial.read();
    }

    const uint16_t dataLength = readUInt16BE(frame, 2);
    if (dataLength != 28) {
      return false;
    }

    uint16_t checksum = 0;
    for (size_t i = 0; i < 30; i++) {
      checksum += frame[i];
    }

    const uint16_t receivedChecksum = readUInt16BE(frame, 30);
    if (checksum != receivedChecksum) {
      return false;
    }

    // Wartości atmosferyczne, a nie fabryczne CF=1
    pm1 = readUInt16BE(frame, 10);
    pm25 = readUInt16BE(frame, 12);
    pm10 = readUInt16BE(frame, 14);

    return true;
  }

  return false;
}

void setup() {
  Serial.begin(115200);
  pmSerial.begin(9600, SERIAL_8N1, PM_RX_PIN, PM_TX_PIN);

  Serial.println("Start miernika PMS5003");
  Serial.println("Stabilizacja czujnika...");
  delay(30000);
}

void loop() {
  uint16_t pm1;
  uint16_t pm25;
  uint16_t pm10;

  if (readPMS5003(pm1, pm25, pm10)) {
    Serial.printf(
      "PM1.0: %u ug/m3 | PM2.5: %u ug/m3 | PM10: %u ug/m3\n",
      pm1,
      pm25,
      pm10
    );
  }

  delay(1000);
}

Pierwsze 30 sekund po uruchomieniu nie powinno być zapisywane jako właściwy pomiar. Wentylator musi osiągnąć stabilną pracę, a w komorze powinno znaleźć się powietrze z otoczenia, nie to pozostawione wewnątrz czujnika.

Jak sprawdzić, czy urządzenie działa prawidłowo

Test powinien przebiegać w ustalonej kolejności.

1. Sprawdzenie wartości bazowej

Pozostaw urządzenie w jednym miejscu przez co najmniej 20–30 minut. Wynik nie powinien zmieniać się co sekundę o dziesiątki mikrogramów bez wyraźnej przyczyny. Niewielkie wahania są normalne.

2. Kontrolowany wzrost

Zapal świecę w odległości kilku metrów, a następnie ją zgaś. Nie kieruj dymu bezpośrednio do wlotu. PM2.5 powinno wyraźnie wzrosnąć, a po przewietrzeniu stopniowo spaść. Bezpośrednie dmuchnięcie dymem do czujnika niczego nie testuje — jedynie przeciąża komorę bardzo dużą liczbą cząstek.

3. Porównanie z drugim urządzeniem

Jeżeli dostępny jest oczyszczacz z własnym czujnikiem albo drugi miernik, ustaw urządzenia obok siebie na kilka godzin. Nie należy oczekiwać identycznych wskazań. Różnica kilku mikrogramów na metr sześcienny jest zwykle mniej istotna niż zgodność trendu: oba czujniki powinny reagować w podobnym momencie na gotowanie, otwarcie okna czy uruchomienie oczyszczacza.

4. Test sumy kontrolnej

Jeżeli program często zgłasza błędne ramki, trzeba sprawdzić przewody, wspólną masę i zasilanie. Ignorowanie sumy kontrolnej jest złym skrótem. Pojedynczy zakłócony bajt może zmienić wynik z 15 na kilkaset µg/m³ i uruchomić fałszywy alarm.

Jak interpretować PM2.5

PM2.5 oznacza frakcję drobnych cząstek o średnicy aerodynamicznej nieprzekraczającej 2,5 µm. Wynik podawany jest w µg/m³, czyli mikrogramach pyłu w metrze sześciennym powietrza.

Wytyczne WHO wskazują dla PM2.5 wartość 5 µg/m³ jako średnią roczną oraz 15 µg/m³ jako średnią 24-godzinną. Nie są to progi alarmu dla pojedynczego, sekundowego odczytu. Porównanie chwilowego wyniku z normą roczną prowadzi do błędnych wniosków.

Do sterowania domowym sygnalizatorem można przyjąć prostą skalę roboczą:

  • 0–10 µg/m³ – bardzo dobre warunki wewnętrzne,
  • 11–20 µg/m³ – podwyższone, ale bez potrzeby gwałtownego działania,
  • 21–35 µg/m³ – sprawdź źródło i warunki na zewnątrz,
  • 36–55 µg/m³ – ogranicz napływ powietrza z zewnątrz lub uruchom oczyszczacz,
  • powyżej 55 µg/m³ – wysokie stężenie; szukaj konkretnego źródła pyłu,
  • powyżej 100 µg/m³ – bardzo zły wynik, o ile utrzymuje się przez kilka minut i nie jest efektem pary lub aerozolu.

To skala użytkowa, a nie urzędowa klasyfikacja. Alarm powinien reagować na średnią z kilku minut, nie na jeden odczyt. Dobrym ustawieniem jest średnia krocząca z 5 minut oraz warunek, że próg został przekroczony przez co najmniej 2–3 minuty.

W Polsce średnioroczny poziom dopuszczalny PM2.5 stosowany w ocenach jakości powietrza wynosi obecnie 20 µg/m³. Nowa dyrektywa UE 2024/2881 zaostrza standardy jakości powietrza, w tym limit PM2.5 przewidziany do osiągnięcia do 2030 roku. Domowy czujnik nie jest jednak urządzeniem referencyjnym i nie służy do stwierdzania prawnego przekroczenia normy.

Kalibracja: czego nie obiecywać

PMS5003 nie da się wiarygodnie skalibrować za pomocą oczyszczacza, aplikacji pogodowej ani stacji GIOŚ oddalonej o kilka kilometrów. Stężenie pyłu zmienia się lokalnie, a stacja zewnętrzna mierzy inne powietrze niż czujnik stojący w pokoju.

Sensowna korekta wymaga:

  1. ustawienia badanego urządzenia obok sprawdzonego miernika,
  2. prowadzenia równoległych pomiarów przez kilka dni,
  3. zebrania danych przy niskich, średnich i wysokich stężeniach,
  4. oceny wpływu wilgotności,
  5. wyznaczenia korekty na podstawie większej liczby punktów, a nie jednego odczytu.

W warunkach domowych większy pożytek przynosi kontrola powtarzalności niż agresywna kalibracja programowa. Jeżeli czujnik zawsze szybko wykrywa napływ smogu i pokazuje podobne wartości w tych samych warunkach, spełnia swoje zadanie. Dopasowywanie wyniku „na oko” do aplikacji zwykle tylko ukrywa rzeczywiste błędy.

Najbardziej irytującym ograniczeniem tanich czujników optycznych jest reakcja na wilgoć i aerozole. Przy wysokiej wilgotności drobiny higroskopijne zwiększają rozmiar, a wynik może wzrosnąć bez proporcjonalnego wzrostu suchej masy pyłu. Dodanie czujnika temperatury i wilgotności, na przykład BME280 lub SHT31, pomaga rozpoznać takie sytuacje, ale samo w sobie nie zapewnia automatycznej, uniwersalnej korekty.

FAQ: najczęstsze pytania o analizator PM2.5 na ESP32

Czy PMS5003 mierzy również CO₂?
Nie. PMS5003 mierzy cząstki PM1.0, PM2.5 i PM10. Do pomiaru CO₂ potrzebny jest osobny czujnik NDIR, na przykład Sensirion SCD40, SCD41 albo Sensair S8.

Czy analizator może pracować bez ekranu?
Tak. Wyniki można wysyłać przez Wi-Fi do Home Assistanta, MQTT, InfluxDB albo prostej strony WWW działającej bezpośrednio na ESP32.

Czy ESP32 może zasilać PMS5003 z pinu 3V3?
Nie. PMS5003 wymaga zasilania około 5 V. Należy użyć pinu VIN/5V i połączyć masę czujnika z masą ESP32.

Czy potrzebny jest konwerter poziomów logicznych?
Przy standardowym PMS5003 i ESP32 zazwyczaj nie. Linie UART czujnika pracują z logiką 3,3 V. Konwerter jest potrzebny dopiero wtedy, gdy dokumentacja konkretnego modułu wskazuje poziom 5 V na wyjściu danych.

Dlaczego czujnik pokazuje wysokie PM2.5 po gotowaniu?
Smażenie, przypalony tłuszcz, para z domieszką aerozolu i korzystanie z tostera produkują cząstki wykrywane optycznie. Wynik może wzrosnąć nawet przy zamkniętych oknach i dobrym powietrzu na zewnątrz.

Czy można wystawić urządzenie na balkon?
Tylko w obudowie chroniącej przed deszczem, kondensacją i bezpośrednim słońcem, ale zachowującej swobodny przepływ powietrza. Zwykła obudowa drukowana z PLA bez osłony nie wystarczy do całorocznej pracy na zewnątrz.

Jak często zapisywać pomiary?
Odczyt co sekundę jest przydatny diagnostycznie, ale do historii wystarczy zapis średniej co 30–60 sekund. Dzięki temu wykres pozostaje czytelny, a baza danych nie rośnie bez potrzeby.

Czy wyłączać wentylator między pomiarami?
Przy zasilaniu sieciowym nie ma takiej potrzeby. W projekcie bateryjnym można stosować cykle pracy, ale przed zapisaniem wyniku trzeba odczekać co najmniej około 30 sekund od uruchomienia przepływu.

Czy wynik można porównywać bezpośrednio z mapą GIOŚ?
Nie jako pomiar równoważny. Stacja GIOŚ działa w innej lokalizacji, na zewnątrz i z użyciem urządzeń objętych procedurami kontroli jakości. Domowy miernik służy przede wszystkim do oceny lokalnych zmian i trendów.

Od czego zacząć budowę?
Najpierw kup PMS5003 z przewodem i ESP32 DevKit. Podłącz wyłącznie zasilanie, masę oraz linię TX czujnika do GPIO16, uruchom przedstawiony program i sprawdź stabilną transmisję. Ekran, Wi-Fi, obudowę i zapis danych dodawaj dopiero wtedy, gdy podstawowy odczyt działa przez kilka godzin bez błędów sumy kontrolnej.

Written by

HouseHub

58 Posts

Staram się dostarczać informacje o nowościach oraz recenzje dotyczące smart urządzeń do nowoczesnego domu.
View all posts

Leave a reply

Your email address will not be published. Required fields are marked *