- konstrukcja oparta na mikrokontrolerze ATmega4808
- pomiar temperatury otoczenia: czujnik DS18B20
- dokładność pomiaru temperatury: ±0,5°C
- sterowanie: enkoder obrotowy
- wyświetlacz: LCD TFT 128×160 px
- wyjścia przekaźnikowe: 2×DPDT 250 V/8 A
- wbudowany zegar czasu rzeczywistego (DS3231) z podtrzymaniem (CR2032)
Uruchomienie i działanie układu
Uruchomienie układu zaczynamy od płytki zasilacza. Po podłączeniu sieci 230 V sprawdzamy obecność napięcia wyjściowego +5 V (wyprowadzenia 1 i 2 złącza P2) względem masy (wyprowadzenia 3 i 4 złącza P2). Jeżeli napięcie to jest prawidłowe, łączymy obie płytki złączami IDC. Napięcie na wyjściu stabilizatora U2 – umieszczonego na płytce sterownika – powinno wynosić +3,3 V. W następnym kroku do złącza J2 wpinamy programator umożliwiający zaprogramowanie mikrokontrolera Atmega4808 za pomocą jednej linii UPDI. Ja użyłem programatora MPLAB PICkit4 współpracującego ze środowiskiem projektowym MPLABX IDE. Po podłączeniu zewnętrznego czujnika DS18B20 do złącza P4 układ jest gotowy do weryfikacji działania oraz rozpoczęcia programowania ustawień.
Po włączeniu zasilania pojawia się ekran główny podzielony na dwie strefy. W pierwszej z nich wyświetla się temperatura mierzona przez czujnik DS18B20. Wynik jest aktualizowany co 1 sekundę (co wynika z czasu potrzebnego na dokonanie pomiaru). W drugiej strefie wyświetlane są natomiast: rzeczywisty czas w godzinach, minutach i sekundach, data, a także bieżący program termostatu.
Ten ostatni działa w dwóch przedziałach czasowych, umownie nazwanych: „dzień” i „noc”. Do każdego z tych przedziałów przypisana została wartość temperatury. Z założenia w czasie „dzień” ustawiana jest wyższa temperatura, właściwa dla aktywności domowników (może to być na przykład +21°C). W czasie „noc” ustawiamy temperaturę niższą, na przykład +18°C. Przekłada się to niższe zużycie gazu, a dodatkowo w niższej temperaturze lepiej się śpi.
Przedział czasowy „dzień” zaczyna się o godzinie określonej przez Czas1 i kończy się o godzinie określonej przez Czas2. W tym przedziale wykonywany jest program o nazwie „Program #1” z przypisaną temperaturą regulacji Temp1.
Przedział czasowy „noc” zaczyna się o godzinie Czas2, a kończy o godzinie Czas1. W tym przedziale z kolei wykonywany jest czas regulacji „Program #2” z przypisaną Temp2. Wszystkie parametry programu: Czas1, Czas2, Temp1 i Temp2 są programowane. Jedyne ograniczenie bieżącej wersji oprogramowania stanowi warunek, że Czas1 musi być mniejszy od Czas2. Na przykład Czas1=07:00, Czas2=22:15, ale Czas2 nie powinien mieć na przykład wartości 0:30. Wtedy program regulacji będzie działał, ale po zaniku zasilania może błędnie określić, w którym przedziale czasowym się znajduje, aż do momentu osiągnięcia jednego z czasów: Czas1, lub Czas2. Na rysunku 5 pokazano zasadę czasowego podziału doby na dwa programy Program #1 i Program #2. W czasie wykonywania programu #1 termostat utrzymuje temperaturę Temp1, a w czasie trwania programu #2 – temperaturę Temp2.
Temperatura jest regulowana przy zastosowaniu pętli histerezy. Załóżmy, że temperatura otoczenia okazuje się wyższa od temperatury Temp1. Termostat wyłącza wówczas grzanie pieca. Temperatura otoczenia spada, osiąga wartość Temp1.
Termostat nadal nie włączy pieca – tak długo, aż temperatura otoczenia spadnie do wartości Temp1 – Hist, gdzie Hist jest wartością programowaną w zakresie od 0,1°C do 2°C z krokiem 0,1°C. Jeżeli temperatura otoczenia jest niższa od Temp1 – Hist, to termostat włącza grzanie. Temperatura w pomieszczeniu rośnie, aż osiągnie wartość wyższą od Temp1. Wtedy termostat wyłącza grzanie i cykl się powtarza. Takie rozwiązanie zapobiega częstym cyklom załącz-wyłącz, kiedy temperatura jest bliska wartości Temp1. Temperatura w pomieszczeniu będzie się w przybliżeniu wahać od wartości Temp1-Hist do Temp1. Wartość histerezy należy dobrać w zależności od warunków w ogrzewanych pomieszczeniach. Zbyt duża powoduje duże wahania temperatury, zbyt mała natomiast – częste cykle załącz-wyłącz. Prototyp termostatu pracował z histerezą 0,8°C. Histereza pozostaje wspólna dla obu programów.
Menu programowania jest dostępne po przyciśnięciu osi impulsatora. Można w nim ustawić czas, datę i termostat.
Wybór jednej z funkcji w menu ustawień (czas, data, termostat) realizowany jest przez obrót gałki. Wybrana funkcja wyświetlana się na biało. Przyciśnięcie osi impulsatora sprawia, że rozpoczyna się wykonywanie wybranej funkcji.
Najbardziej rozbudowana jest funkcja ustawień termostatu. Można w niej zaprogramować:
- histerezę w zakresie od 0,1°C do 2,0°C z krokiem 0,1°C,
- temperaturę Temp1 w zakresie od 0°C do 31°C z krokiem 0,1°C,
- temperaturę Temp2 w zakresie od 0°C do 31°C z krokiem 0,1°C,
- czas 1 (godziny, minuty),
- czas 2 (godziny, minuty).
Nastawy zmienia się przez obrót osi impulsatora, a zatwierdza jej przyciśnięciem. Ustawiana wartość wyświetlana się na biało, a po zatwierdzeniu zmienia kolor na niebieski.
Po wejściu w menu ustawień termostatu użytkownik nie ma możliwości wybrania tylko jednej z nastaw. Musi „przeklikać” wszystkie pozycje. Sterownik pamięta każdą nastawę i jeżeli jakiejś nie chcemy modyfikować, powinniśmy sekwencyjnie przyciskać oś impulsatora, żeby przejść do kolejnej nastawy bez wprowadzania zmian. To uproszczenie nie wpływa znacząco na komfort użytkowania, ponieważ programowania termostatu nie wykonuje się często. Wszystkie nastawy są zachowywane w pamięci nieulotnej mikrokontrolera i odtwarzane po każdym zaniku napięcia zasilania. Wraz z podtrzymaniem bateryjnym zegara RTC zapewnia to w miarę niezakłócony cykl sterowania przy chwilowych zanikach napięcia sieciowego. Sterownik – po ponownym włączeniu zasilania – na podstawie ustawień Czas1 i Czas2 oraz bieżącego wskazania zegara oblicza czy aktywny jest Program #1, czy Program #2 i zaczyna regulować nastawione temperatury właściwe aktywnemu programowi.
Ustawienia czasu oraz daty nie wymagają szerszego komentarza. W trybie ustawiania czasu programujemy kolejno: godziny i minuty. Po ustawieniu minut oraz przyciśnięciu osi impulsatora, zerowany jest licznik sekund – i wartości godzin, minut i sekund są wpisywane do rejestrów układu DS3231, a zegar zaczyna odliczać nowy czas. W funkcji ustawienia daty programowane są: dzień miesiąca, miesiąc, a także rok.
Jak już wspomniałem, oprogramowanie zostało napisane w środowisku MPLAB firmy Microchip. Oprócz oczywistych elementów – takich jak środowisko IDE i kompilator C – istotnym wsparciem dla programisty jest wtyczka konfiguracyjna MCC. Oprócz konfiguracji urządzeń peryferyjnych, dostarcza kody źródłowe procedur do ich obsługi, co znacznie ułatwia i skraca pisanie programu. Trzeba przy tym pamiętać, że większość procedur komunikacji sprawdza warunek zakończenia transmisji w nieskończonych pętlach (procedury blokujące). Warto je nieco zmodyfikować, tak by – po określonym czasie oczekiwania w pętli na spełnienie warunku – tę pętlę przerwać. Jeżeli tego nie zrobimy ryzykujemy, że program prędzej czy później trwale się zawiesi. Można również pozostawić go tak jak jest – i skonfigurować moduł watchdoga.