Cel i motywacja Wreszcie udało mi się uruchomić stację pomiaru zanieczyszczenia powietrza i warunków meteorologicznych więc postanowiłem podzielić się z Wami tym pomysłem.
Na początku co mnie zmotywowało:
Po pierwsze mieszkam w okolicy (15 km) Krakowa, mieście o najbardziej zanieczyszczonym powietrzu w Polsce (a ponoć nawet w europie), po drugie mam czterech sąsiadów ogrzewających swoje domy węglem (żeby tylko). Dlatego od początku poszukiwałem metody pomiaru stanu powietrza i sterowania rekuperatorem w zależności od stopnia zanieczyszczenia.
Chodzi o to, że jak sąsiad akurat dorzuci do pieca to rekuperator się sam wyłącza dopóki poziom zapylenia nie spadnie poniżej ustalonego poziomu. Oczywiście rekuperator ma swoje filtry (na wejściu F7) ale zapychają się szybko (w sezonie grzewczym muszę wymieniać min. raz na miesiąc) po drugie ich skuteczność też nie jest 100%.
Oprócz monitorowania stanu zanieczyszczenia powietrza od razu chciałem system rozszerzyć o pomiar podstawowych parametrów meteo; obecnie dodatkowo mierzę temperaturę, wilgotność i ciśnienie. Natomiast w przyszłości mam zamiar rozbudować stację o pomiar prędkości i kierunku wiatru, opadów itp.
Dobór urządzeń i konstrukcjaRozwiązanie oparłem na czujniku pyłu DSM501A nabytym na eBayu za 9.5 $, do tego czujnik temperatury i wilgotności DHT22 za 24 zł oraz czujnik ciśnienia BMP180 za 13 zł.
Układ sterujący zbudowałem w oparciu o mikrokontroler (μC) Arduino Uno (a dokładnie jego tańszy klon Funduino) za 41 zł do tego moduł ethernet za 37 zł i zasilacz 9V/2A za 30 zł. Po złożeniu kontrolera odkryłem, że wybór modelu Uno był błędem ponieważ łącząc go z modułem ethernet tracimy aż 5 wejść teraz wiem, że trzeba było wybrać model Leonardo, który nie ma tej wady. Do Arduino również podłączyłem sieć czujników 1-Wire mierzących temperaturę wewnątrz pomieszczeń.
μC umieściłem w uniwersalnej obudowie na szynę DIN i zamontowałem w szafie obok sterownika PLC, natomiast czujniki znalazły miejsce w obudowie zbudowanej z sześciu białych miseczek melaminowych (nie wiem czy to cecha melaminy czy akurat tych miseczek ale okazały się bardzo kruche także cudem udało mi się powiercić wymagane otwory bez całkowitego ich zniszczenia) skręconych na trzech prętach gwintowanych tworząc coś na kształt tzw. osłony radiacyjnej, którą zamontowałem bezpośrednio przy czerpni rekuperatora.
Obudowa składa się z dwóch oddzielnych komór; dolnej w której znajduje się czujnik DHT22 oraz większej górnej gdzie umieściłem czujniki DSM501A, BMP180 oraz pozostałą elektronikę (dlaczego tak - wyjaśnię poniżej). Do obudowy czujników doprowadziłem skrętkę UTP kat 5e (ok 10 m).
ProblemyAby nie wchodzić zbytnio w szczegóły poniżej opiszę główne problemy z którymi musiałem się zmierzyć:
- Stabilizacja napięcia.
Czujnik DSM501A zwraca sygnał w postaci PWM, okazało się że zasilając wszystkie czujniki z wyjścia μC dostawałem bardzo silne zakłócenia sygnału. W końcu zdecydowałem się na umieszczenie w obudowie czujników modułu zasilania AMS1117 (9 zł), który z linii 9V doprowadzonej do obudowy podaje stabilizowane napięcie 5V do czujników. Wewnętrzne czujniki 1-Wire pozostawiłem zasilane z wyjścia 5V Arduino. - Ogrzewanie czujnika.
Czujnik DSM501A ma dość wąskie parametry otoczenia, w których może pracować w szczególności temperatura nie powinna być niższa niż -10 ºC a wilgotność większa niż 95 %. Oczywiście zależało mi aby czujnik pracował również przy niższych temperaturach (im zimniej tym więcej dymu z kominów) dlatego zlutowałem z 6 rezystorów 75 Ω prostą grzałkę „drabinkową”, którą otoczyłem czujnik (teraz widzę, że grzałka mogłaby być trochę mocniejsza).
Grzałka załączana jest przez przekaźnik (6.4 zł) umieszczony w obudowie razem z czujnikami i podłączony do linii zasilającej 9V (sam przekaźnik musi być również zasilany napięciem 5V więc jest również podłączony do modułu AMS1117). Przekaźnik jest załączany przez μC na podstawie odczytów z czujnika DHT22.
Teraz jest jasne dlaczego obudowa czujników musi mieć dwie komory, dzięki temu włączona grzałka nie będzie zakłócać odczytów z DHT22. Tak się składa, że umieszczony w górnej komorze czujnik ciśnienia BMP180 posiada również wbudowany sensor temperatury dzięki temu mogę na bieżąco odczytać skuteczność grzania grzałki. - Wzmacniacz sygnału I2C.
Czujnik BMP180 komunikuje się za pomocą magistrali I2C, niestety okazało się, że taka komunikacja sprawnie działa jedynie na kablu maks kilkadziesiąt centymetrów. Żeby móc podłączyć czujnik na 10 m skrętce konieczne okazało się zlutowanie układu wzmacniającego. Do tego były potrzebne dwa układy P82B715PN (na eBay łącznie z przesyłką 9 $) oraz 4 rezystory 4.7 kΩ i 4 rezystory 470 Ω.
Wzmacniacz składa się z dwóch identycznych modułów każdy umieszczony na jednym końcu kabla sygnałowego. Rezystory pull-up 4.7 kΩ lutujemy na obu liniach sygnałowych od strony urządzenia odbiorczego/nadawczego a rezystory 470 Ω od strony długiej skrętki (w dokumentacji P82B715PN są odpowiednie schematy). - Problem ze switchem ethernet.
Po podłączenie Arduino z modułem ethernetowym do mojego switcha DLink (jakiś tani 5 portowy model), który tymczasowo miałem w szafie okazało się, że komunikacja ma straty na poziomie 50 % pakietów.
Długo nie mogłem znaleźć przyczyny problemów, w końcu kupiłem nowy switch TP-Link 8 portów i problem znikł. Dlaczego Arduino nie dogaduje się z DLinkiem nie mam pojęcia, tym bardziej, że ten DLink działa poprawnie ze wszystkimi innymi moimi urządzeniami. - 85 ºC na czujnikach 1-Wire.
Na biurku wszystko działało jak należy (również na długim kablu), natomiast jak to zwykle bywa bo wlutowaniu czujników na swoje miejsce i podłączeniu μC zamiast temperatury w moich pomieszczeniach dostają wartość 85. Zmniejszenie rezystora pull-up do 1 kΩ nieco pomogło ale nie rozwiązało problemu do końca (co jakiś czas nadal dostaję takie odczyty). - Zwis μC po zaniku zasilania.
Po zaniku zasilania z niejasnych przyczyn moje Arduino nie chce wystartować, jakby się zawiesza przy starcie. Softwarowy watchdog problemu nie rozwiązuje, jedynie pomaga twardy reset lub wyjęcie i włożenie wtyczki zasilania (przy włączonym zasilaczu). Podejrzewam niską jakość mojego zasilacza, który w momencie startu podaje niewłaściwe napięcie powodując zwis μC.
Problem na razie pozostaje nierozwiązany.
Przetwarzanie danychJak już wspomniałem dane z czujników zbiera μC Arduino Uno, który serwuje prostą stronę HTML z aktualnymi odczytami. Również z tego miejsca dane pobiera i parsuje sterownik PLC (z wykorzystaniem biblioteki WagoLibHttp_02.lib) .
Oprócz tego μC po każdej aktualizacji odczytów wysyła nowe wartości na serwer (metodą POST PHP) gdzie są zapisywane do bazy danych typu RRD. Na serwerze znajduje się również strona HTML (na razie jeszcze w budowie), która na podstawie danych z bazy RRD tworzy ładne wykresy, statystyki i co tam nam do głowy przyjdzie.
Tutaj pojawił się mały problem, żadna z firm hostingowych (sprawdziłem chyba z 10) nie udostępnia na swoich hostingach PHP z modułem RRD. Więc pozostaje VPS (poniżej 10 zł/m nie znalazłem a to i tak trochę zbyt dużo) lub hostowanie serwisu u siebie przy czym, póki co pozostałem.
Sterowanie rekuperatoremMając już aktualne dane w sterowniku PLC można na ich podstawie sterować rekuperatorem. Niestety w czasie kiedy wybierałem rekuperator do swojego domu moja wizja automatyki domowej dopiero raczkowała więc nie zwróciłem uwagi na możliwość skomunikowania automatyki rekuperatora ze sterownikiem. Skutkiem tego mam rekuperator, który nie posiada żadnego interfacu do komunikacji a wymiana modułu automatyki na wersję z interfacem MODBUS kosztuje 1140 zł netto, jak dla mnie zbyt dużo.
Ostatecznie sterowanie rekuperatorem w moim przypadku sprowadza się do brutalnego włącz/wyłącz przekaźnikiem na zasilaniu rekuperatora. Gdy stan powietrza przekracza ustalony poziom (np sąsiad właśnie dorzucił do pieca) rekuperator się wyłącza do czasu aż koncentracja pyłów znowu spadnie poniżej ustalonego progu.
PodsumowanieW powyższym i tak przydługim wpisie opisałem ogólną konstrukcję stacji pomiaru zanieczyszczenia powietrza oraz warunków meteo pomijając mniej istotne szczegóły.
Stację taką udało mi się skonstruować i działa zgodnie z oczekiwaniami. W następnym etapie mam zamiar rozbudować układ o pomiar prędkości i kierunku wiatru oraz opadów, niestety czujniki wiatru nie są już takie tanie.
Jeśli kogoś zainspirowałem tym wpisem i chciałby poznać więcej szczegółów proszę pytajcie, w wolnej chwili odpowiem.