piątek, 1 grudnia 2017

SDS011 Czujnik zanieczyszczeń powietrza

Czujnik SDS011 umożliwia pomiar zawartości pyłów zawieszonych PM2.5 i PM10 w powietrzu. Wybrałem z go racji na przyzwoity stosunek dokładności do ceny. Dokładność jest wprawdzie gorsza dla małych wartości zanieczyszczeń, ale rekompensuje to jego cena. Za swój czujnik zapłaciłem 64zł na AliExpress (w kraju jest ok. 3 razy droższy!!!). Czujnik może znaleźć zastosowanie w miernikach zanieczyszczeń, jak  i w układach sterowania w oczyszczaczach powietrza.

SDS011 w zestawie z konwerterem i kabelkiem
Specyfikacja
  • pomiar PM2.5 i PM10
  • zakres pomiarowy 0.0 - 999.9 µg/m3
  • maksymalny prąd pracy 220mA
  • napięcie zasilania 5V
  • prąd uśpienia 2mA
  • temperatura pracy od -10° do 50°C
  • wilgotność pracy maksymalnie 70%RH
  • ciśnienie robocze powietrza: 86kPa - 110kPa
  • czas odpowiedzi 1s
  • czas odpowiedzi na zmiany zanieczyszczeń do 10s
  • błąd pomiaru maksymalnie ±15% i ±10µg/m3 (przy 25°C i 50%RH)
  • komunikacja UART, PWM (na poziomie 3,3V)
  • wbudowany wentylator (zasysający powietrze)
  • minimalna rozdzielczość cząsteczek 0.3µg/m3
  • czas życia diody laserowej do 8000 godzin (czyli z grubsza 11 miesięcy pracy ciągłej)
  • rozmiary: 71x70x23mm

W przypadku potrzeby posiadania aktualnych danych o zanieczyszczeniach (czujnik pracuje jako detektor) można użyć domyślnej konfiguracji, przy której częstotliwość pomiarów wynosi raz na sekundę. Przy innych zastosowaniach, można ograniczyć częstotliwość dokonywania pomiarów i tym samym przedłużyć żywot czujnika.

Druga rzecz, to zadbanie o warunki pracy czujnika podane w specyfikacji. Do tego przydałyby się dodatkowe czujniki temperatury i wilgotności. Praca poza warunkami pracy "przekreśla" wyniki pomiarów. Z informacji użytkowników czujnika znalezionych w sieci, wynika, że przy przekroczonej wilgotności roboczej, czujnik zaczyna zawyżać wyniki pomiarów. Ograniczenie pracy do 70%RH stawia pod znakiem zapytania działanie urządzenia na zewnątrz, gdyż przy deszczu czy mgle nie będzie ono prawidłowo dokonywać pomiarów. W sieci pojawiają się wprawdzie wzmianki o osuszaniu/podgrzewaniu powietrza docierającego do czujnika, ale trudno powiedzieć na ile jest to skuteczne rozwiązanie.

Podłączenie

Pin Opis
1 (NC) nieużywany
2 (1um) wyjście PWM dla PM2.5
3 (5V) zasilanie 5V
4 (25um) wyjście PWM dla PM10
5 (GND) masa GND
6 (RXD) RX UART (3,3V)
7 (TXD) TX UART (3,3V)


Uruchomienie

Aplikacja producenta
W zestawie z czujnikiem dostajemy konwerter USB oraz przewody do podłączenia czujnika z konwerterem. Dzięki temu można czujnik podłączyć bezpośrednio do komputera i tam odczytać wyniki pomiarów za pomocą programu dostarczanego przez producenta. Program można pobrać ze strony produktu. Obsługuje on różne czujniki (i mierniki) tego producenta. W paczce (rar) z programem znajdują się także sterowniki konwertera, specyfikacja czujnika, a nawet przykładowe dane pomiarowe. Zamieszczona jest także pomoc do aplikacji, niestety w języku chińskim i tu pozostaje jedynie ratowanie się, na przykład translatorem Google.

Aplikacja producenta do odczytu danych z czujnika
Niestety nie udało mi się z aplikacji skorzystać. Problemem jest niedziałające wyszukiwanie portów COM (w szczególności tego do którego był podpięty czujnik), co widać na screenie. Program uruchamiałem na komputerach z Windows 7 i Windows 8. Próbowałem w trybie admina, w trybach zgodności, jednak nic to nie dało. Trochę szkoda, że aplikacja nie zadziałała, bo wygląda na przydatną i umożliwiała graficzną prezentację zmian w czasie wartości zanieczyszczeń jak i eksport danych do MS Excela. Odrębny problem to kwestia instalacji sterowników do konwertera (PL-2303) - te z paczki oczywiście nie działały, trzeba było szukać po sieci, ale przynajmniej z sukcesem.

Prezentacja danych (przykładowe dane producenta)
W sieci znalazłem podobny problem braku portów COM z tą samą wersją 1.88 apki. Tam jednak problem był z Windows 10 i włączenie kompatybilności z Windows 8 pomogło, tj. port COM się pokazał.

Smog Cop

Aplikacja Smog Cop, dostępna na Android, umożliwia odczyt danych z czujnika na ekranie telefonu. Czujnik można podłączyć zdalnie przez bluetooth lub bezpośrednio z telefonem kablem OTG. Ja wybrałem to drugie rozwiązanie, jako szybsze. Docelowo wygodniejsze jest połączenie bezprzewodowe. Okazało się, że z wyjścia mikro USB w moim telefonie bez problemu można było zasilić czujnik i odczytać wyniki pomiarów.


Uruchomienie czujnika na komórce
Dwa ekrany z wynikami pomiarów
Aktualizacja (23-09-2019) W jednym z komentarzy pojawiła się uwaga, że apki w Google Play już nie ma. Nie mniej jednak wpisując w wyszukiwarce Google hasło "Smog Cop download" bez problemu można pobrać instalkę (*.apk). Głowy jednak nie dam, że to ta sama aplikacja co na moich screenach powyżej.


Arduino
Przykładowy kod pod Arduino SDS011_Simple_SoftwareSerial dołączony jest do biblioteki SDS011 z której skorzystałem.  Do wyboru tej konkretnej biblioteki skłonił mnie drugi, bardziej zaawansowany przykład SDS011_Extended_SoftwareSerial. Prezentuje on bardziej praktyczne użycie czujnika i dodaje takie elementy, jak to m.in. okresowy pomiar, uśrednianie pomiarów, uwzględnianie czasu rozruchu czujnika, usypianie/wybudzanie czujnika itp. To istotne udogodnienia, jeśli nie chcemy katować czujnika i ma on dłużej nam posłużyć.

Uruchomienie pod Arduino Mini Pro
W celu uruchomienia czujnika, wykorzystałem tym razem Arduino Mini Pro. Zasilanie 5V dla Arduino i czujnika zostało wzięte z konwertera USB opisanego w temacie Programowanie Arduino Mini Pro z użyciem konwertera USB-UART.

Schemat blokowy połączeń
Uproszczony kod z przykładu:

#include "SDS011.h"
#include <SoftwareSerial.h>

// pins for SoftwareSerial
#define SDS_PIN_RX 5
#define SDS_PIN_TX 6

// Setup SoftwareSerial and Sensor
SoftwareSerial serialSDS(SDS_PIN_RX, SDS_PIN_TX);
SDS011 sds011(serialSDS);

void setup() {
    Serial.begin(9600);

    // default rate for sensor
    serialSDS.begin(9600);
}

void loop() {
    float pm25, pm10;

    // read sensor, print readings, ignore errors
    if (sds011.getData(&pm25, &pm10) == SDS011_STATUS_OK) {
        Serial.print("PM2.5: "); Serial.println(pm25, 1);
        Serial.print("PM10:  "); Serial.println(pm10, 1);
    }

    delay(3000);
}

Jak widać wyniki wyszły bardzo duże, żeby nie powiedzieć zatrważająco duże ;) Tym bardziej, że nosem niczego nie czułem. Tak więc zacząłem się zastanawiać, czy np. wyników jeszcze nie trzeba podzielić przez 10. Szczęśliwie, posiadam w domu oczyszczacz powietrza i po jego uruchomieniu w pobliżu czujnika, już po kilku minutach wartości PM spadły z grubsza o połowę.


Wyniki pomiaru na terminalu

Wyniki po kilku minutach pracy oczyszczacza powietrza

Opisywany czujnik użyłem w domowej stacji pogody. Skorzystałem tam z drugiego, bardziej zaawansowanego przykładu zamieszczonego w użytej bibliotece obsługującej SDS011 (4). Wprowadza on takie funkcjonalności, jak okresowe uruchamianie czujnika, kilkusekundowy rozruch wiatraczka, wykonanie kilku - kilkunastu pomiarów, obliczenie średniej z pomiarów i uśpienie czujnika. Uśrednione dane z czujnika prezentowane są na wyświetlaczu LCD i dodatkowo rejestrowane w pliku na karcie pamięci.

Aktualizacja (23-10-2019). W jednym z komentarzy pojawiała się słuszna uwaga, że zgodnie z dokumentacją napięcia na szynie RS powinno wynosić maksymalnie 3,3V . Co oznacza konieczność użycia albo konwertera poziomów, albo użycia Arduino pracującego na 3,3V.  Oryginału układu ze zdjęcia niestety już nie mam, ale patrząc na opis na 99% było to Arduino zasilane 5V. W moim przypadku nic się nie spaliło i czujnik działał poprawnie. Co więcej na google można znaleźć więcej takich przypadków, np thingiverse.com/thing:3356806. Biorąc jednak pod uwagę względnie wysoką cenę czujnika oraz niewielką - konwertera, lepiej go zastosować. Przy tej okazji, spojrzałem jeszcze raz na specyfikację z załącznika opatrzoną wersją 1.2. W tabeli Interface Specification przy tych pinach nie ma mowy o napięciu 3,3V. Natomiast w wersji 1.3 specyfikacji  już jest ;)

Źródła
1) Strona produktu SDS011 producenta
2) Specyfikacja producenta (v1.2)
3) Komendy sterujące
4) Biblioteka SDS011 (hafu/SDS011)
5) Specyfikacja producenta (v1.3)



8 komentarzy:

  1. Dziękuję. Rzetelny i bardzo przydatny post.

    OdpowiedzUsuń
  2. Nie wiem jakiej wersji Arduino Pro Mini użyłeś, ale czujnik wymaga napięcia 3.3V na porcie RS, dlatego trzeba dopisać, że przy układach Arduino mających stany 5V na RX i TX wymagany jest konwerter stanów logicznych.

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki, jest tak jak piszesz. Używałem wersji na 5V patrząc na zdjęcie (oryginału układu nie mam) oraz biorąc pod uwagę fakt, że nie piszę nic o 3,3V na RX/TX. Wniosek tak, że miałem szczęście i bez konwertera układ też pracuje. Patrząc na układy z sieci (np https://www.instructables.com/id/Make-one-PM25-monitor-with-Arduino-UNO) to jest więcej takich przypadków.

      Usuń
  3. Jak pobrać program dla Windowsa ze strony producenta.

    na androida juz nie aktulne ?

    OdpowiedzUsuń
    Odpowiedzi
    1. Wpisz w google hasło "Smog Cop download" i bez problemu da się znaleźć instalkę apk. Nie sprawdzałem, jednak czy działa i czy to na pewno ta sama apka.

      Usuń
  4. Jakby ktoś szukał, to na Windows polecam DustViewer (https://github.com/Galch/DustViewerSharp)

    OdpowiedzUsuń
  5. Kod ma błędy i zwyczajnie nie działa.
    // Setup SoftwareSerial and Sensor
    SoftwareSerial serialSDS(SDS_PIN_RX, SDS_PIN_TX);
    SDS011 sds011(serialSDS);

    OdpowiedzUsuń
  6. Przepraszam, działa po zmianie na inna biblioteke

    OdpowiedzUsuń