'Inteligenty' dom ze sterownikiem PLC

Główna => Tematy ogólne => Wątek zaczęty przez: krwi w Stycznia 09, 2015, 06:43:06 pm

Tytuł: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: krwi w Stycznia 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ń.

(http://www.edom-plc.pl/forum/index.php?action=dlattach;topic=174.0;attach=78;image)

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

(http://www.edom-plc.pl/forum/index.php?action=dlattach;topic=174.0;attach=76;image)

Problemy

Aby nie wchodzić zbytnio w szczegóły poniżej opiszę główne problemy z którymi musiałem się zmierzyć:

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.

(http://www.edom-plc.pl/forum/index.php?action=dlattach;topic=174.0;attach=81;image)

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.
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: krwi w Stycznia 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.
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: krwi w Lutego 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.
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: maksiu w Lutego 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?
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: krwi w Lutego 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 (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 (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.
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: maksiu w Lutego 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ć :)
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: krwi w Lutego 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.
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: maksiu w Lutego 05, 2015, 08:16:29 am
Jakiś kawałek kodu może nasz pod ręką? :)
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: krwi w Lutego 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://stackoverflow.com/questions/14944773/receiving-a-http-post-request-on-arduino)
http://www.jackbarber.co.uk/notes/arduino-web-server-led-control (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/ (http://blog.bouni.de/blog/2012/06/25/a-arduino-telnet-server/)
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: krwi w Sierpnia 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:
(http://www.edom-plc.pl/forum/index.php?action=dlattach;topic=174.0;attach=130)

(http://www.edom-plc.pl/forum/index.php?action=dlattach;topic=174.0;attach=132)

(http://www.edom-plc.pl/forum/index.php?action=dlattach;topic=174.0;attach=134)
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: kempa007 w Listopada 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.
Tytuł: Odp: Pomiar zanieczyszczenia powietrza i warunków meteo
Wiadomość wysłana przez: krwi w Listopada 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.