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: arduino schemat

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:

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:

Słowem zakończenia

Jeśli ktoś byłby zainteresowany kodami źródłowymi to są one dostępne na GitHubie: