Sterownik akwarium Arduino UNO Marcin Waliłko 3 EF-DI L07
1. Arduino To platforma programistyczna dla systemów wbudowanych oparta na prostym projekcie Open Hardware przeznaczonym dla mikrokontrolerów montowanych w pojedynczym obwodzie drukowanym, z wbudowaną obsługą wejścia/wyjścia oraz standaryzowanym językiem programowania. Język programowania Arduino jest oparty na środowisku Wiring i zasadniczo na języku C/C++ (kilka prostych przekształceń kodu wykonywane przed przejściem do avr-gcc). Celem projektu Arduino jest przygotowanie narzędzi ogólnodostępnych, tanich, nie wymagających dużych nakładów finansowych, elastycznych i łatwych w użyciu przez hobbystów. Częściowo Arduino stanowi również alternatywę dla osób, które nie mają dostępu do bardziej zaawansowanych kontrolerów, wymagających bardziej skomplikowanych narzędzi. 2. Hardware Płyta Arduino składa się z 8-bitowego mikrokontrolera Atmel AVR z uzupełniającymi elementami w celu ułatwienia programowania oraz włączenia innych układów. Ważnym aspektem jest standardowy sposób, w jaki wyprowadzone są złącza, pozwalające na podłączenie płyty z mikrokontrolerem do różnych wymiennych modułów dodatkowych (nazywanych shieldami). Oficjalne płyty Arduino wykorzystują układy z serii megaavr, a konkretnie ATmega8, ATmega168, ATmega328, oraz ATmega1280 i ATmega 2560. Kilka innych układów jest wykorzystywanych w klonach Arduino. Większość płyt zawiera 5V regulator napięcia, 16 MHz rezonator kwarcowy (w niektórych odmianach rezonator ceramiczny), chociaż niektóre projekty, takie jak LilyPad działają na częstotliwości 8 MHz i rezygnują z regulatora napięcia na płycie ze względu na szczególne ograniczenia wielkości układu. Mikrokontroler Arduino jest wstępnie zaprogramowany z wykorzystaniem programu rozruchowego, co upraszcza przesyłanie programu do pamięci flash układu, w porównaniu do innych urządzeń, gdzie najczęściej potrzebny jest zewnętrzny programator mikrokontrolera. 3. Oprogramowanie Arduino IDE jest wieloplatformową aplikacją napisaną w języku Java, wydzieloną z IDE przygotowanego dla języka Processing i projektu Wiring. Środowisko jest zaprojektowane w taki sposób, aby było przyjazne dla hobbystów i osób niezajmujących się tworzeniem oprogramowania. IDE zawiera edytor kodu z takimi funkcjami jak podświetlanie składni czy automatyczne wcięcia w kodzie, oraz pozwala na kompilację i upload programu do płyty Arduino. Zazwyczaj nie ma potrzeby dodatkowej edycji plików Makefile lub uruchamiania programów z linii poleceń. Standardowo IDE Arduino zawiera bibliotekę C/C++ o nazwie "Wiring" (z projektu o tej samej nazwie), dzięki czemu wykonywanie podstawowych operacji wejścia / wyjścia staje się znacznie łatwiejsze. Programy dla Arduino są napisane głównie w języku C/C++, jednak użytkownicy muszą zdefiniować jedynie dwie funkcje, aby otrzymać gotowy do uruchomienia program:
setup() funkcja wykonywana raz, na początku działania programu, wykorzystywana najczęściej do ładowania ustawień, loop() funkcja wywoływana wielokrotnie, przez cały okres działania programu, czyli do czasu odłączenia zasilania od układu. 4. Założenia projektu Projekt ma za zadanie sterować akwarium: - sterować oświetleniem sterowanie oświetleniem jest automatyczne i zależne od pory dnia (godziny), - sterowanie grzałką sterowanie grzałką odbywa się na podstawie temperatury, poniżej zadanej temperatury grzałka pracuje w cyklu 3s+2s, aby uniknąć nadmiernego nagrzania się wody na małej objętości, ponieważ mogłoby to negatywnie wpłynąć na funkcje życiowe ryb, - pomiar temperatury obecna temperatura jest wyświetlana wyświetlaczu LCD i jest to uśredniona wartość z czujnika LM35 z okresu 200ms, - zegar możemy ustawić zegar, który jest wyświetlany na LCD, zegar jest realizowany na za pomocą funkcji millis(), 5. Elementy użyte do realizacja projektu Do realizacji projektu potrzebowałem następujących elementów: - Arduino UNO, - czujnik temp lm35dz, - wyświetlacz LCD 16x2, - 4 rezystory 100Ω, - 4 diody LED (w domyśle jedna emituje grzałkę), - przewody połączeniowe, - 2 prfzyciski, - 1 potencjometr, 6. Specyfikacji Arduino UNO Microcontroller ATmega328 Operating Voltage 5V Input Voltage (recommended) 7-12V Input Voltage (limits) 6-20V Digital I/O Pins 14 (of which 6 provide PWM output) Analog Input Pins 6 DC Current per I/O Pin 40 ma DC Current for 3.3V Pin 50 ma Flash Memory 32 KB (ATmega328) of which 0.5 KB used by bootloader SRAM 2 KB (ATmega328) EEPROM 1 KB (ATmega328) Clock Speed 16 MHz Length 68.6 mm Width 53.4 mm Weight 25 g
Schemat podłączenia w programie fritzing 7. Program #include <LiquidCrystal.h> LiquidCrystal lcd(12,11,5,4,3,2); float temp=0; // temperatura akwarium char czujnik = 0; // pin na czujnik char flag=0; //flaga pomocnicza przy ustalaniu ogrzewania akwarium unsigned long pom=0, pom2; // zmienna pomocnicza przy ogrzewaniu akwarium static unsigned long lasttick = 0; //zmienna pomocnicza do wyliczania czasu unsigned long ss=0, pom4=0; // czas w sekundach, chyba lepsza opcja niz kazdorazowe wyliczanie czasu unsigned long suma=0; unsigned int licznik=0; int tempa=0; unsigned char second=0, minute=0, hour=0; //zmienne czasu char diod_1=6, diod_2=9, diod_3=10; //piny do oswietlenia char grzalka=13; // pin grzałki char hourbutton = 8, minutebutton = 7; // piny przycisków char diodapin = 8; // to już jest dla nas jasne :) char potpin = 0; // przypisujemy do zmiennej numer wejścia analogowego void setup() { pinmode(hourbutton, INPUT_PULLUP);
pinmode(minutebutton, INPUT_PULLUP); pinmode(diod_1, OUTPUT); pinmode(diod_2, OUTPUT); pinmode(diod_3, OUTPUT); pinmode(grzalka, OUTPUT); lcd.begin(16,2); lcd.print("sterownik"); lcd.setcursor (0,1); lcd.print("akwarium"); delay(500); void loop() { if (millis() - lasttick >= 1000) { lasttick = millis(); second++; ss++; if (second >= 60) { minute++; second = 0; if (minute >= 60) { hour++; minute = 0; if (hour >= 24) { hour = 0; if (millis() - pom4 >= 200) { pom4 = millis(); if(digitalread(minutebutton)==0) { minute++; // ustawianie czasu if(digitalread(hourbutton) == 0) hour++;lcd.clear(); if(hour <10){ lcd.print("0"); lcd.print(hour); else lcd.print(hour); lcd.print(":"); if(minute <10){ lcd.print("0"); lcd.print(minute); else lcd.print(minute); lcd.print(":"); if(second <10){ lcd.print("0"); lcd.print(second); else lcd.print(second); suma=suma/licznik; temp=(suma*4.8511*100)/1024; // wartosc wysnaczona eksperymetalnie na podstawie innego temometru suma=0;
licznik=0; lcd.setcursor(0,1); lcd.print("temp: "); lcd.print(temp); licznik++; tempa = analogread(czujnik); suma=suma+tempa; if (temp<27 && flag==0) { //warunek w ktorym ustawiamy temperature w akwarium flag=1; pom=ss; digitalwrite(grzalka, 1); if (ss-pom==3) {digitalwrite(grzalka, 0); //warunek ile caszu grzałka bedzie grzać w sekundach pom2=ss; if (ss-pom2==2) flag=0; // warunek ile czasu grzłka nie będzie grzać w sekundach if(hour>=6 && hour <18){ //ustalenie jak ma pracowac oswietlenie akwarium digitalwrite(diod_1, 0); digitalwrite(diod_2, 0); digitalwrite(diod_3, 1); else if(hour>=18 && hour <=23){ digitalwrite(diod_1, 1); digitalwrite(diod_2, 0); digitalwrite(diod_3, 0); else{ digitalwrite(diod_1, 0); digitalwrite(diod_2, 1); digitalwrite(diod_3, 0); 8. Link do filmu obrazującego działanie: https://www.youtube.com/watch?v=7-1c38wnnne