W opisywanym systemie są dwa komponenty systemu automatyki z przekaźnikami. Pierwszy jest przeznaczony do włączania wentylatora usuwającego z pomieszczenia dym (z trującym tlenkiem węgla) powstający w trakcie rozpalania pieca, który czasami się wydziela, zanim komin odprowadzający „załapie” właściwy ciąg. To wymaga bardziej złożonego sterowania niż w przypadku włączania oświetlenia, z użyciem dodatkowego komponentu. Podobnie jak w module opisanym w poprzednim miesiącu, występuje tu możliwość ręcznego sterowania za pomocą jednoprzyciskowej klawiatury.
Pozostałe funkcje, związane z usuwaniem tlenku węgla, są realizacją poleceń odbieranych z minisieci RS485. Typowy, dostępny w handlu czujnik, wykrywający w powietrzu niebezpieczne stężenie czadu, ma na wyjściu przekaźnik. Stan zwarcia jego styków jest ciągle monitorowany i na tej podstawie generowane jest odpowiednie polecenie, które poprzez magistralę RS485 dociera do modułu sterującego wentylatorem. Niezależnie można też kliknąć na odnośnik na stronie internetowej, by przesłać rozkaz sterowania wentylacją.
Drugim, znacząco innym funkcjonalnie, jest komponent sterujący pompą wymuszającą cyrkulację ciepłej wody w instalacji centralnego ogrzewania. Bazuje na tym samym rozwiązaniu sprzętowym, ale podczas pracy jest sterowany wyłącznie poprzez magistralę RS485, stosownie do wartości temperatury zmierzonej przez kolejny moduł. Jednostka centralna bazuje na mikrokontrolerze ATmega88, której schemat pokazuje rysunek 1.
Konstrukcja jest bardzo zbliżona do modułu opisanego w poprzednim numerze. Procesor jest taktowany sygnałem zegarowym wygenerowanym w oparciu o rezonator kwarcowy (X101) z niezbędnymi kondensatorami (C102, C103). Częstotliwość sygnału pozwala na uzyskanie standardowych prędkości transmisji szeregowej. Elementy R101, C101, SW101 i D101 tworzą obwód generujący sygnał reset. Ostatnim podstawowym elementem jest złącze do programowania pamięci FLASH (P101).
Obsługa przycisku do ręcznego sterowania jest zrealizowana w oparciu o transoptor U103. Gdy nie jest naciśnięty zewnętrzny przycisk klawiatury (symbolizowany etykietą KEY), rezystor R112 wymusza stan pasywny (logicznej jedynki). Naciśnięcie przycisku powoduje przepływ prądu przez rezystor R109 i diodę LED znajdującą się w transoptorze i finalnie wymusza stan logicznego zera na odpowiednim wyprowadzeniu portu (pin 5 portu D).
Identycznie jak w poprzednich rozwiązaniach, dane szeregowe RXD i TXD poprzez układ interfejsu RS485 są udostępnione na zewnątrz modułu. Kierunek pracy interfejsu RS485 dla transmisji półdupleksowej jest zrealizowany sygnałem DIR, który jest sterowany odpowiednim wyprowadzeniem portu. Mikrokontroler dodatkowo steruje świeceniem lampek LED, które mają identyczne znaczenie (odpowiednie wyprowadzenia portu C) oraz pracą przekaźnika elektromagnetycznego (sygnał PWR).
Układ interfejsu szeregowego to SN75176 (U501, rysunek 2). Po stronie mikrokontrolera występują identyczne jak dotychczas rozwiązania (rezystory R501, R502). Wyjście interfejsu poprzez złącze P501 wychodzi na zewnątrz modułu. Dodatkowo przez to złącze doprowadzone jest zasilanie dla modułu oraz pozwala ono na przyłączenie zewnętrznego przycisku (etykieta KEY).
Obsługę przekaźnika elektromagnetycznego pokazuje rysunek 3. Z racji użycia elementu o charakterze indukcyjnym dochodzi dioda D201, która gasi przepięcia generujące się w chwili wyłączania przekaźnika 12V (K201, rysunek 3). Lampki LED (rysunek 4) są montowane do małej płytki frontpanelu, dlatego zawierają dwa złącza P401 i P402.
Konstrukcję modułu zamyka stabilizator napięcia. Jest to układ stabilizatora impulsowego w celu uzyskania wysokiej sprawności przetwarzania. Jego schemat pokazuje rysunek 5. Zastosowany układ to L4978, a jego aplikacja jest zgodna z zaleceniami producenta. Napięcie wyjściowe ustalają rezystory R303 i R304. Przy podanych wartościach napięcie wyjściowe wynosi +5VDC. Stabilizator napięcia jest tradycyjnie odłączany od układu poprzez zworkę P301.
Do schematu modułu została opracowana płytka PCB, której widok pokazuje rysunek 6 (strona TOP) i rysunek 7 (strona BOTTOM).
Większość elementów jest przewidziana do montażu powierzchniowego. Przy odrobinie staranności montaż nie powinien sprawiać problemów nawet osobom początkującym (uzyskany moduł pokazuje fotografia wstępna). Warto pamiętać, że dbałość o szczegóły na tym etapie owocuje mniejszymi problemami w dalszym postępowaniu. Przed pierwszym włączeniem zasilania do modułu należy zdjąć zworkę P301 (klasyczny jumperek). Moduł jest przewidziany do zasilania ze źródła napięcia o wartości +12VDC. Po jego zasileniu należy sprawdzić napięcie na wyjściu stabilizatora. Nominalna wartość wynosi około +5VDC.
W dalszej kolejności konieczne jest ustawienie bitów konfiguracyjnych mikrokontrolera (określanych jako FUSE). Ich modyfikację można przeprowadzić, przyłączając programator do układu. Wystąpienie kłopotów z odczytem bieżących ustawień oznacza brak kontaktu elektrycznego pomiędzy programatorem a mikrokontrolerem.
Po ewentualnym usunięciu zimnych lutów możliwe staje się skonfigurowanie mikrokontrolera, w zastosowanym są to:
- CKDIV8 – bit konfiguracyjny nakazujący dzielić częstotliwość sygnału zegarowego przez 8, należy tę opcję wyłączyć (fabrycznie nowy mikrokontroler ma tę opcję włączoną),
- wybrać wariant sygnału zegarowego (SUT_CKSEL) jako zewnętrzny rezonator kwarcowy z częstotliwością w przedziale 3...8 MHz,
- przydatne jest zaznaczenie opcji EESAVE (kasowanie pamięci FLASH niezbędne przy każdym zaprogramowaniu mikrokontrolera nie będzie jednocześnie powiązane z kasowaniem pamięci EEPROM, w której są przechowywane dane konfiguracyjne).
Gdy wykorzystuje się do tworzenia oprogramowania bezpłatny pakiet narzędziowy AVR STUDIO 4, oczekiwany zestaw konfiguracji FUSE widoczny jest na rysunku 8. Jak było wspomniane, na bazie tego sprzętowego rozwiązania powstały dwa moduły o odmiennej funkcjonalności, które różnią się oprogramowaniem. Oprogramowanie sterownika wentylatora jest praktycznie kopią programu modułu do zarządzania oświetleniem. Jedyna różnica zawiera się w innych wartościach domyślnych kilku parametrów konfiguracyjnych.
Konfigurację i sprawdzenie działania w warunkach laboratoryjnych (fotografia 1) można wykonać przed docelową instalacją. Tu warto zauważyć, że po każdym poleceniu wysłanym do modułu występuje w parze polecenie REPLY (konsekwencje pracy w półdupleksie), które jest wyrażeniem zgody na aktywny dostęp do magistrali komunikacyjnej. Ilustruje to tabela 1 (wszystkie tabele są dostępne w Elportalu wśród materiałów dodatkowych do tego numeru).
Moduł sterujący pompą - zasady działania
Drugi moduł, bazujący na tym samym rozwiązaniu sprzętowym, jest przeznaczony do sterowania pompą wymuszającą cyrkulację wody w instalacji ogrzewania, stosownie do zmierzonych temperatur. Najprostszym wariantem jest włączenie pompy, jeżeli temperatura wody w kotle osiągnie pewien minimalny próg (próg przełączenia). Wymusi to cyrkulację wody w instalacji. Jeżeli temperatura wody spadnie poniżej progu, to pompę należy wyłączyć.
Do tego prostego algorytmu musi zostać dodana histereza. Niech ma ona wartość 6°C. Włączenie pompy zajdzie, gdy aktualna wartość temperatury będzie większa od 33°C, a wyłączenie pompy nastąpi po spadku poniżej 27°C. Do powyższego algorytmu dochodzi jeszcze jeden istotny element: w czasie długiej bezczynności pompa musi być co jakiś czas włączana na relatywnie krótki czas (np. na jedną minutę raz w miesiącu), co ma przeciwdziałać awarii związanej z zastaniem się sprzętu.
Pierwsze uruchomienie po załadowaniu programu do wewnętrznej pamięci FLASH mikrokontrolera spowoduje zapis do pamięci konfiguracyjnej EEPROM ustawień domyślnych. Blok danych konfiguracyjnych przechowywany w pamięci nieulotnej jest opatrzony 16-bitową sumą kontrolną CRC. Strukturę tego bloku pokazuje listing 1 (wszystkie listingi są dostępne w Elportalu wśród materiałów dodatkowych do tego numeru).
Niektóre z informacji znajdujących się w bloku danych konfiguracyjnych:
MyDeviceID – własny identyfikator sterownika jako ciąg składający się maksymalnie z 8 znaków, domyślnie jest MCTRL1,
Password – hasło wymagane przy aktywnej konfiguracji parametrów sterownika składające się maksymalnie z 6 znaków, domyślnie jest MAGIC,
EventDestinDeviceID [ EventDestin- DeviceArraySize ] – zbiór identyfikatorów innych modułów/urządzeń, które należy powiadomić o zmianie statusu obciążenia (każde włączenie/ wyłączenie pompy generuje operację powiadomienia wszystkich „zainteresowanych” o nowym stanie własnym), jest to tablica mieszcząca 4 identyfikatory, z których każdy składa się z maksymalnie 8 znaków,
TempThreshold – wartość progowa temperatury, wartość domyślna jest 0,
TempHysteresis – wartość liczbowa histerezy, wartość domyślna jest 2,
TempParamName – symbol wielkości pomiarowej wpływającej na sterowanie pompą obiegową, domyślnie jest pusta (nie zawiera identyfikatora).
Algorytm działania programu w zakresie komunikacji oraz konfiguracji jest identyczny jak w modułach już opisanych. Nowym elementem jest sterowanie pompą bazującą na danych pomiarowych. Działanie tej funkcji pokazuje listing 2. Jest to funkcja wywoływana w reakcji na otrzymanie danych pomiarowych (polecenie RPV). W parametrach tego polecenia znajduje się symbol zmiennej pomiarowej oraz jej wartość. Ma to swoje odzwierciedlenie w działaniu funkcji.
W pierwszej kolejności (pierwsza pętla for) wyselekcjonowany jest identyfikator zmiennej pomiarowej. Jeżeli jest on (zmienna o nazwie TmpParamName) zgodny z symbolem zapisanym w pamięci nieulotnej (zmienna EEBlock.TempParamName), to następuje dalsza analiza parametrów polecenia (wyselekcjonowanie wartości parametru w zakresie części całkowitej). Ze względu na reprezentację danej (jest to łańcuch znaków) konieczna jest konwersja do postaci binarnej: realizacja instrukcji BinaryParamValue=StringToNumb(Tm pParamName). Gdy dane pomiarowe są w formacie binarnym następuje sprawdzenie zakresu (zmienna HiTempBorder zawiera wartość progową powiększoną o wartość histerezy oraz LoTempBorder wartość progową pomniejszoną o wartość histerezy) oraz ewentualne wysterowanie przekaźnika sterującego pracą pompy.
Włączenie pompy pokazuje listing 3. Jeżeli jest to sterowanie uwarunkowane pomiarami temperatury (zmienna StandardControlEnable ma wartość 1 albo ma wartość 0, gdy sterowanie pompą wynika z cyklu jednomiesięcznego i nie może być zaburzane danymi pomiarowymi), to w przypadku gdy aktualnie pompa jest wyłączona, następuje jej włączenie jako wysterowanie właściwego wyprowadzenia portu. Jednocześnie jest zaświecana dioda LED sygnalizująca stan włączenia.
Wywołanie funkcji PermEchoTransmit oraz TempEchoTransmit generuje powiadomienia o zmianie stanu do wszystkich zgłoszonych modułów (między innymi do serwera stron www). Włączenie pompy jednocześnie deaktywuje comiesięczną akcję krótkotrwałego włączenia pompy (zmienne MotorOnHandler oraz MotorOffHandler są uchwytami do funkcji, które zostaną aktywowane niezależnie po upływie odpowiedniego czasu).
Wyłączenie pompy wynikające z realizacji algorytmu opartego o dane pomiarowe zawiera dodatkowe operacje, funkcję pokazuje listing 4. W stosunku do funkcji włączającej pompę w tym przypadku dochodzi do realizacji uruchomienia pomiaru czasu. Wywołanie funkcji AttachTimer oznacza żądanie wywołania określonej w parametrach funkcji (AutoOnMotorAction) po upływie specyfikowanego w parametrach czasu (AutoOnMotorTimeInterval).
Wynikiem działania funkcji jest odpowiedni uchwyt pozwalający na identyfikowanie odłożonej w czasie akcji. Jest on używany do zaniechania, rezygnacji z realizacji zaplanowanej czynności. Aktywacja comiesięcznego włączenia pompy jest inicjowana ostatnim jej wyłączeniem. W sytuacji, gdy następuje zakończenie sezonu grzewczego, niezburzone miesięczne oczekiwanie doprowadzi do wywołania zgłoszonej funkcji. Jej postać pokazuje listing 5.
Podstawowa różnica w stosunku do funkcji włączającej pompę w wyniku sterowania opartego o pomiary temperatury (listing 3) sprowadza się do blokowania jej wywołania w wyniku realizacji instrukcji StandardControlEnable=false (ciągle przychodzące dane pomiarowe poza sezonem grzewczym spowodują natychmiastowe jej wyłączenie) oraz aktywowana jest funkcja do wyłączenia pompy po upływie krótkiego czasu jako wywołanie funkcji AttachTimer. Za jakąś jedną minutę będzie wywołana funkcja do rzeczywistego wyłączenia pompy, której postać pokazuje listing 6.
Funkcja ta zawiera odblokowanie sterowania pompą opartego o dane pomiarowe w wyniku wykonania instrukcji StandardControlEnable=true oraz kolejną aktywację akcji do wykonania za kolejny miesiąc jako wywołanie funkcji AttachTimer. Rozpoczęcie sezonu grzewczego, czyli sterowanie włączaniem pompy opartego na pomiarach temperatury, deaktywuje ciąg comiesięcznych włączeń. Realizacja wywołań funkcji odłożonej w czasie jest realizowana w wyniku cyklicznego wywoływania funkcji SysTimerPool w pętli głównej programu (listing 7).
Koncepcję kolejki zdarzeń uwarunkowanych upływem czasu pokazuje rysunek 9. Jest to kilkuelementowa tablica struktur zawierających informacje o statusie (część TimeEventStatustArray określająca, czy dany element opisuje akcję wykonywaną jednorazowo, czy cyklicznie), wskazanie na funkcję, którą należy wywołać w odpowiednim momencie (część TimeEventArray.TimeService; wywoływana funkcja jest wniesiona jako parametr przy wykonaniu funkcji AttachTimer) oraz określenie chwili, kiedy ma dojść do wywołania odłożonej w czasie funkcji (część TimeEventArray.TimeInterval).
Postać tej funkcji pokazuje listing 8. Jeżeli jest ustawiona flaga upłynięcia małego interwału czasu (zmienna TimeEventModuleInstance.TimeTickEvent ma wartość 1, która jest ustawiana w wyniku wywołania funkcji SysTimerTickEvent w obsłudze przerwań od upływu czasu: przerwanie TIMER0_OVF_vect), to następuje zwiększenie licznika reprezentującego upływ czasu (jest to 32-bitowy licznik ciągle inkrementowany). Jeżeli stan tego licznika zrówna się z liczbą reprezentującą interwał czasu związany z daną akcją odłożoną w czasie, to dochodzi do jej wywołania.
Przykładowo po aktywacji wywołania funkcji AutoOnMotorAction (listing 4), zakładając, że bieżący licznik upływu czasu ma wartość 1000, po wywołaniu funkcji AttachTimer element kolejki będzie zawierał dane jak na rysunku 9 (element TimeService będzie wskazywać na docelową funkcję, element TimeInterval będzie zawierał sumę aktualnego licznika i wartości parametru, za jaki czas należy aktywować funkcję oraz status będzie zawierał flagę, że dana akcja jest jednorazowa).
Tu warto zwrócić uwagę, że algorytm działa poprawnie nawet w przypadku, gdy docelowy czas aktywacji wywołania będący sumą aktualnego licznika upływu czasu oraz wielkości przesunięcia czasowego wygeneruje przepełnienie (wynik przekroczy liczbę 32-bitową). Powyższe rozwiązanie kolejek czasowych może przechowywać kilka niezależnych akcji odłożonych w czasie.
Moduł sterowania pompą obiegową rozpoznaje polecenia, pokazane w tabeli 2. Po uruchomieniu i zaprogramowaniu modułu należy go odpowiednio skonfigurować i sprawdzić według tabeli 3. W kolejnej części będzie opisana współpraca komercyjnego czujnika tlenku węgla z modułem sterującym pracą wentylatora.