'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Autor Wątek: Pomiar zanieczyszczenia powietrza i warunków meteo  (Przeczytany 7076 razy)

krwi

  • Newbie
  • *
  • Wiadomości: 41
    • Zobacz profil
Pomiar zanieczyszczenia powietrza i warunków meteo
« dnia: Styczeń 09, 2015, 06:43:06 pm »

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 konstrukcja

Rozwią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).



Problemy

Aby 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 danych

Jak 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 rekuperatorem

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

Podsumowanie

W 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.
« Ostatnia zmiana: Styczeń 09, 2015, 06:50:57 pm wysłana przez krwi »
Zapisane

krwi

  • Newbie
  • *
  • Wiadomości: 41
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #1 dnia: Styczeń 23, 2015, 03:14:33 pm »

  • 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).
Wygląda na to, że prawie udało mi się rozwiązać ten problem, zamiast stosować zgodnie z zaleceniami jeden pull-up przy samym μC, zastosowałem osobne pull-upy przy każdym czujniku o wartości 4.7 kΩ, oprócz tego masę i sygnał puściłem jedną parą a zasilanie żyłą z innej pary. Co prawda czasem jeszcze zdarzają się odczyty 85 (najczęściej przy zapalaniu oświetlenia LEDowego, pewnie indukują się wtedy zakłócenia) ale dzieje się to sporadycznie. Dzięki temu uniknąłem konieczności stosowania dodatkowego kontrolera / wzmacniacza 1-wire.
Zapisane

krwi

  • Newbie
  • *
  • Wiadomości: 41
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #2 dnia: Luty 02, 2015, 06:48:40 pm »

Co prawda czasem jeszcze zdarzają się odczyty 85 (najczęściej przy zapalaniu oświetlenia LEDowego, pewnie indukują się wtedy zakłócenia) ale dzieje się to sporadycznie. Dzięki temu uniknąłem konieczności stosowania dodatkowego kontrolera / wzmacniacza 1-wire.
Początkowo sądziłem, że te zakłócenia są indukowane przez linię 230V biegnącą zbyt blisko skrętek (mimo że wszędzie zachowałem min 30 cm odległości) ale okazało się, że zakłócenia pochodzą od samego łącznika (tam gdzie czujnik 1-wire dzieli z łącznikiem jedną skrętkę) i powstają w momencie zwarcia łącznika. Radą na to okazało się wstawienie rezystora 470 Ω (najmniejszy jaki akurat miałem) na żyle zasilającej łącznik. W tym momencie definitywnie pozbyłem się już wszystkich zakłóceń z magistrali 1-wire.
Zapisane

maksiu

  • Jr. Member
  • **
  • Wiadomości: 87
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #3 dnia: Luty 02, 2015, 10:05:29 pm »

W kwestii I2C i zakłóceń, to ja uruchomiłem komunikację bez wzmacniaczy na przewodzie 3m (taki "projekt" sprzed 3 lat, sterownik do maszyny rolniczej: panel w kabinie i moduł wykonawczy na maszynie). Jednak użyłem do tego przewodu bodajże 5x1 czy coś podobnego (zwykła linka do zasilania, nie skrętka). W przewodzie obok I2C było też zasilanie oraz jeden sygnał od czujnika indukcyjnego typu NPN NO.
Zatem do sedna. Czasem, w momencie gdy czujka dawała sygnał, to I2C się zawieszało. Długo nie mogłem znaleźć przyczyny (mniejsza wiedza, mniejsze doświadczenie) i robiłem różne kombinacje software'owe, w końcu dałem do linii sygnałowej i do masy kondensator 100n. I to było remedium - po prostu sam czujnik daje sygnał o ostrym zboczu (kwadrat lub bardzo wąski trapez) który generował zakłócenia, a kondensator łagodzi to zbocze.
Podobnie może być też z tymi łącznikami.

Opisz proszę trochę działanie modułu ethernet na tym adruino czy jak mu tam. Jak się to oprogramowuje? Bo myślę nad tym, jak zrobić komunikację PLC<->wiele modułów i na razie myślę nad RS485 i MODBUS. Może dałoby się to zamienić na ethernet?
Zapisane
Pozdrawiam
maksiu

krwi

  • Newbie
  • *
  • Wiadomości: 41
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #4 dnia: Luty 03, 2015, 06:31:44 pm »

Opisz proszę trochę działanie modułu ethernet na tym adruino czy jak mu tam. Jak się to oprogramowuje? Bo myślę nad tym, jak zrobić komunikację PLC<->wiele modułów i na razie myślę nad RS485 i MODBUS. Może dałoby się to zamienić na ethernet?

Arduino to jest rodzaj mikrokontrolera opartego na chipie ATmega328 (model Uno którego użyłem):
http://arduino.cc/en/Main/ArduinoBoardUno
sam mikrokontroler nie ma interfacu sieciowego więc trzeba dołączyć do niego moduł sieciowy tzw Ethernet Shield:
http://arduino.cc/en/Main/ArduinoEthernetShield.
Mikrokontroler programuje się normalnie w C/C++ poza tym jest wiele gotowych bibliotek również do obsługi modułu ethernet.
Sposób komunikacji po sieci można rozwiązać na wiele sposobów, ethernet shield może działać równocześnie jako klient i jako serwer. W moim przypadku na mikrokontrolerze serwuję prostą stronę www z aktualnymi odczytami z czujników, które pobiera sobie sterownik PLC. Przykładowa funkcja serwująca stronę HTML z danymi z czujnika DHT22 zawartymi w zmiennych temperature i humidity:

void webserver()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    //Serial.println(F("new client"));
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(F("Connection: close"));  // the connection will be closed after completion of the response
  client.println();
          client.println(F("<!DOCTYPE HTML>"));
          client.println(F("<html>"));
                         
          // Temperatura i wilgotnosc
          client.print(F("<BR>Temperatura: "));
          client.print(temperature, 1);
          client.print(F(" "));
          client.write(176);
          client.println(F("C<BR>"));
          client.print(F("Wilgotnosc: "));
          client.print(humidity, 1);
          client.println(F(" %<BR>"));
             
          client.println(F("</html>"));
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
  }
}

Oprócz tego mikrokontroler wysyła te dane metodą POST na serwer. Przykładowa funkcja wysyłająca na serwer dane przekazane w stringu data wygląda tak:

void SendData(String data)
{
  if (client.connect(DataServerIP,80))
  {
    client.println(F("POST /add.php HTTP/1.1"));
    client.print(F("Host: "));
    client.println(DataServerIP);
    client.println(F("Content-Type: application/x-www-form-urlencoded"));
    client.print(F("Content-Length: "));
    client.println(data.length());
    client.println();
    client.print(data);
  }
 
  if (client.connected())
  {
    client.stop();
  }
}

Na sterowniku PLC w oparciu o bibliotekę WagoLibHttp_02.lib zaimplementowałem funkcję (nieco przerobiony przykład z dokumentacji tej biblioteki) cyklicznie pobierającą dane ze strony serwowanej przez Arduino.
Jakbyś miał jeszcze jakieś pytania chętnie odpowiem.
Zapisane

maksiu

  • Jr. Member
  • **
  • Wiadomości: 87
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #5 dnia: Luty 03, 2015, 08:44:31 pm »

Dzięki za odpowiedź.
Atmegi znam całkiem dobrze, korzystam z nich prawie na co dzień. Jednak do arduino zawsze miałem uprzedzenie (w stylu  "co, ja nie zrobię sam?" ;)), a widzę, że to się całkiem interesująco rozwinęło i możliwości są całkiem spore.
Tym bardziej, że wraz ze sprzętem dostarczają sporo rozbudowanych, obiektowych bibliotek, które typowe rozbudowane rzeczy sprowadzają do jednej linijki :)

No i myślę nad wykorzystaniem tego w domu. Zamiast ciągnąć sieć RS485 można by wykorzystać ethernet. I z tego co widzę (chyba nawet tak zrobiłeś), będzie najprościej wziąć taki moduł i do niego podłączyć wszystkie czujki 1wire, ciśnienia, może stację pogodową i wiele innych. Mam pomysł nawet na własne moduły w obudowach włączników (wyświetlanie temperatury, zadawanie, może w przyszłości coś więcej).
Jeszcze żeby się udało z PLC zapisywać do atmegi, to nawet i moduł LED RGB można by zrobić :)
Zapisane
Pozdrawiam
maksiu

krwi

  • Newbie
  • *
  • Wiadomości: 41
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #6 dnia: Luty 04, 2015, 06:22:08 pm »

Jeszcze żeby się udało z PLC zapisywać do atmegi, to nawet i moduł LED RGB można by zrobić :)

Z tym nie powinno być większego problemu, wartości zmiennych na Arduino może przez sieć zadawać sterownik PLC.
Zapisane

maksiu

  • Jr. Member
  • **
  • Wiadomości: 87
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #7 dnia: Luty 05, 2015, 08:16:29 am »

Jakiś kawałek kodu może nasz pod ręką? :)
Zapisane
Pozdrawiam
maksiu

krwi

  • Newbie
  • *
  • Wiadomości: 41
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #8 dnia: Luty 05, 2015, 07:37:41 pm »

Niestety, nie mam takiego (u mnie sterownik jedynie pobiera dane z Arduino) ale na poniższych stronach są przykłady na podstawie których coś takiego dało by się zrobić.
Z wykorzystaniem POST/GET:
http://stackoverflow.com/questions/14944773/receiving-a-http-post-request-on-arduino
http://www.jackbarber.co.uk/notes/arduino-web-server-led-control
Z wykorzystaniem telnetu:
http://blog.bouni.de/blog/2012/06/25/a-arduino-telnet-server/
Zapisane

krwi

  • Newbie
  • *
  • Wiadomości: 41
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #9 dnia: Sierpień 06, 2015, 10:17:36 am »

Zrobiłem nową wersję strony prezentującej dane z mojej stacji z wykorzystaniem biblioteki Highcharts. Poniżej przykładowe screeny:




« Ostatnia zmiana: Sierpień 06, 2015, 10:19:38 am wysłana przez krwi »
Zapisane

kempa007

  • Newbie
  • *
  • Wiadomości: 35
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #10 dnia: Listopad 08, 2019, 03:55:08 pm »

Witam, gratulacje pomyslu i jego realuzacji. Super projekt. Koncowka mnie tylko zastanowila. U mnie rekuperator ma styki do wylaczenia go, ale na poczatku tez sie zastanawialem nad brutalnym wylaczaniem tego urzadzenia np. Gdy wlaczony zostaje alarm. Nie wiem jaki masz rekuperator ale jezeli jest on typu krzyzowego to czy nie obawiasz sie zamarzniecia wymiennika i jego uszkodzenia? Ja dopiero sie wprowadzam wiec jeszcze duzo pracy przede mna.
Zapisane

krwi

  • Newbie
  • *
  • Wiadomości: 41
    • Zobacz profil
Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
« Odpowiedź #11 dnia: Listopad 08, 2019, 04:40:26 pm »

Akurat mam przeciwprądowy ale bardziej chodzi o to, że jest zamontowany w kotłowni więc ryzyka zamarznięcia nie ma.
Zapisane