Sterowanie grzałką za pomocą Arduino

Wielu z nas posiada w swoich zbiornikach filtrację opartą o filtr narurowy z wbudowaną w układ grzałką łazienkową. Jest to wygodne rozwiązanie ograniczające ilość sprzętu w akwarium. Standardowo, grzałka wyposażona jest w termostat jednakże ustawienie temperatury wykonywane jest metodą prób i błędów. Przyczyną takiego stanu rzeczy jest brak informacji o zakresie temperatur na pokrętle sterującym.

Niniejszy artykuł opisuje rozwiązanie problemu przy pomocy Arduino. Zapewne każdy zastanawia się teraz co to jest Arduino? W największym skrócie jest to bardzo mały komputer z mikrokontrolerem AVR do którego można podłączać różnego rodzaju urządzenia zewnętrzne i sterować nimi za jego pomocą.

Zanim jednak przejdziesz do dalszej części artykułu pamiętaj, że opisany w nim układ steruje napięciem sieciowym które jest niebezpieczne dla życia i zdrowia ludzkiego. Jeżeli nie masz doświadczenia poproś kogoś doświadczonego o pomoc, gdyż brak uwagi może zakończyć się śmiertelnym porażeniem prądem elektrycznym.

Co będziemy zatem potrzebować aby zacząć przygodę z Arduino? Z pewnością przyda się trochę wiedzy z zakresu podstaw elektroniki oraz samej platformy. Poniżej podaję kilka przydatnych odnośników, które pomogą się odnaleźć.

Oprócz wiedzy będziemy potrzebowali poczynić pewne zakupy, których lista znajduje się poniżej. Wszystkie te rzeczy będą nam potrzebne aby rozwiązać problem z jakim się mierzymy.

  1. https://botland.com.pl/pl/arduino-moduly-glowne/1060-arduino-uno-rev3-a000066-8058333490090.html – oryginalny moduł Arduino UNO
  2. https://botland.com.pl/pl/plytki-stykowe/56-plytka-stykowa-400-otworow.html – płytka stykowa
  3. https://botland.com.pl/pl/przewody-polaczeniowe/1223-przewody-polaczeniowe-mesko-meskie-20cm-40szt.html – przewody połączeniowe męsko – męskie
  4. https://botland.com.pl/pl/diody-led/4741-zestaw-diod-led-5mm-16szt.html – zestaw diód LED
  5. https://botland.com.pl/pl/rezystory-przewlekane/4544-rezystor-tht-cf-weglowy-14w-330-30szt.html – komplet rezystorów 330Ω
  6. https://botland.com.pl/pl/przewody-usb-a-b/2656-przewod-usb-a-b-18m.html – przewód komunikacyjny pomiędzy komputerem a płytką Arduino UNO
  7. https://botland.com.pl/pl/potencjometry/1235-potencjometr-montazowy-lezacy-5k-5szt.html – potencjometr 5kΩ
  8. https://botland.com.pl/pl/wyswietlacze-alfanumeryczne-i-graficzne/223-wyswietlacz-lcd-2×16-znakow-zielony.html – wyświetlacz LCD 2×16 znaków
  9. https://botland.com.pl/pl/rezystory-przewlekane/3973-rezystor-tht-cf-weglowy-14w-47k-30szt.html – komplet rezystorów 4.7kΩ
  10. https://botland.com.pl/pl/zasilacze-dogniazdkowe/7158-zasilacz-impulsowy-9v-2a-wtyk-dc-55-21mm-5902135147375.html – zasilacz 220V
  11. https://botland.com.pl/pl/przewody-polaczeniowe/1067-przewody-polaczeniowe-zensko-meskie-20cm-40szt.html – przewody połączeniowe żeńsko – męskie
  12. https://botland.com.pl/pl/zlacza-ark/808-zlacze-ark-kf301-raster-50mm-3-pin-.html – złącze ARK które pozwoli na wpięcie kabli z termometru do płytki stykowej
  13. https://botland.com.pl/pl/przekazniki/1997-modul-przekaznika-1-kanal-z-optoizolacja-styki-7a240vac-cewka-5v.html – moduł z przekaźnikiem do sterowania napięciem 230V
  14. https://botland.com.pl/pl/czujniki-temperatury/4582-sonda-wodoodporna-z-czujnikiem-temperatury-ds18b20-3m.html – czujnik temperatury kompatybilny z Arduino
  15. https://www.leroymerlin.pl/elektrycznosc/gniazda-wtyczki-akcesoria/wtyczki-i-gniazdka/wtyczka-katowa-wt35-unischuko-elgotech,p3782,l1059.html – wtyczka 230V
  16. https://www.leroymerlin.pl/elektrycznosc/gniazda-wtyczki-akcesoria/wtyczki-i-gniazdka/gniazdo-przedluzacza-g-10-lm-elgotech,p408,l1059.html – gniazdo 230V

Pozycje 1 – 8 możemy zastąpić zakupem całego zestawu w którym będzie kilka dodatkowych rzeczy https://botland.com.pl/pl/kursy-forbot/12642-forbot-zestaw-do-kursu-podstaw-arduino-gadzety-i-box-wersja-plus.html aczkolwiek w nieniejszym poradniku nie zostaną one wykorzystane.

Instalacja środowiska Arduino

Jeżeli skompletujemy wszystkie wymagane elementy możemy przystąpić do pracy. Zaczynamy od pobrania oraz instalacji środowiska programistycznego (tzw. IDE) ze strony https://www.arduino.cc/en/Main/Software. Oczywiście wybieramy wersję stosowną do zainstalowanego na komputerze systemu operacyjnego. Podczas instalacji potwierdzamy:

  • zapoznanie się z postanowieniami licencyjnymi (License Agreement)
  • zaznaczamy wszystkie komponenty potrzebne do prawidłowego działania (Installation Options)

Jeżeli wszystko się powiodło powinniśmy ujrzeć ekran powitalny, w drugiej kolejności edytor, choć w nowszych wersjach ekran powitalny jest pomijany i od razu widzimy ekran edytora.

picture_1.thumb.jpg.e1006f5cce2b31f512b0950d11c6ecf9.jpg

Foto: @rekawiczka

Na ekranie edytora widzimy pięć istotnych dla nas przycisków, którymi będziemy się posługiwać. Idąc od lewej strony od góry mamy:

  • Verify – weryfikacja składniowa napisanego kodu oraz kompilacja. Kompilacja polega na przetworzeniu kodu napisanego w edytorze na język zrozumiały dla procesora. W przypadku błędów zostaną one zaprezentowane w dolnej części ekranu edytora (na czarnym tle)
    Upload – wgranie pozytywnie zweryfikowanego kodu na Arduino. Aby wysłać napisany program płytka musi być podłączona do portu USB komputera. Podczas pierwszej próby wgrania kodu możemy zostać poproszeni o wybranie portu do którego wpięty jest kabel
    New – utworzenie nowego programu w edytorze
    Open – wczytanie z dysku zapisanego wcześniej programu do edytora
    Save – zapisanie programu z edytora na dysk twardy komputera

W edytorze widzimy dwie zupełnie puste funkcje:

  • setup() – odpowiada za jednorazowe wykonanie bloku komend (rozkazów) znajdujących się pomiędzy nawiasami. Funkcja ta wykorzystywana jest do wszelkiego rodzaju ustawień i wykonywana jest tylko raz,
  • loop() – odpowiada za nieskończone wykonywanie w pętli bloku komend znajdujących się pomiędzy nawiasami

Poniżej edytora jest zostawiona czarna sekcja na której będą wyświetlane komunikaty z kompilatora – np. Informacje o błędach.

Pierwszy program testowy

Mając zainstaowane środowisko możemy napisać nasz pierwszy program aby sprawdzić czy zakupiona płytka oraz kontroler działają. W tym celu otwieramy edytor i przepisujemy poniższe komendy a następnie naciskamy przycisk Verify.

picture_2.thumb.jpg.58aba261d82e058fb52dc2412b24da2b.jpg

Naciśnięcie przycisku Verify sprowduje, że zostaniemy zostać poproszeni o zapisanie naszego projektu. Możemy użyć dowolnej nazwy, np. test. Po prawidłowej weryfikacji powinniśmy ujrzeć podobny komunikat w czarnej części okna edytora.

Sketch uses 1498 bytes (4%) of program storage space. Maximum is 32256 bytes.
Global variables use 208 bytes (10%) of dynamic memory, leaving 1840 bytes for local variables.
Maximum is 2048 bytes.

Jeżeli nie ma błędów podłączamy za pomocą kabla płytkę do portu USB komputera. Pomyślne połączenie wyzwala zapalenie się dwóch diod na płytce. Zanim jednak wyślemy nasz program do Arduino z głównego menu programu wybieramy Tools a następnie Serial Monitor gdyż testowy program potrzebuje gdzieś wyświetlić komunikat.

Teraz jesteśmy gotowi aby wykonać kolejny krok jakim jest wysłanie programu do Arduino. W tym celu klikamy drugi przycisk od lewej strony czyli Upload. Następuje wysłanie naszego programu do pamięci i oraz jego uruchomienie. Jeżeli wszystko przebiegło prawidłowo powinniśmy ujrzeć poniższy komunikat.

picture_3.thumb.jpg.94f3a6e75e4bb0a1018d0815fe9787a7.jpg

Skoro wiemy już, że płytka stykowa oraz kontroler Arduino działają możemy przystąpić do właściwej części zadania.

Przygotowania

W pierwszej kolejności należy przygotować kable czujnika temperatury, aby żyłki z których zbudowany jest przewód nie rozwarstwiały się. Należy zdjąć osłonkę, aby zostało ok. 5mm odsłoniętego kabla a następnie delikatnie oblutować końcówki przewodów. Zabezpieczy to przed potencjalnym uszkodzeniem lub rozwarstwieniem żyłek. Tak przygotowany kabel wkręcamy do złącza ARK. Należy sprawdzić jak producent termometru oznacza poszczególne kable. W przypadku niniejszego artykułu oznaczenia są następujące:

  • Kabel czerwony – zasilanie 5V
  • Kabel czarny – GND
  • Kabel żółty – sterowanie

Zdjęcia poniżej obrazują całość procesu.

387950669_IMG_21962.thumb.jpg.63554f84f0066c27a98d6cbd4376597a.jpg

Foto: @rekawiczka

1216554356_IMG_21972.thumb.JPG.b67772c4a013a27691309a249b18414c.JPG

Foto: @rekawiczka

2145020005_IMG_21982.thumb.JPG.7d144c8e564c1001873b90d70173da3a.JPG

Foto: @rekawiczka

Dodatkowo musimy przygotować odpowiednio kabel 220V i podpiąć go do przekaźnika 220V. W tym celu rozcinamy jedną żyłę (tę na której mamy zasilanie) i podpinamy do przekaźnika w sposób zaprezentowany na rysunku poniżej.

IMG_2258.thumb.jpg.64ff8b153428abfb7dcaad26b5475d18.jpg

Foto: @rekawiczka

Schemat podłączenia czujnika temperatury, przekaźnika i wyświetlacza LCD

Skoro mamy już przygotowane kable możemy przystąpić do spięcia wszystkiego w jeden układ. W celu ułatwienia sprawdzenia czy nasz układ działa wykorzystana zostanie żarówka, która w docelowej instalacji zostanie zastąpiona przez grzałkę. Dodatkowo, układ będzie wyświetlał bieżącą temperaturę na wyświetlaczu LCD.

temperatura_bb.thumb.png.5822b0351491bc46f11ad76e5f5379d4.png

Foto: @rekawiczka

Rysunek przedstawia schemat podłączenia przekaźnika 220V sterującego napięciem zasilającym grzałkę, czujnika temperatury oraz diod:

  • zielonej sygnalizującej pracę grzałki
  • czerwonej sygnalizującej przekroczenie temperatury maksymalnej

Aby prawidłowo podłączyć czujnik temperatury należy sprawdzić w dokumentacji co oznaczają kolory poszczególnych kabli. W przypadku powyższego diagramu oraz zastosowanej wersji czujnika DS18B20 oznaczenia są następujące:

  • kolor czerwony – zasilanie
  • kolor czarny – GND
  • kolor żółty – sterowanie

Jeszcze kilka objaśnień:

  • do podłączenia diody używamy rezystora 330Ω
  • do podłączenia DS18B20 używamy rezystora 4.7kΩ

Zewnętrzne biblioteki

Aby przedstawiony poniżej kod źródłowy zadziałał konieczne jest dodanie do środowiska Arduino dwóch dodatkowych bibliotek – OneWire oraz DallasTemperature. Są one konieczne do prawidłowego odczytania temperatury z czujnika i bez ich instalacji operacja nie zakończy się pomyślnie . W tym celu z menu Tools wybieramy opcję Manage Libraries… i w pole wyszukiwarki wpisujemy DallasTemperature. W efekcie operacji powinniśmy zobaczyć wynik podobny do obrazka poniżej.

picture_4.thumb.jpg.82bed4146010924b955ab73da7ee38ed.jpg

W moim przypadku biblioteka jest zainstalowana, natomiast w gdyby tak nie było pojawiłby się przycisk Install, który należy kliknąć w celu instalacji zewnętrznej biblioteki. Operację powtarzamy dla OneWire. W przypadku OneWire otrzymujemy znacznie więcej wyników, jednakże należy wybrać wersję pokazaną na poniższym obrazku.

Foto: @rekawiczka

picture_5.thumb.jpg.451604b6c2b5b78c1dba7a2c14457386.jpg

Foto: @rekawiczka

Kod źródłowy

Poniższy kod realizuje logikę biznesową odpowiedzialną za załączanie grzałki jeżeli system stwierdzi, że temperatura zwrócona przez czujnik jest niższa niż ta której oczekujemy. Producent czujnika podaje, że dokładność pomiaru w w zakresie -10 °C do 85 °C wynosi +/- 0,5 °C zatem należy przy pomocy standardowego termometru wyskalować prawidłowo czujnik, tj. zaktualizować temperaturę przy której załącza się grzałka.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

/* constants */
const int GREEN_LED_PIN = 8;
const int RED_LED_PIN = 9;
const int HEATER_PIN = 10;
const int LCD_0_PIN = 2;
const int LCD_1_PIN = 3;
const int LCD_2_PIN = 4;
const int LCD_3_PIN = 5;
const int LCD_4_PIN = 6;
const int LCD_5_PIN = 7;
const float HEATING_TEMP = 25.00f;
const float ALARM_TEMP = 30.00f;

/* init */ 
OneWire oneWire(A5); 
DallasTemperature sensors(&oneWire); 
LiquidCrystal lcd(LCD_0_PIN, LCD_1_PIN, LCD_2_PIN, LCD_3_PIN, LCD_4_PIN, LCD_5_PIN);
 
void setup(void) {
  //Serial.begin(9600);
  sensors.begin();

  initPins();
  initLcd("Temp: ");

  checkSettings();
}
 
void loop(void) { 
  temperature();
  delay(500);
}

void temperature() {
  sensors.requestTemperatures(); 
  float temp = sensors.getTempCByIndex(0);
  displayTemp(temp);

  if (temp < HEATING_TEMP) {
    pin(GREEN_LED_PIN, HIGH);
    pin(HEATER_PIN, LOW);
  } else {
    pin(GREEN_LED_PIN, LOW);
    pin(HEATER_PIN, HIGH);
  }  

  alarm(temp);
}

void pin(int input, int value) {
  digitalWrite(input, value);
}

void initPins() {
  pinMode(GREEN_LED_PIN, OUTPUT);
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(HEATER_PIN, OUTPUT);

  pin(GREEN_LED_PIN, LOW);
  pin(HEATER_PIN, HIGH);

  delay(1000);  
}

void initLcd(String message) {
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print(message);
}

void displayTemp(float temp) {
  lcd.setCursor(6, 0);
  lcd.print(temp);
  lcd.print(" ");
  lcd.print((char)223);
  lcd.print("C");
}

void alarm(float temp) {
  if (temp > ALARM_TEMP) {
    pin(RED_LED_PIN, HIGH);    
  } else {
    pin(RED_LED_PIN, LOW);
  }
}

void checkSettings() {
  if (HEATING_TEMP > ALARM_TEMP) {
    lcd.setCursor(0, 1);
    lcd.print("E1");
  }
}

Konfiguracja poszczególnych PINów wykonywana jest w poniższej sekcji kodu. Jeżeli połączenia zostały wykonane zgodnie ze schematem sekcja nie wymaga zmian.

const int GREEN_LED_PIN = 8;
const int RED_LED_PIN = 9;
const int HEATER_PIN = 10;
const int LCD_0_PIN = 2;
const int LCD_1_PIN = 3;
const int LCD_2_PIN = 4;
const int LCD_3_PIN = 5;
const int LCD_4_PIN = 6;
const int LCD_5_PIN = 7;

Konfiguracja ustawień temperatury realizowana jest przez ustawienie odpowiednich wartości stałym HEATING_TEMP oraz ALARM_TEMP. Istotne jest aby na końcu wartości numerycznej była litera f.

const float HEATING_TEMP = 25.00f;
const float ALARM_TEMP = 30.00f;

W moim akwarium utrzymuje temperaturę 25 stopni Celsjusza, natomiast alarm załącza się w przypadku gdy temperatura przekroczy 30 stopni. Jeżeli ktoś chce zmienić wartość aby grzałka włączała się np. przy 24.24 stopnia należy zmienić ustawienia na poniższe.

const float HEATING_TEMP = 24.24f;

Poniżej załączam filmik prezentujący działanie całego układu.

Autor: @rekawiczka