Regulator temperatury - Arduino
Wstęp i założenia projektu
Jakiś czas temu znajomy zapytał mnie o to czy nie znalazłbym trochę czasu aby stworzyć regulator temperatury, który miałby być wykorzystany do utrzymywania w miarę stałych warunków w pewnym zbiorniku z wodą. Tak się składa, że prośba ta zbiegła się z moimi planami ponieważ jeszcze na studiach miałem ochotę coś takiego zrobić więc stwierdziłem - czemu nie? I tak powstał mały projekt, który został podzielony na dwie części - oprogramowanie przeznaczone na Arduino oraz aplikację na peceta.
Podstawowe założenia projektu to:
- regulator dwupołożeniowy z histerezą zaimplementowany na Arduino
- sterowanie grzałką/grzałkami przez przekaźnik (Arduino wysterowuje tylko jedno wyjście cyfrowe)
- możliwość ustawiania podstawowych parametrów pracy regulatora: wartości zadanej, parametrów histerezy oraz rozdzielczości termometru
- zapis ustawień urządzenia do EEPROMu
- pomiar temperatury zrealizowany z użyciem układu DS18B20
- komunikacja z PC za pośrednictwem portu szeregowego
- aplikacja PC do sterowania regulatorem stworzona w WPFie, zgodnie ze wzorcem MVVM
Wszystkie projekty stworzone zostały w Visual Studio. Projekt na Arduino stworzono z użyciem dodatku w postaci Visual Micro.
Własny protokół
Prace nad finalnym projektem rozpocząłem od stworzenia prostych aplikacji na Arduino oraz PC, w ramach których zaimplementowany miał zostać własny protokół wymiany danych pomiędzy tymi urządzeniami. Ustaliłem więc formaty ramek (ich długość, znaki startu oraz końca), których zadaniem było przenoszenie niewielkiej ilości informacji: stan jednego z wyjść cyfrowych oraz aktualny czas działania Arduino. Nie ma się jednak co rozwodzić nad tym rozwiązaniem ponieważ takie podejście do tematu jest nieelastyczne i niewygodne. Jako, że w pracy miałem okazję korzystać z protokołu Modbus stwierdziłem, że to będzie idealne rozwiązanie na zastępstwo wszystkich chałupnicznych sposobów przesyłania danych pomiędzy urządzeniami.
Opis samego protokołu (wrzucony w komentarzach w kodzie) oraz sam kod dostępny jest tutaj: SimpleCommunication. Możliwe, że znajdzie tam ktoś coś ciekawego, niemniej jednak nie zalecam stosowania tego typu rozwiązań biorąc pod uwagę, że zarówno pod Arduino jak i pod aplikacje desktopowe powstało mnóstwo bibliotek, które dokładnie adresują problem transmisji danych.
Finalna implementacja z wykorzystaniem protokołu Modbus
Arduino
Opis projektu zacząć należy od opisu sprzętu. Cały projekt przedstawiono na prostym schemacie:
Jak można zauważyć na powyższym schemacie, wyróżnić można tutaj kilka najważniejszych połączeń:
- termometr DS18B20 - do pomiaru temperatury, podłączony do portu A0
- dioda portu do debugowania - zmienia swój stan za każdym razem, kiedy wysyłana zostanie ramka ze stanem urządzenia, podłączona do portu A1
- wyjście cyfrowe sterujące przekaźnikiem z grzałkami, podłączone do portu A2
- wejście cyfrowe do resetowania parametrów regulacji (reset następuje kiedy przy starcie Arduino, wejście do będzie podpięte do masy). port A5
- dioda LED na porcie 13, zmieniająca swój stan zawsze kiedy zakończony zostaje pomiar temperatury i wysterowywane zostaje wyjście urządzenia
- linie RX i TX służące do debuggowania
W projekcie użyto 3 bibliotek:
- EEPROMex - do zapisu i odczytu ustawień regulatora do/z EEPROMu
- Modbus Library for Arduino - implementacja protokołu Modbus dla Arduino, służy do odczytu stanu urządzenia i zmiany parametrów regulatora
- DS18B20 (digital temperature sensor) and Arduino - biblioteka OneWire i DallasTemperature do obsługi układu DS18B20
Kilka zdań chciałbym poświęcić jeszcze obsłudze protokołu Modbus. Po szczegóły odsyłam tutaj: http://www.simplymodbus.ca
Użycie tego protokołu oznacza dodanie pośredniej warstwy w komunikacji. Wymiana danych pomiędzy urządzeniami odbywa się za pośrednictwem cyklicznego odczytu i zapisu 16-bitowych rejestrów i 1-bitowych cewek. Rejestry i cewki są następnie przetwarzane na poszczególne wartości będące już reprezentacją stanu urządzenia. Dokładniejszy opis wartości zapisywanych i odczytywanych z regulatora zawarty jest w klasie Communication w samym projekcie.
PC
Na potrzeby projektu stworzyłem prostą aplikację w WPFie, która umożliwia odczyt stanu regulatora oraz zmianę jego parametrów. Aplikacja korzysta z dobrodziejstwa wzorca MVVM. Działanie aplikacji można zobaczyć na poniższym filmie:
Aplikacja umożliwia:
- zmianę parametrów regulatora: wartości zadanej, szerokości histerezy, rozdzielczości pomiaru temperatury
- podgląd aktualnego stanu urządzenia: ustawionych parametrów regulacji, aktualnych pomiarów
- wizualizację regulacji z użyciem wykresów
Biblioteki użyte do stworzenia aplikacji:
- MVVM Light Toolkit - biblioteka ułatwiająca tworzenie aplikacji zgodnie ze wzorcem MVVM
- Extended WPF Toolkit - zestaw użytecznych dodatków do WPFa
- LiveCharts - wykresy w WPFie zgodne z MVVM
- NModbus4 - implementacja protokołu Modbus dla .NETa
Słowem zakończenia
Jeśli ktoś byłby zainteresowany kodami źródłowymi to są one dostępne na GitHubie: