Kolejnym elementem inteligentnego pokoju jest termostat i higrostat w jednym. Zadaniem tego urządzenia będzie zbieranie informacji o aktualnej temperaturze oraz wilgotności w pokoju i odpowiednie sterowanie elementami wykonawczymi w celu osiągnięcia zadanej temperatury/wilgotności. Nadaje się również do sterowania warunkami w terrarium. Wystarczy podpiąć inne urządzenia wykonawcze pod przekaźniki.
Przygotowanie
Jako pierwsze zaplanowałem jakie czujniki będą podłączone do urządzenia oraz wyjścia (przekaźniki, tranzystory). Okazało się, że potrzebuję kilku termometrów oraz dwóch higrometrów jako źródeł zbierania danych i kilka przekaźników do sterowania sprzętem na 230V, a także tranzystor dla wentylatora.
Naszkicowałem również co ma się wyświetlać na LCD oraz w jakim miejscu, aby było ładnie i czytelnie. Dane oprócz wyświetlania będą zapisywane na kartę SD w celu późniejszej analizy.
Termostat składa się z trzech termometrów MCP9700, natomiast higrostat z dwóch higrometrów DHT-11.
Źródłem ciepła oraz nawilżaczem może być dowolny element podłączony pod przekaźnik, to już zależy tylko od nas co wybierzemy. Np.: jeśli chcemy zamontować ten układ w terrarium to ciepło może wytwarzać drut grzewczy, a za nawilżenie może odpowiadać np.: to urządzenie. Natomiast w przypadku sterowania tymi parametrami w większej przestrzeni np.: pokoju, można użyć grzejnika elektrycznego oraz nawilżacza powietrza.
Prace
Prace rozpocząłem jak zwykle od zmontowania całego układu na płytce stykowej. Kiedy całość spełniała już moje oczekiwania okazało się, że jest bardzo dużo elementów na jednej płytce. Wpadłem na pomysł podzielenia całości na kilka mniejszych części ku zasadzie „dziel i zwyciężaj”. W ten sposób miałem osobne plany na płytkę z przekaźnikami, która jest uniwersalna i niezależna od tego projektu, równie dobrze mogę ją wykorzystać z powodzeniem gdzie indziej. Kolejną rzeczą, którą wydzieliłem był ekspander wyjść PCF8574 służący do komunikacji wyświetlacza LCD przez magistralę szeregową I2C. Reszta komponentów została już na płycie głównej, gdyż nie było ich na tyle dużo, aby utrudniło to późniejsze projektowanie PCB.
Moduł przekaźników
Układ ten jest bardzo prosty i nie robi nic więcej jak steruje dużym prądem za pomocą sygnałów logicznych. Wersja, którą wykonałem na potrzeby projektu posiada 3 przekaźniki 12V, co oznacza, że napięcie zasilania płytki musi też być równe 12V, gdyż bezpośrednio z tego napięcia sterowana jest cewka przekaźnika. Jeśli użyjemy przekaźników 5V to albo zastosujemy rezystory ograniczające prąd płynący przez cewkę, albo podłączymy pod źródło napięcia 5V. Do poprawnego sterowania modułem wymagana jest wspólna masa, aby stany logiczne podawane na wejścia były dobrze interpretowane. Do wyjść układu możemy podłączyć dowolny obwód, ważne, aby nie przekraczał on maksymalnych parametrów przekaźnika.
Diody podłączone równolegle z cewką przekaźnika służą do niwelacji zakłóceń oraz szpilek spowodowanych załączaniem/rozłączaniem cewki. Gdyby nie było diody to przy odcięciu prądu płynącego przez cewkę mógłby zgromadzić się na tyle duży potencjał, że uszkodziłby tranzystor a co za tym idzie sterownik podłączony do wejść modułu. Dobrą praktyką jest zastosowanie transoptorów bezpośrednio za wejściem układu, przez które powinno się sterować tranzystorami. Niestety nie posiadałem na stanie tylu transoptorów, aby je tutaj zastosować i uważam, że dioda podłączona równolegle do cewki przekaźnika to wystarczające zabezpieczenie. Na zdjęciu mogą być widoczne kondensatory przy przekaźnikach, są one błędem przy zaprojektowaniu pierwszej wersji płytki i nie powinny być tam. Schemat ideowy jak i PCB zostały poprawione. W tym artykule opisuje dlaczego nie powinno się dodawać kondensatora równolegle do cewki przekaźnika.
Jeśli ktoś nie chce robić takiej płytki, gdyż już ją posiada albo chce zamówić to można kupić gotowy Relay Shield’y np.: taki. Będzie on tutaj pasował tak samo dobrze jak mój, z tym że należy się upewnić czy dobrze go podłączamy. Koszt kupienia takiego to ok. 3$ co w przeliczeniu daje ok. 12 zł, natomiast ja robiłem go samemu z elementów, które już posiadałem więc wyniosło mnie to 0 zł.
Moduł LCD I2C
Konstrukcja tego modułu jest bardzo prosta. Poza układem PCF8574 nic tak naprawdę nie ma. Reszta to tylko elementy służące do sterowania wyświetlaczem, regulacją jasności itp. W skrócie to jest nic innego jak podłączenie LCD do ekspandera wyjść. Jedynie programowo trzeba zmienić standardową bibliotekę dla LCD na taką, która obsługuje magistralę I2C.
Ja osobiście zdecydowałem się na wykonanie tego modułu samemu, gdyż w momencie rozpoczęcia prac i testów nie posiadałem gotowego. Wyjścia modułu zaprojektowałem tak, aby były zgodne z tymi z gotowych konwerterów, więc bez najmniejszego problemu można użyć np.: takiego układu.
Płyta główna
Sercem układu jest Atmega328. Początkowo miała być to Atmega8, ale wprowadzając zapis na kartę pamięci okazało się, że ma ona zbyt mało pamięci flash i program się na niej nie mieści. Biblioteka Arduino została tutaj wykorzystana w celu łatwiejszej i bardziej przejrzystej implementacji, co w rezultacie zwiększy skalowalność projektu. Program jest napisany w C++ z wykorzystaniem technik obiektowych. Cały kod jest udostępniony na GitHub’ie.
Płyta główna zasilana jest ze źródła napięcia 12V, a następnie obniżana do 5V stabilizatorem LM7805. Bezpośrednie zasilenie z 5V nie wchodziło w grę, gdyż potrzebne jest napięcie 12V do sterowania przekaźnikami i wiatrakami. Dodatkowo oprócz filtracji prądu przy stabilizatorze sam mikrokontroler jest podłączony do zasilania zgodnie ze schematem stąd.
Dwa wiatraki sterowane są za pomocą tranzystorów MOSFET. Jeśli chcemy używać sterownika do kontroli ekosystemu np.: w terrarium to wystarczy, że podłączymy wentylator komputerowy na 12V bezpośrednio do tranzystora. Jeśli chcemy schłodzić pomieszczenie to możemy na wyjście tranzystora podłączyć przekaźnik i potem urządzenie na 230V lub dorobić jakiś układ sterujący klimatyzacją np.: bezprzewodowo.
Zapis na kartę SD odbywa się poprzez dzielnik napięcia na zwykłych rezystorach na logikę 3,3V. Można tutaj było użyć konwerterów logicznych lub po prostu dodać tranzystory, ale z mojego doświadczenia taki układ wystarcza w 100%,. Działa bezawaryjnie oraz jest prosty w wykonaniu. Jedyną wadą jest to, że jeśli będziemy mieć jakieś przebicie wyższego napięcia w układzie i dotrze ono na kartę SD to nic jej niestety nie ochroni przed uszkodzeniem.
Źródłami informacji w całym układzie są tutaj trzy czujniki temperatury MPC9700 oraz dwa higrometry DHT-11. Jeśli chodzi o te pierwsze to odczyt z nich polega na pomiarze napięcia przez wbudowany przetwornik ADC w mikrokontrolerze. Dokładnie rzecz biorąc dla temperatury 0°C spadek napięcia na czujniku wynosi 500mV i zmienia się on co 10mV na 1°C. Sprawa z higrometrami jest jeszcze prostsza, gdyż są to gotowe układy elektroniczne komunikujące się z mikrokontrolerem w sposób cyfrowy. Za pomocą zwykłego pinu cyfrowego jest przekazywany sygnał, który biblioteka w oprogramowaniu konwertuje do wartości oczekiwanych i odczyt temperatury oraz wilgotności odbywa się za pomocą prostych funkcji.
Na tą chwilę układ został zaprojektowany na płytkę uniwersalną do lutowania. Oczywiście w przyszłości będzie wykonany projekt PCB do wytrawienia, ale na tę chwilę nie starczyło na to czasu. Lista elementów potrzebnych do montażu dostępna tutaj. Wybieramy płytkę, która nas interesuje i mamy w środku wszystkie potrzebne materiały, aby ją wykonać.
Testy
W przypadku, kiedy żaden przekaźnik nie będzie załączony, wiatraki oraz podświetlenie LCD są wyłączone to układ zużywa ok. 10mA prądu. Podczas zapisu na kartę pamięci pobór może się zwiększyć. Samo podświetlenie LCD zużywa 15mA prądu. Zasilanie wyświetlacza, higrometrów oraz termometrów nie przekracza 5mA. Sumarycznie część układu zasilana 5V pobiera maksymalnie 30mA prądu (może się chwilowo zwiększyć w przypadku trwania zapisu na kartę SD).
Bezpośrednio z 12V korzystają przekaźniki oraz wiatraki. Każdy przekaźnik z osobna pobiera 30mA jeśli jest załączony. Wentylatorów nie liczę, gdyż tutaj wszystko zależy co podepniemy pod tranzystor, więc ciężko podać jakąkolwiek liczbę.
Po pomiarach widać już, że całość nie pobierze więcej niż 150mA. Szukając zasilacza musimy się bardziej kierować tym co podpinamy do niego jak np.: wentylatory, gdyż to właśnie urządzenia zewnętrzne pobierają najwięcej prądu. Osobiście wybrałem 12V o wydajności 1A.
Jeszcze dla pewności dokonałem pomiaru temperatury na układzie LM7805, gdyż jest to stabilizator liniowy, więc obniżając nam napięcie, aż o 7V trzeba się upewnić, czy nie będzie się grzał.
\(P[W] = 7V * 0.03A = 0.21W\)
Z obliczeń wynika, że stabilizator musi wytracić 0.21W, co w efekcie powoduje, że nagrzewa się on do 48-51 ℃, więc radiator nie jest potrzebny.
Aktualizacja v1.1
Została wymieniona biblioteka do wyświetlania tekstu na LCD. Teraz nie trzeba przy każdej zmianie czyścić ekranu, tylko zmieniany jest cały wiersz, dzięki czemu nie widać „mignięcia” po zmianie tekstu. Bibliotekę można znaleźć na moim Github’ie.
Aktualizacja v1.2
Oprócz aktualizacji oprogramowania potrzeba było dokonać korekty w schematach. Wszystkie schematy powyżej zostały zmienione na aktualne. Stare schematy i program jest dostępny w poprzednich wydaniach np. v1.1.
Dodałem możliwość zapisu danych na karte SD z aktualną datą i godziną. Ma to na celu usprawnić analizę danych, gdyż czas z milisekudach nie jest idealny. Na przykład tracimy w nim informację jaką porę dnia mamy. Dodatkowo informacja o aktualnym czasie wyświetla się na ekranie głównym.
Ustawianie aktualnego czasu
Ustawienie aktualnego czasu musi się odbyć bezpośrednio na płycie głównej, gdyż wyciągnięcie układu RTC spowoduje jego zresetowanie, ponieważ zostanie odcięte zasilanie z baterii. Aby zaprogramować DS1302 trzeba wyciągnąć Atmege i wpiąć się 3 przewodami w piny, które mikrokontroler komunikuje się z modułem RTC i podłączyć do nich Arduino Uno jak na schemacie powyżej. Potrzebujemy jeszcze program, który wgrywamy na płytkę. Teraz możemy podłączyć zasilanie do płyty głównej i uruchomić Arduino. W serial monitorze powinna pokazać się aktualna godzina pobrana z DS1302, co oznacza, że układ został zaprogramowany poprawnie.
Podsumowanie:
Jest to pierwszy projekt, w którym podzieliłem większy układ na mniejsze części (czyli moduły). Każdemu z tych modułów zaprojektowałem jako niezależny od reszty, tzn. może on zostać wykorzystany gdziekolwiek indziej, gdzie będzie potrzebny. Są do nich zrobione schematy oraz projekty PCB. Każdy z nich może być równie dobrze osobnym wpisem na blogu.
Zastosowałem również tutaj na próbę nową architekturę projektową opartą o GitHub’a. Polega ona na tym, że wszystko, co jest związane z tym projektem zostaje umieszczone w publicznym repozytorium. Schematy Eagle, zdjęcia, kod źródłowy, oraz notatki są dostępne dla każdego.
Ceny projektu nie jestem w stanie podać, gdyż wszystkie elementy, które użyłem miałem na warsztacie i jest ich zbyt wiele, żeby liczyć każdy grosz z osobna.
Plany na przyszłość:
- Bezpośredni monitoring przez sieć radiową, aby projekt spełniał wymagania Smartroom.
- Obudowa zaprojektowana i wydrukowana na drukarce 3D dla płyty głównej jak i pozostałych układów.
- Projekt PCB, aby kolejne wersje były łatwiejsze w realizacji.
- Wymiana higrometrów na bardziej precyzyjne, np.: DHT22 lub AM2320, który komunikuje się przez magistrale I2C