Nawadnianie trawnika

Chciałbyś coś zrobić, ale nie wiesz jak? Pytaj śmiało.
bartisss
Młodszy majsterkowicz
Posty: 2
Rejestracja: 9 mar 2012, 15:32

Nawadnianie trawnika

Post autor: bartisss » 9 mar 2012, 15:37

Witam , właśnie szukam jakiegoś pomysłu na zdalne sterowanie podlewania ogródka wodą . Myślę nad zastosowaniem elektrozaworu i jakiegoś programatora czasowego . Chyba że można to zrobić innym sposobem ;) Albo nawet podlewanie w szklarni gdy spadnie poziom wilgotności :)

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Łukasz
Administrator
Posty: 667
Rejestracja: 12 lis 2011, 09:42
Lokalizacja: Zielona Góra
Kontakt:

Nawadnianie trawnika

Post autor: Łukasz » 9 mar 2012, 18:23

A właśnie dzisiaj mi żona mówiła o czymś podobnym :)

Pomysł mam taki - zaangażować do tego mikrokontroler zaprogramowany w Arduino i na podstawie godziny oraz pomiarów z czujnika temperatury (żeby nie podlewać w czasie upałów) oraz czujnika wilgotności (żeby nie podlewać, jak jest mokro, czy pada deszcz) sterować pracą elektrozaworu :)
Życie jest za krótkie, żeby nie majsterkować...
bartisss
Młodszy majsterkowicz
Posty: 2
Rejestracja: 9 mar 2012, 15:32

Nawadnianie trawnika

Post autor: bartisss » 9 mar 2012, 19:14

Mądrę ;D a ja myślałem o przerobieniu programatora czasowego np takiego Obrazek


I do tego podpiąć elektrozawór , cena takiego programatora to zaledwie 20 pln
fish99
Młodszy majsterkowicz
Posty: 8
Rejestracja: 19 gru 2011, 15:09

Nawadnianie trawnika

Post autor: fish99 » 11 mar 2012, 11:30

tez sie nad czyms takim zastanawialem ;), kwestia jeszcze jakiegos ukladu rurek pod ziemia i sterowania tym na podstawie temperatury albo wigotności ziemi widziałem kiedyś takie czujniki w kwiatkach. Taki elektrozawór zapewne tani nie jest? ;)
franek
Młodszy majsterkowicz
Posty: 2
Rejestracja: 9 mar 2012, 22:08
Kontakt:

Nawadnianie trawnika

Post autor: franek » 13 mar 2012, 14:18

Może użyjecie routera? Niektórym to router podlewa ogródek ;D
Awatar użytkownika
Michlax
Młodszy majsterkowicz
Posty: 48
Rejestracja: 12 mar 2012, 22:14
Lokalizacja: Częstochowa

Nawadnianie trawnika

Post autor: Michlax » 13 mar 2012, 18:39

Planuję za pomocą arduino zaprojektować mini system nawadniania małej szklarni ogródkowej. Z programem sobie poradzę ale mam pytanie, czy na blogu pojawi się artykuł w jaki sposób przenieść projekt z arduino na osobną Atmegę? Wtedy można by taki system skonstruować za grosze :)
Awatar użytkownika
Łukasz
Administrator
Posty: 667
Rejestracja: 12 lis 2011, 09:42
Lokalizacja: Zielona Góra
Kontakt:

Nawadnianie trawnika

Post autor: Łukasz » 16 mar 2012, 01:01

[quote=Michlax]czy na blogu pojawi się artykuł w jaki sposób przenieść projekt z arduino na osobną Atmegę?[/quote]
No oczywiście :) I to już niedługo pokażę, jak to robić :)

[quote=fish99]Taki elektrozawór zapewne tani nie jest? ;)[/quote]
Tak na pierwszy rzut oka widzę, że ceny zaczynają się od 80zł, więc bez tragedii. Pewnie jak by dobrze poszukać, to i za połowę tego udało by się znaleźć :)
Życie jest za krótkie, żeby nie majsterkować...
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 6 lis 2013, 14:59

Witam wszystkich
Odgrzebuję temat bo sam biorę się za takie nawadnianie. Ma być dość prosto zrobione. Mam elektrozawór od pralki za 25 zł doskonały do tego celu. Zapakowany jest w puszkę elektryczną hermetyczną i już podłączony do wypływu wody w ogrodzie. Największe kłopoty sprawia mi programowanie i tu liczę na pomoc kolegów z forum. Widziałem wpisy kogoś kto był programistą za to nie znał się na elektronice. Ktoś taki by mi pewnie pomógł w przysłowiowe "pięć minut"

Nie chcę jednak żeby był to prosty zegar czasowy bo on jest "durny" i podlewa nawet jak cały dzień padał deszcz.
Z grubsza chodzi oczywiście o to żeby nie podlewać jeśli w ciągu ostatniej doby były opady deszczu.

Kupiłem czujnik wilgotności oraz zespół dwóch przekaźniczków do płytki Arduino.
Do tej pory nauczyłem się zaledwie sterować włączaniem się przekaźnika gdy czujnik jest suchy a także miganiem diody (gdy sucho).
Zrobiłem to żeby nauczyć się wstępnie programowania bo jestem zielony (jak każdy kto kiedyś zaczął). Mam dopiero niecały miesiąc więc jestem malutki :-)

Na tym etapie myślę że warto zapytać kolegów o koncepcję ogólną programu. Chodzi o to żeby nie tworzyć niepotrzebnych rzeczy które potem się wyrzuci do kosza (chociaż zdaję sobie sprawę że i tak pewnie sporo w koszu wyląduje).
Nie wiem na przykład czy potrzebne jest dołączenie zegara czasu rzeczywistego na osobnej płyteczce.... itd

Założenia mam ogólnie takie :
1 - Program działa w pętli dobowej i bada opady deszczu uzależniając od tego podlewanie ogródka.
2 - Konieczne będzie badanie ilości opadów ale w sposób w miarę uproszczony. Program musi natomiast jakoś zliczać czas trwania okresu kiedy jest mokro i na tej podstawie decydować czy podlewamy.
3 - mogą być zadane jakieś stałe okresy podlewania (wcześniej kupiłem zwykły zegar elektroniczny aby ustawić np 3 cykle podlewania w ciągu dnia) ale uzupełnione o te warunki że jeśli uznamy że było niedawno dosyć mokro to nie trzeba podlewać.
4 - Na wyjściu przekaźnika umieszczam zwykły elektrozawór od pralki który kupiłem za 25 zł i jest już zamontowany w ogrodzie w wodoszczelnej puszce elektrycznej :-)

Poniżej zamieszczam kod o którym wspomniałem napisany na podstawie przykładu zamieszczonego na innym forum w poradniku programowania

Kod został utworzony w celach nauki programowania a więc nie chodzi o to żeby sie na nim opierać. Przedstawiam go żeby było widać co do czego podłączyłem.

Proszę po prostu o podpowiedzi jak się za temat zabrać od strony programistycznej.

Kod: Zaznacz cały

 int czujnikPin = 1;    //  czujnik na pin 1
 int ledPin = 13;  // ustawiamy diode na pin 13
 int przekaznikPin = 10;    //  przekaznik na pin 10
 
 void setup() 
 {
      pinMode(czujnikPin, INPUT);  // pin 1 jako wejście
      pinMode(ledPin, OUTPUT);   //pin 13 jako wyjście
      pinMode(przekaznikPin, OUTPUT); // pin 10 jako wyjscie 
      digitalWrite(przekaznikPin, HIGH); // ustawienie pinu przekaznika w stanie wysokim poprzez rezystor podciagajacy
      // bo przekaznik sterowany jest stanem niskim 
}
void loop()
{
   if (digitalRead(czujnikPin) == HIGH)  //sprawdź czy na pinie 1 jest stan wysoki (sucho)
   { 
   digitalWrite(przekaznikPin, LOW); // włącz przekaźnik aby podlewać (przekaźnik włącza się stanem niskim)
   digitalWrite(ledPin, HIGH);  // włacz diodę (migamy diodą bo jest sucho)
   delay(500);
   digitalWrite(ledPin, LOW);  // wyłacz diodę
   delay(500);
   }
   else
   {
   digitalWrite(przekaznikPin, HIGH); // wyłącz przekaźnik
   digitalWrite(ledPin, LOW);  // wyłacz diodę
   }
}
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 13 lis 2013, 18:58

Zmagań ciąg dalszy.

Myślę nad pętlą czasu mniejszą niż cała doba.
Chyba będę podlewał co 6 godzin. Myśle że godzina podlewania wystarczy (linia kropelkowa a więc woda się sączy).
Cykl ma się powtarzać co 6 godzin i w ten sposób ziemia będzie podlana 4 razy w ciągu doby.

Pomiędzy podlewaniami będę sprawdzał co 10 minut czy ziemia jest wilgotna. Jeśli np było mokro 6 razy po 10 minut no to nie trzeba podlewać bo to właśnie godzina mokrości.

Męczę się teraz nad "licznikiem" czyli prostym fragmentem programu który będzie zliczał te impulsy (czujnik daje logiczną jedynkę gdy jest mokro).
Licznik ma zliczyć co najmniej 6 impulsów wysokich co będzie oznaczało że przynajmniej 6 razy po 10 minut było mokro. Myślę że nie ma znaczenia kiedy to mokrość wystąpi w ciągu okresu 6 godzin.
Jeśli zliczy minimum 6 impulsów to NIE PODLEWA a w przeciwnym razie podlewa przez godzinę.

Program powinien chyba przez 5 godzin zajmować się tylko sprawdzaniem stanu wilgotności i zliczaniem tych impulsów a następnie przez godzinę podlewać.
Może to być prosta pętla i nie musi mieć żadnych wówczas skomplikowanych przerwań. Można chyba zastosować wówczas zwykłe "delay".
Trzeba by jakoś "zerować" co 10 minut czujnik wilgotności no bo jeśli będzie ciągle mokry to nie nastąpią impulsy co 10 minut tylko jeden impuls będzie trwał w nieskończoność...

Jeśli ktoś może pomóc w przełamaniu impasu w programowaniu to będę wdzięczny.
Mam wrażenie że poszukuję od paru dni informacj w necie jak rozwiązać trywialny temat
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Nawadnianie trawnika

Post autor: cube » 13 lis 2013, 22:13

delay(); odpada na starcie. To można użyć na parę milisekund, ale nie na 10min. Do twoich założeń musisz wykorzystać bibliotekę timers lub zewnętrzny zegar czasu rzeczywistego http://playground.arduino.cc/Code/Timer#Examples
Czujniki wilgotności podają wynik jako wartość napięcia, do odczytania przez wejścia analogowe A0-A7. Osobiście nie widziałem go na oczy, ale na ebay są dość popularne. Z angielskiego to "Moisture sensor". Tu masz przykład zastosowania: http://www.dfrobot.com/wiki/index.php?t ... SEN0114%29
Ja proponuję nie żadne zliczanie tylko standard: mokro=nie podlewać/ sucho=podlewać. Czujniki zastosować ze trzy. Co 10min odczytywać trzykrotnie wartość każdego z podłączonych czujników analogRead();. AnalogRead() poda Ci wynik z przedziału 0-1023. Następnie zrobić warunek, że jeśli wartość średnia z odczytu spadnie poniżej jakiejś tam wartości (np. poniżej 300), załączać przekaźnik otwierający elektrozawór. Po kolejnych 10min wykonać ponowny pomiar wilgotności i wysterować elektrozawór.
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 14 lis 2013, 08:46

Dzięki za podpowiedzi.

Podpowiadano mi że taki mój najprostszy cykl można oprzeć na delay... Czy na pewno nie da się ?

Bibliotek jeszcze nie rozumiem. Jak widzę są zawsze w nich dwa pliki i kiedy je oglądam to nie mogę skumać jak to działa więc na razie chcę napisać naprawdę prymitywny mechanizm.
cube pisze:Ja proponuję nie żadne zliczanie tylko standard: mokro=nie podlewać/ sucho=podlewać.
Nie chcę robić warunku że jak "mokro=nie podlewać/ sucho=podlewać. " bo takie podlewanie powoduje że ciągle jest mokro :-) zresztą to mogę sobie zrobić zblokowując czujnik wraz z płytką przekaźnikową (testowałem i działa).

Mój czujnik ma wyjście i analogowe i cyfrowe. Skoro ma cyfrowe to chcę się na nim oprzeć bo mi łatwiej myśleć na moim etapie.
Poniżej wklejam fotkę tego czujnika i zespołu dwóch przekaźników (wykorzystuję tylko jeden)

Chodzi niestety o to że chcę podlewać tylko przez np godzinę co 6 godzin. Pomiędzy podlewaniami muszę sprawdzić ile czasu było mokro.

Kombinuję ze zliczaniem stanu czujnika mierzonego co 10 minut bo np 6 takich stanów "mokro" da mi informację że przez godzinę był deszcz więc nie trzeba podlewać

Co do samego czujnika (te "wąsy" z płytki drukowanej) to raczej zamienię to docelowo w coś własnej konstrukcji bo to tutaj to zabawka. Gdybym chciał zakopać to w ziemi to piny któe z tego wychodzą były by ciągle mokre bo sa za blisko siebie... O sprawie myśle naprawdę poważnie bo wysychają mi metry żywopłotu posadzonego w tym roku...

Cube - Popatrzyłem na ten przykład który podajesz z biblioteką Timers
cube pisze: Do twoich założeń musisz wykorzystać bibliotekę timers lub zewnętrzny zegar czasu rzeczywistego .....playground.arduino.cc/Code/Timer#Examples
i być może dam radę to zastosować bez konieczności zrozumienia całości.
IMG_1293.JPG
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony 14 lis 2013, 10:51 przez Procent, łącznie zmieniany 1 raz.
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Nawadnianie trawnika

Post autor: cube » 14 lis 2013, 10:34

Co do czujnika - przylutuj na stałe jakiś kabel 3x0,5 zamiast goldpinów i zalej klejem na ciepło/żywicą. Nic nie przesiąknie.
Biblioteki - to nic trudnego. To dodatkowy zestaw funkcji. Ściągasz z internetu pliki biblioteki, rozpakowujesz je do odpowiedniego katalogu. Arduino 1.0.5 ma już chyba możliwość ściągnięcia biblioteki samemu, nie jestem pewien, mam jeszcze ide 1.0.2. Następnie ją importujesz, poprzez którąś z pozycji menu arduino lub poprzez wpisanie na samym początku #include <Timers.h>. Tutaj instrukcja: http://arduino.cc/en/Guide/Libraries
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 14 lis 2013, 13:13

Nie no - ściąganie bibliotek to mam już spoko opanowane. Gorzej ze zrozumieniem jak z nich korzystać :-)

Na przykład jak podłączę sobie zegar czasu rzeczywistego jak tu (zamówiłem) .... allegro.pl/modul-rtc-ds1307-evb-arm-avr-pic-arduino-i3705868943.html (cholera nie mogę wklejać linków :-/ )
to czy będę MUSIAŁ odwoływać się w funkcjach do niego ? Znowu bym musiał się uczyć takiego odwoływania

Czy też po prostu mogę korzystać z tej biblioteki którą podałeś bez kombinowania z kolei z tym zegarem - funkcje z przykładu są dość przejrzyste i chętnie się tym zajmę
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Nawadnianie trawnika

Post autor: cube » 14 lis 2013, 14:36

Wszystko zależy od tego, w jaki sposób podejdziesz do problemu. Jeśli istotne jest dla Ciebie podlewanie o 6:37, 11:21, 16:12 czy 22:43 to powinieneś zastosować RTC. On, mając podtrzymanie zasilania, po włączeniu wie która jest godzina i kontroler, na podstawie tej informacji, wykonuje daną czynność. Nawet jeśli odłączysz na tydzień urządzenie od prądu, to po włączeniu kontroler nadal będzie podlewać o tej samej godzinie. Oczywiście bateria podtrzymania w module RTC musi być.
Jeśli natomiast wystarczy Ci, że kontroler sprawdzi wilgotność co godzinę i włączy lub wyłączy podlewanie oraz jest to Ci obojętne czy będzie to o 12:12 czy o 12:32, byle za godzinę ponownie to zrobił - starczy biblioteka timers lub metro.
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 14 lis 2013, 14:50

Dzięki cube
Zegar już zamówiłem więc i tak w końcu się nim zajmę :-) Podejrzewam niestety że będę miał więcej komplikacji z kodem gdy go użyję ? Czy może ma on związek z biblioteką Time ?
(Uwaga bo jest też Timers i nie wiem o którą dokładnie Ci chodzi)

Nie jest mi na razie potrzebne podlewanie dokładnie o określonej godzinie.
Raczej chodzi o to żeby nie zaniedbać podlewania czyli żeby automat podlewał co 6 godzin. Nieważne o której.
Ważne trochę natomiast żeby nie lał wody bez sensu skoro padało przed godziną :-)
Z Twojego postu rozumiem że używając biblioteki Time wystarczy mi korzystać z tych przykładów na wykonaniu 10 minutowego delay.

Natomiast jeszcze nie umiem dokładnie stworzyć sobie programu. Na razie staram się zdefiniować jakąś zmienną do pamiętania odczytów z czujnika co 10 minut i ich zliczania. Potem powinienem zrobić warunek że po 5 godzinach podlewam przez godzinę (jeśli czujnik nie był mokry więcej niż 6 razy)...
Następnie powtarzam pętlę od początku
maglo18
Majsterkowicz
Posty: 119
Rejestracja: 25 wrz 2013, 12:06

Re: Nawadnianie trawnika

Post autor: maglo18 » 14 lis 2013, 14:57

Kibicuję Ci i będę śledził wątek ponieważ mój stan wiedzy jest podobny i do wiosny planuje zrobić coś podobnego.
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Nawadnianie trawnika

Post autor: cube » 14 lis 2013, 16:05

Procent pisze:Dzięki cube
Zegar już zamówiłem więc i tak w końcu się nim zajmę :-) Podejrzewam niestety że będę miał więcej komplikacji z kodem gdy go użyję ? Czy może ma on związek z biblioteką Time ?
(Uwaga bo jest też Timers i nie wiem o którą dokładnie Ci chodzi)

Nie jest mi na razie potrzebne podlewanie dokładnie o określonej godzinie.
Raczej chodzi o to żeby nie zaniedbać podlewania czyli żeby automat podlewał co 6 godzin. Nieważne o której.
Ważne trochę natomiast żeby nie lał wody bez sensu skoro padało przed godziną :-)
Z Twojego postu rozumiem że używając biblioteki Time wystarczy mi korzystać z tych przykładów na wykonaniu 10 minutowego delay.

Natomiast jeszcze nie umiem dokładnie stworzyć sobie programu. Na razie staram się zdefiniować jakąś zmienną do pamiętania odczytów z czujnika co 10 minut i ich zliczania. Potem powinienem zrobić warunek że po 5 godzinach podlewam przez godzinę (jeśli czujnik nie był mokry więcej niż 6 razy)...
Następnie powtarzam pętlę od początku
Cały czas mówię o bibliotece timers lub metro. Do zadań jak wyżej, opierających się na interwałach a nie na czasie rzeczywistym, jest wystarczająca.
Rozumiem, że wolisz odczyt zerojedynkowy, tzn mokro-sucho. Nie wiem czemu, ale ok. W takim razie zrób najprościej:

Kod: Zaznacz cały

(...) //jakieś tam includy
int a=0;
(...) //jakiś tam kod
if (digitalRead(pin)==HIGH){a++;} //jeśli stan pinu jest wysoki (mokro), powiększ zmienną a o 1
if (digitalRead(pin)==LOW){a--;}//jeśli stan pinu jest niski (sucho), pomniejsz zmienną a o 1
(...) //jakiś tam kod
if (a<=1){podlewać}
else{nie podlewać}
odczyt z czujników ubrałbym w oddzielną funkcję, dla przejrzystości kodu http://arduino.cc/en/Reference/FunctionDeclaration
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 14 lis 2013, 20:46

Zatem dzisiaj posunąłem się o "tiptopek" do przodu.

cube - chyba jednak chodzi o bibliotekę Timer a nie Times (dawałeś mi link do Timer na stronie Arduino) i ona mi się bardzo podoba ale to na później.
Jak możesz to daj jeszcze raz link.Mam ściągniętą bibliotekę Time, Timers ale nie Timer....

Dzięki jeszcze raz za asystę :-) dzięki temu posuwam się do przodu (chociaz czuję się jak górnik w Chile)

maglo18 - świetnie - zamierzam dobrnąć do końca bo po to to kupiłem (chociaż robię jednocześnie na tym sterowanie silnikiem krokowym)


Napisałem kawałek kodu który ma zliczać impulsy i od tego uzależniać włączenie lub wyłączenie przekaźnika. Na początek miało zliczać co 5 sekund żebym mógł szybko pobawić się wyjmując czujnik ze szklanki z wodą
Dodałem zatem "licznikCzujnika" i "led" abudowany w Arduino żeby mi wskazywał kiedy skończy się czas obserwowania czujnika

Taka pętla powinna powstać (najprymitywniejsza ofkors) dla 5 godzin obserwacji czujnika a potem 1 godziny podlewania (jeśli nie było mokro dłużej niż 6 x na 10 minut (czyli godzinę mokro)

To co napisałem działa ale nie do końca.
Wtykam kabel USB do kompa żeby zasilić płytkę z poniższym kodem. Czujnik zamoczony jest w wodzie. Program czeka parę sekund, błyska moją diodą na pinie 13 i ... włącza przekaźnik.
Potem TRZY razy błyska diodą czyli pokonuje pętelkę zliczania impulsów i WYŁĄCZA PRZEKAŹNIK no bo czujnik jest mokry a więc pewnie - zlicza 3 impulsy które zadałem w programie i stwierdzając że jest mokro - nie podlewa.\

Niestety dalej próbuję wyjąć czujnik z wody i tu ... program się chyba zatrzymuje bo dioda na pinie 13 przestaje błyskać co 5 sekund i nic się nie zmienia.

Włożenie czujnika z powrotem do wody powoduje wznowienie błyskania diodą i pewnie zliczanie impulsów

Całą sprawę trochę komplikuje mi budowa czujnika i przekaźnika. Czujnik pokazuje stan niski jak jest mokro i przekaźnik włączany jest za pomocą stanu niskiego .... to mi miesza w łepetynie

No a oto kod "Zdziś"

Kod: Zaznacz cały

 //zmienne których wartości są zawsze te same:
 const int czujnikPin = 1;    //  czujnik na pin 1
 const int przekaznikPin = 10;    //  przekaznik na pin 10
 int led = 13; // dioda sygnalizujaca koniec czasu mierzenia
 
 //zmienne których wartości będą się zmieniać:
int licznikCzujnika = 0;   //  definiujemy zmienna - licznik ile razy został włączony czujnik wilgotnosci

 
 void setup() 
 {
      pinMode(czujnikPin, INPUT);  // ustawiamy pin 1 jako wejście
      pinMode(przekaznikPin, OUTPUT); // ustawiamy pin 10 jako wyjscie 
      digitalWrite(przekaznikPin, HIGH); // ustawienie pinu przekaznika w stanie wysokim poprzez rezystor podciagajacy
      // bo przekaznik sterowany jest stanem niskim 
      pinMode(led, OUTPUT); 
}
void loop()
{
     if (digitalRead(czujnikPin)==LOW) // jeśli stan czujnika jest niski (czyli jest mokro)
    {
    licznikCzujnika++;// zwiekszamy licznik czujnika o jeden
     delay(5 * 1000);// przerwa 5 x sekunda aby szybko potestowac, tu trzeba bedzie dac przerwe czasowa 10 minut za pomoca biblioteki Time
     digitalWrite(led, HIGH);   // turn the LED on  - migniecie dioda zeby bylo widac uplyw czasu
     delay(1000);               // wait for a second
     digitalWrite(led, LOW);    // turn the LED off 
     delay(1000);               // wait for a second
    } 

    if (licznikCzujnika<=3)  //sprawdź czy co najmniej 3 razy było mokro
    {
      digitalWrite(przekaznikPin, LOW); // jeśli mokro było mniej niż 3 razy - włącz przekaźnik (przekaźnik włącza się stanem niskim)
   }
   else
   {
   digitalWrite(przekaznikPin, HIGH); // wyłącz przekaźnik
   }
}
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Nawadnianie trawnika

Post autor: cube » 14 lis 2013, 22:16

Cały czas mówię i myślę o bibliotece TIMER.

Wg linku, który podawałem wcześniej, ten typ czujnika ma wyjście analogowe. Na upartego można go odczytywać cyfrowo. Ale wtedy mokro = stan wysoki na wejściu; sucho = stan niski. Tworzy to pewien problem. Zerknij jeszcze raz na ten link: http://www.dfrobot.com/wiki/index.php?t ... SEN0114%29
Zauważ że maksymalne napięcie wyjściowe z czujnika, podane jest jako 4,2V. Atmega widzi stan wysoki jeśli na wejściu jest napięcie 3V lub wyższe (przy zasilaniu 5V). Teoretycznie powinieneś czujnik odczytywać analogowo, czyli poprzez analogRead(). analogRead() ma rozdzielczość 1024 stanów napięcia wejściowego (a nie dwa jak digitalRead()), tzn jest w stanie rozróżnić wartość napięcia co 4,8mV. 4,2V/0,0048V=875. W linku jest podane że wartość 875 jest w zakresie "in water" czyli czujnik zanurzony w wodzie. 3V/0,0048=625. 625 jest w zakresie "humid soil" czyli "gleba wilgotna". 2,9V nadal jest w zakresie "humid soil" ale to już jest poniżej 3V i atmega widzi stan niski. Niby to niewielka zmiana wilgotności (czyli napięcia na wejściu) a jednak procek interpretuje je jako dwa przeciwne stany skrajne - cholernie mokro i bardzo sucho. Dlatego powinieneś odczytywać wartość czujnika poprzez analogRead().

delay(5*1000) powinien być poza funkcją warunkową IF! Spójrz na kod jeszcze raz i powiedz, który fragment kodu zostanie pominięty, jeśli digitalRead(czujnikPin)==HIGH?
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 15 lis 2013, 09:07

cube - skłaniasz mnie faktycznie do przejścia na analogowy odczyt. Nie zająłem się tym bo mam wrażenie że łatwiej mi na zerojedynkach aby "łyknąć" na początek o co chodzi w programowaniu arduino. Natomiast mam wrażenie że i tak skończy się to na łądnym odczycie, przerwaniach i bibliotece TIME (zegar raczej sobie wykorzystam gdzie indziej)
cube pisze:
delay(5*1000) powinien być poza funkcją warunkową IF!
Wywaliłem zatem delay poza funkcję IF
to samo zrobiłem z mignięciem diodą
Poprawiło to sytuację o tyle że dioda miga niezależnie od tego czy czujnik jest w wodzie czy nie a zatem program się nie zatrzymuje.
Po uruchomieniu (czujnik w wodzie) program 5 sekund czeka i mignie sobie diodą oraz włącza przekaźnik (no bo jeszcze nie zdążył chyba policzyć do trzech :-) )

Potem 3 razy po 5 sekund sobie idzie i zlicza - wyłączając przekaźnik (no bo stwierdza że 3 x było mokro więc nie podlewamy

Wyciągam czujnik z wody i ... nic się potem nie zmienia
cube pisze: Spójrz na kod jeszcze raz i powiedz, który fragment kodu zostanie pominięty, jeśli digitalRead(czujnikPin)==HIGH?
Nie bardzo wiem o co Ci chodzi bo u mnie jest LOW a nie HIGH w tej funkcji (czujnik jest LOW gdy jest sucho) - próbuję zliczać ile czasu była ziemia mokra


Kod: Zaznacz cały

 //zmienne których wartości są zawsze te same:
 const int czujnikPin = 1;    //  czujnik na pin 1
 const int przekaznikPin = 10;    //  przekaznik na pin 10
 int led = 13; // dioda sygnalizujaca koniec czasu mierzenia
 
 //zmienne których wartości będą się zmieniać:
int licznikCzujnika = 0;   //  definiujemy zmienna - licznik ile razy został włączony czujnik wilgotnosci

 
 void setup() 
 {
      pinMode(czujnikPin, INPUT);  // ustawiamy pin 1 jako wejście
      pinMode(przekaznikPin, OUTPUT); // ustawiamy pin 10 jako wyjscie 
      digitalWrite(przekaznikPin, HIGH); // ustawienie pinu przekaznika w stanie wysokim poprzez rezystor podciagajacy
      // bo przekaznik sterowany jest stanem niskim 
      pinMode(led, OUTPUT); 
}
void loop()
{
     if (digitalRead(czujnikPin)==LOW) // jeśli stan czujnika jest niski (czyli jest mokro)
    {
    licznikCzujnika++;// zwiekszamy licznik czujnika o jeden
    } 
     delay(5 * 1000);// przerwa 5 x sekunda aby szybko potestowac, tu trzeba bedzie dac przerwe czasowa 10 minut za pomoca biblioteki Time
     digitalWrite(led, HIGH);   // turn the LED on  - migniecie dioda zeby bylo widac uplyw czasu
     delay(500);               // wait 1/2 second
     digitalWrite(led, LOW);    // turn the LED off 
     delay(500);               // wait 1/2 second
     
    if (licznikCzujnika<=3)  //sprawdź czy co najmniej 3 razy było mokro
    {
      digitalWrite(przekaznikPin, LOW); // jeśli mokro było mniej niż 3 razy - włącz przekaźnik (przekaźnik włącza się stanem niskim)
   }
   else
   {
   digitalWrite(przekaznikPin, HIGH); // wyłącz przekaźnik
   }
}
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Nawadnianie trawnika

Post autor: cube » 15 lis 2013, 10:57

Pokaż dokładne zdjęcie, model i link, skąd masz czujnik. Bo ciągle mam wrażenie odczytujesz go błędnie. Moim zdaniem duża wilgotność to stan wysoki a nie niski, jak ciągle u Ciebie!

Z tym "digitalRead(czujnikPin)==HIGH?" to była zagadka do poprzedniego kodu, gdy delay był wewnątrz funkcji warunkowej. Jeśli stan był niski to fragment kodu z delay się wywoływał. Ale jeśli stan zmieniał się na przeciwny, cały delay zostawał pominięty i ciągle wywoływał się kod odpowiedzialny za przekaźniki.
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 15 lis 2013, 12:29

Czujnik to yl-69 (sama płyteczka a więc raczej mało ważna)
natomiast do tego podpięty jest układ yl-38 z czterema wyjściami. Ma na grzbiecie scalaczka LM393
można to zobaczyć na allegro /modul-z-czujnikiem-wilgotnosci-gleby-ziemi-i3679946288.html
Widzę że moduł jest opisywany jako photosensitive sensor (gdy ma podłączona zamiast czujnika wilgotności diodę (pewnie foto)
tu ....... wayengineer . com /index.php?main_page=product_info&products_id=1084

kiedy cholera będę mógł linki wklejać???

Sprawdziłem jeszcze raz woltomierzem co z niego wychodzi jak jest mokro i sucho.
Zanurzony w zimnej kranówie daje około 2,2 V a wynurzony całkowicie daje prawie 5V (4,98) a więc niestety stan wysoki gdy jest sucho.
Trochę inne ma odczyty w gorącej i kwaśnej herbacie :-) - Całkiem zanurzony w herbacie ma 1,7V a granicę 2,2 dopiero gdzieś w połowie czujnika hehe.
Codzienne zmagania:
http://www.ertec.pl/
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Nawadnianie trawnika

Post autor: cube » 15 lis 2013, 12:50

To sporo tłumaczy. LM393 jest tam zastosowane w konfiguracji odwracającej, stąd moje wątpliwości. Jakoś umknął mi ten układ wcześniej. To spróbuj teraz ściągnąć bibliotekę i napisać kod, czy tam z cyfrowym, czy tam analogowym odczytem. Oczywiście dla prób daj interwał 10s a nie godzinę. Wątpliwości rozwiane, to już nie wygląda na skomplikowany program.
Polecam, od razu, zapoznać się z tworzeniem podfunkcji w kodzie: http://arduino.cc/en/Reference/FunctionDeclaration
Znakomicie ułatwia to pisanie i późniejszą analizę kodu.
Awatar użytkownika
Procent
Młodszy majsterkowicz
Posty: 21
Rejestracja: 6 lis 2013, 14:46
Kontakt:

Re: Nawadnianie trawnika

Post autor: Procent » 15 lis 2013, 13:29

No niestety z tym napisaniem jest najwięcej kłopotów hehe

Będę walczył i nie poddam się. Co najwyżej wywalę do kosza czujnik i zacznę go robić z podzespołów własnoręcznie żeby mi nie odwracał bo naprawdę utrudnia to myślenie.

Dotychczasowo staram się uczyć poprzez podglądanie gotowych przykładów. Nie widzę miejsca w necie gdzie programowanie na Arduino jest fajnie opisane. Korzystanie ze strony arduino.cc mi się nie podoba - za bardzo porozrzucane to jest. No i to ze jest po angielsku też trochę utrudnia zabawę
Codzienne zmagania:
http://www.ertec.pl/
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: Nawadnianie trawnika

Post autor: cube » 15 lis 2013, 14:21

Nie warto robić czujnika samemu, jeśli już jeden masz i kwestią jest tylko odwrócenie stanu. Napisz sobie na kartce, przy klawiaturze, który stan za co odpowiada i tyle. Jeśli masz problem z ogólną koncepcją programu, narysuj sobie najpierw schemat blokowy a potem dopiero staraj się zamienić go w kod.
Zasady tworzenia schematów: http://pl.wikipedia.org/wiki/Schemat_blokowy
Dobry program: http://www.dobreprogramy.pl/Dia,Program ... 12767.html
ODPOWIEDZ

Strony partnerskie: