Witam wszystkich, zaczynam zabawę z Arduino i chciałem przedstawić wam mój projekt automatycznej podlewaczki.
Użyte części :
1x Atmega 328
1x czujnik wilgotności gleby
4x opornik 220
1x opornik 1k
2x kondensator 100pf
5x dioda led
1x przekaźnik (czekam na paczkę z chin)
1x pompa wody (ja użyłem pompki z fontanny do oczka wodnego)
Do projektu dołączę jeszcze pompkę wody podłączoną przez przekaźnik (na chwilę obecną jego miejsce zajmuje czerwona dioda), tylko czekam na paczkę i całość zostanie umieszczona na płytce uniwersalnej i w obudowie. Jako źródło zasilania służy ładowarka od telefonu.
Schemat połączeń:
Ogólne założenia:
Podlewaczka co określoną ilość czasu dokonuje pomiaru wilgotności gleby, zapala diodę sygnalizującą stan gleby i gdy ziemia wymaga podlania uruchamia na 3s pompkę wody co jest sygnalizowane miganiem diody białej.
Program wykorzystuje bibliotekę Timers, by można było robić kilka zadań “jednocześnie”
Część główna programu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#include <Timers.h> int gleba = 1; int wgleby = 0; int r = 8; int y = 7; int g = 6; int w = 9; int w_stat = 1; int pompa = 11; int pomp_stat = 1; int pod = 0; int czas = 0; LimitedTimerPool timer; void setup() { Serial.begin(9600); pinMode(gleba, INPUT); pinMode(r, OUTPUT); pinMode(y, OUTPUT); pinMode(g, OUTPUT); pinMode(w, OUTPUT); pinMode(pompa, OUTPUT); digitalWrite(pompa, 1); digitalWrite(g, 0); digitalWrite(y, 0); digitalWrite(r, 0); digitalWrite(w, 0); delay(1000); digitalWrite(g, 1); digitalWrite(y, 1); digitalWrite(r, 1); digitalWrite(w, 1); delay(1000); digitalWrite(g, 0); digitalWrite(y, 0); digitalWrite(r, 0); digitalWrite(w, 0); delay(2000); digitalWrite(g, 1); digitalWrite(y, 1); digitalWrite(r, 1); digitalWrite(w, 1); odczyt(); timer.connect(0, 10000, odczyt); timer.connect(1, 1000, podlej); timer.connect(2, 500, blink); } /* * 1000-700 woda * 700-300 wilgotne * 300-0 sucho * * */ void loop() { timer.update(); } |
W miejscu timer.connect(0, 10000, odczyt) możemy zmienić interwał czasowy wykonania pomiaru.
Funkcja pomiar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
void odczyt() { pomp_stat = 1; digitalWrite(g, 1); digitalWrite(r, 1); digitalWrite(y, 1); delay(300); digitalWrite(g, 0); digitalWrite(r, 1); digitalWrite(y, 1); delay(300); digitalWrite(g, 1); digitalWrite(r, 1); digitalWrite(y, 0); delay(300); digitalWrite(g, 1); digitalWrite(r, 0); digitalWrite(y, 1); delay(300); digitalWrite(g, 1); digitalWrite(r, 1); digitalWrite(y, 1); wgleby = analogRead(gleba); // Serial.println(wgleby); if (wgleby > 0 and wgleby < 300) { //mokro digitalWrite(g, 1); digitalWrite(r, 0); digitalWrite(y, 1); pod = 0; w_stat = 1; } if (wgleby > 300 and wgleby < 700) { //dobrze digitalWrite(g, 0); digitalWrite(r, 1); digitalWrite(y, 1); pod = 0; w_stat = 1; } if (wgleby > 700 and wgleby < 1100) { //sucho digitalWrite(g, 1); digitalWrite(r, 1); digitalWrite(y, 0); pod = 1; w_stat = 1; } } |
Funkcja podlej:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void podlej() { if ( pod == 1) { pomp_stat = 0; digitalWrite(pompa, pomp_stat); czas++; // Serial.println(czas); if (czas == 3) { czas = 0; pod = 0; pomp_stat = 1; digitalWrite(pompa, pomp_stat); } } } |
Zmieniając warunek (czas == 3) możemy sterować czasem pracy pompy.
Funkcja blink:
1 2 3 4 5 6 7 8 9 10 |
void blink() { if (pomp_stat == 0) { w_stat ^= 1; digitalWrite(w, w_stat); } if (pod == 0) { w_stat = 1; digitalWrite(w, w_stat); } } |
Film pokazujący działanie prototypu:
https://youtu.be/yYszrX0KBfA
Proszę o wyrozumiałość jest to mój pierwszy projekt, gdy zapakuje wszystko na płytkę i do obudowy napewno się pochwalę :)
Fajnie, że wykorzystałeś “zwykłą” Atmegę, a nie Arduino. Gdybyś jeszcze, zamiast stosować bootloader Arduino, napisał program w języku C, byłoby już całkiem profesjonalnie. To jest wprawdzie trudniejsze, ale daje większe możliwości.
Myślałeś nad dodaniem funkcji zegara, który w nocy wyłączałby podlewanie? Słyszałem, że kwiatki w doniczkach powinno się podlewać w dzień, a nie w nocy – wtedy zachodzi fotosynteza, w której rośliny pobierają wodę (zarówno jako substrat tej reakcji, jak również w celu jej odparowywania przez liście i dzięki temu zasysania z gleby soli mineralnych). W nocy fotosynteza nie zachodzi, więc pobieranie wody jest mniejsze – jeśli gleba będzie zbyt mokra, roślinom będzie brakować tlenu (rośliny oprócz tego, że fotosyntezują, to przez całą dobę oddychają, podobnie jak ludzie i zwierzęta – oczywiście średnia wydajność fotosyntezy jest większa). Poza tym hałas pompy może przeszkadzać we śnie, zwłaszcza jeśli towarzyszy mu miganie białej diody, o której wspomniałeś (jeśli jest dość jasna). Ewentualnie zamiast zegara mógłby być jakiś fotoelement. Tylko trzeba by tak dobrać czas ostatniego podlewania w ciągu dnia, żeby kwiatki zdążyły zużyć część wody przed zapadnięciem zmroku.
pomyśle nad tym, nie mam zegara, ale fotorezystor wykorzystam
Nie szerzmy tutaj herezji. Fotosynteza zachodzi w komórkach roślinnych cały czas… W nocy mamy do czynienia z fazą niezależną od światła. Nigdy nie słyszałem, żeby woda miała jakiś negatywny wpływ na fazę niezależną od światła. Roślina sama sobie potrafi zarządzać wewnętrzną gospodarką wodną, ma do tego “urządzenia” i mechanizmy. Pozdrawiam
A zamiast tego czujnika wilgoci można użyć po prostu 2 drutów wbitych w ziemię, mam rację? Bo ten czujnik mi się wydaje niepotrzebnym kosztem(pewnie w 90% za przesyłkę lub dojazd)
czujnik od chińczyka nie całe 4zł kosztował i free wysyłka. Do projektu dodałem jeszcze fotorezystor by w nocy nie działało.
wyjawisz gdzie kupiłeś czujnik za 4 zł i free wysyłka ?
na ebayu http://www.ebay.pl/itm/Soil-Hygrometer-Moisture-Water-Sensor-Detection-Module-for-Arduino-/171989046147?hash=item280b589383:g:4hIAAOSw~bFWOdel
Nie są to tylko dwa druty wbite w ziemię, masz jeszcze płytkę z jakimś op-ampem. Choć w sumie dałoby się to zrobić w warunkach domowych na np. LM358.
Na pewno trzeba by było użyć niezginających się drutów (lub usztywnionych czymś innym) i umieścić je w stabilnym uchwycie, żeby kształt czujnika i, co za tym idzie, zależność mierzonego natężenia/oporu od przewodności właściwej gleby nie zmieniała się. Trzeba byłoby także przeprowadzić kalibrację takiego czujnika.
Przekaźnik połacz przez tranzystor.
Nie mam pojęcia co dzieje się w kodzie…
jednoliterowe zmienne g,r,y,w – totalnie nic nie mówią
a sekwencje typu zrobA, zrobB, zrobB, poczekaj, zrobA’, zrobB’, zrobC’ poczekaj proszą się o wydelegowanie do osobnych lub (lepiej) sparametryzowanych funkcji, które przynajmniej z nazwy będą mówić, co nastąpiło
Powiem tak, projekcik na początek nauki nawet fajny, działa tak jak tego chcesz, a to najważniejsze. Ale , tak jak mówili przedmówcy – popracuj nad stylem programowania. Nazwa zmiennej czy funkcji powinna informować co to i do czego służy. I najważniejsze – poważnie się zastanów nad przejściem na czysty język C, póki jeszcze nie masz złych nawyków od Arduino. Nie mówię że platforma jako taka jest zła, ale uczy np. nagminnego używania liczb zmiennoprzecinkowych, co na 8-bitowcach AVR jest w zasadzie zbrodnią.
Przypomniało mi się, jak w laboratorium mierzyliśmy przewodność jakiegoś roztworu. Używaliśmy w tym celu napięcia przemiennego, i to o wysokiej częstotliwości, żeby uniknąć elektrolizy. Ale wydaje mi się, że do pomiaru wilgotności gleby wystarczy napięcie stałe.
Ludzie ile to bierze prądu!
Trzeba urzyc picopower atmela!
zużyciem się nie martwię bo i tak z gniazdka idzie.
i używam atmegi 328p z pico wlasnie
Uważajcie na ten czujnik wilgoci. Parę miesięcy temu zrobiłem coś podobnego, i niby wszystko ok działało, aż któregoś dnia zalało mi kuchnie (i kwiatki tez). Czujnik będąc w ziemi rdzewieje, co pociąga za sobą zmianę odczytu wilgotnosci.
Warto byłoby napisać jakąś funkcję ograniczającą ilość podlań tak aby nie zalać kuchni. To stanowczo da się zrobić bez ingerencji w układ
Czy element sprawdzający wilgotność jest zasilany cały czas? Jeżeli tak to po 1 miesiącu elektroliza go „zeżre”. Zasilaj go tylko na czas pomiaru a pomiary rób co np 10 min w stanie czekania na wyschnięcie gleby