<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=47&amp;t=4684&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-12-10T17:22:58+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=47&amp;t=4684&amp;mode</id>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-12-10T17:22:58+01:00</updated>
<published>2013-12-10T17:22:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=60439#p60439</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=60439#p60439"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=60439#p60439"><![CDATA[
hmm... w sumie to jakoś nigdy się nie uczyłem arduino <br />ot tak sobie pisze .... podobnie jak w C <br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />ale zaiste się cieszymy i szczekamy na wyniki ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 10 gru 2013, o 17:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-12-10T17:09:52+01:00</updated>
<published>2013-12-10T17:09:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=60437#p60437</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=60437#p60437"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=60437#p60437"><![CDATA[
Witam wszystlich i spieszę poinformować że plotki o mojej śmierci są mocno przesadzone.<br /><br />Faktem jest że prawdopodobnie niewielu to interesuje <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":-D" title="Bardzo szczęśliwy" /><br /><br />Projekt nie został zarzucony a także nie zniechęciłem się mimo że &quot;obiecanki macanki a głupiemu do rana stoi...&quot;<br /><br />Stwierdziłem że postawię poprzeczkę jeszcze wyżej (z powodów egoistycznych ofkors) - uczenie się softu do Arduino po polsku jest karkołomne - łatwiej znaleźć informacje na temat C lub C++ i w tym kierunku zmierzam. Zatem chcę programować suchego procka.<br /><br />to na razie...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 10 gru 2013, o 17:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Domiss]]></name></author>
<updated>2013-11-24T21:13:07+01:00</updated>
<published>2013-11-24T21:13:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=58425#p58425</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=58425#p58425"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=58425#p58425"><![CDATA[
To może ja tak bardzo mniej więcej zobrazuję mój pomysł, ale zgodnie z założeniami autora tematu, czyli przez 6 godzin zbieramy co dziesięć minut dane i potem podlewamy (albo nie).<br /><br />[syntax=cpp]int LicznikOpadow;<br />int LicznikCzasu;<br /><br />void NaszDelay10Minut(){<br />  delay(1000*60*10); // to ma prawo być źle ;), może nie zawsze, ale przynajmniej czasem ;) (tak naprawdę to nie wiem, co się dzieje z funkcją delay jak arduino chodzi bardzo długo)<br />};<br /><br />void setup(){<br />  LicznikOpadow=0;<br />  LicznikCzasu=0; // do odliczania 6 godzin czyli 36 razy po 10 minut<br />//  ustawiamy też domyślne wartości dla &quot;strategicznych&quot; pinów<br />}<br /><br />void loop(){<br />  LicznikOpadow=LicznikOpadow+CzyJestMokro(); //CzyJestMokro() ma odpytywać czujnik i zwracać 1 jeśli jest i 0 jeśli nie jest mokro<br />// jak jest odwrotnie to można dać (zmieniam nazwę funkcji na CzyJestSucho() dla lepszej czytelności):<br />//LicznikOpadow=LicznikOpadow+(1-CzyJestSucho());<br />  LicznikCzasu++;<br /><br />  if(LicznikCzasu==36){ // minęło 6 godzin<br />    LicznikCzasu=0;<br />    if(LicznikOpadow&lt;6){<br />      WlaczPodlewanie();  // funkcja do napisania ;)<br />      for(int i=0;i&lt;6;i++)<br />        NaszDelay10Minut();<br />      WylaczPodlewanie();  // funkcja do napisania ;)<br />      LicznikCzasu=6; //podlewaliśmy godzinę, uważam, że nie ma sensu sprawdzać wtedy, czy było mokro, bo przecież było, ale to zaniedbujemy...<br />     // no chyba, że czujnik opadów nie jest podlewany, to można w pętli for sprawdzać, czy zaczęło padać i jeśli tak to wyłączyć podlewanie <br />     // i zliczać już sumę opadów.<br />    }<br />    LicznikOpadow=0;<br />  }<br />  NaszDelay10Minut();<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2015">Domiss</a> — 24 lis 2013, o 21:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-22T08:34:02+01:00</updated>
<published>2013-11-22T08:34:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=58147#p58147</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=58147#p58147"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=58147#p58147"><![CDATA[
W oczekiwaniu na dopływ wiedzy postanowiłem popchnąć projekt &quot;manualnie&quot;.<br />Programowanie to najtrudniejsza dla mnie sprawa ale nie należy marnować czasu - może im bardziej zaawansowany będzie projekt tym łatwiej będzie komuś pomóc mi w programowaniu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br />Docelowo PODLEWACZKA ma być umieszczona na osobnej płytce aby nie wyrzucać Arduino do kosza <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br />Zatem na płytkę przeniosłem procesor z zasilaniem oraz RTC (czyli zegar) a do tego dołączyłem wyświetlacz. <br />Aby do granic możliwości oszczędzać energię naszej biednej planety (nie - nie jestem z Grinpis) dołączyłem przycisk który podświetla wyświetlacz jeśli koniecznie tego chcemy (pod wyświetlaczem)<br />Zegar wykonany jest na kostce DS1307 (najpierw kupiłem gotowca ale tu chcę także mieć wszystko &quot;na piechotę&quot;). Schematy podłączeń są dostępne w necie wystarczy wpisać DS1307 i popatrzeć na grafiki.<br /><br />Do zegara dołączony jest akumulatorek, dwa rezystory 10k oraz kwarc 32 768 kHz. Całość kosztuje max 10 zł WRAZ Z AKUMULATORKIEM. Elementy te widoczne są z lewej strony procesora.<br />Poniżej tych elementów pozostawiłem nieco miejsca na kilka przycisków które chodzą mi po głowie...<br /><br />Procesor otoczony jest przeciętą na pół podstawką tak zaby można było wetknąć tam kable np do programowania zegara (tak właśnie go zaprogramowałem)<br />Zamierzam docelowo zastosować też  słabszy procesor niż Atmega 328.<br /><br />Po prawej stronie procesora widoczny jest wyświetlacz a poniżej niego moduł zasilania z układem scalonym LM7812 i 4 kondensatory filtrujące a także okrągły prostowniczek (mostek Graetza).<br />Z płytki odchodzą dwa białe przewody do podłączenia transformatorka sieciowego. Na razie cała płytka zasilana jest z baterii (a zegar z akumulatorka).<br /><br />To co widać na zdjęciu musi zostać uzupełnione o moduł zawierający przekaźnik sterujący zaworem wody (na wyjściu procesora). <br />Do procesora będzie musiał być dołączony na wejściu - czujnik wilgotności gleby.<br /><br />Program będzie musiał opierać się na odczytach z zegara. W tym miejscu muszę poznać obsługę programową tegoż.. i liczę tu na pomoc szanownych kolegów. Być może w wątku <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic4835.html" >topic4835.html</a><!-- l --><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1963/cfc54e1cef2b65e3a06de98832f665d1.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1963/cfc54e1cef2b65e3a06de98832f665d1.JPG" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 22 lis 2013, o 08:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-18T19:51:47+01:00</updated>
<published>2013-11-18T19:51:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=57604#p57604</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=57604#p57604"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=57604#p57604"><![CDATA[
Zdecydowałem się na zmianę podejścia do tematu.<br />Wydaje mi się że mimo wszystko łatwiej będzie nieco bardziej profesjonalnie niż prymitywnie czyli...<br /><br />Po pierwsze nie chcę żeby pętla była prymitywna i kolejne kroki wstrzymywane funkcją delay (w sposób prostacki czy też wykorzystujący bibliotekę Time)<br /><br />Po drugie chcę wykorzystać RTC czyli Zegar Czasu Rzeczywistego który już kupiłem, podłączyłem i sobie działa (jako zegarek sterowany Arduinem) bo skoro on sobie chodzi to czemu się do niego nie odnieść podczas pisania kodu.<br /><br />Po trzecie chcę (a może to było to &quot;po pierwsze&quot;) wykorzystać &quot;przerwania&quot; aby pętla sobie biegła i pracowała ale pewne funkcje były wykonywane w czasie jej pracy (konkretnie funkcja sprawdzania czy były opady w międzyczasie)<br /><br />Zatem wyobrażam sobie że program powinien wyglądać tak<br />1 - Istnieje pętla w której podlewamy rośliny co 6 godzin przez godzinę (i tu wykorzystać chcę RTC czyli odczytywać faktyczny czas). Podlewanie uzależnione jest od zebranych w międzyczasie informacji na temat opadów.<br />2 - Co jakiś czas (np co 10 minut) wykonywane są pomiary wilgotności gleby i zliczane są do jakiejś zmiennej (i tu wykorzystujemy &quot;przerwania&quot;)<br /><br />i tutaj podrzuciłem sam sobie pod nogi kłody w postaci :<br />Na czym k***czę polegają te biblioteki (w ogóle) ???<br />Jakich rozkazów należy użyć aby odczytywać czas z zegara w tej mojej pętli<br /><br />W związku z tym postanowiłem nawinąć osobny temat w stylu &quot;Co to są te biblioteki i z czym to się je?&quot;<br />naprawdę nie znalazłem w necie takiego tematu ... Wszyscy piszą o tym jaką bibliotekę do czego wykorzystać... ale nie ma info dla maluczkich - z czego to się tak naprawdę składa i jak się z tym komunikować. Wiem że istnieją pliki &quot;***.h&quot; oraz &quot;***.cpp<br />itd<br />Wszystkich którzy mogą pomóc zapraszam do tego tematu <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic4835.html" >topic4835.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 18 lis 2013, o 19:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-14T19:55:40+01:00</updated>
<published>2013-11-14T19:55:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56874#p56874</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56874#p56874"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56874#p56874"><![CDATA[
Na dziś pomijam bibliotekę Timer i próbuję prymitywnie jak mi SunRiver podpowiadał bo takie było moje założenie<br /><br />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ą<br />Dodałem zatem &quot;licznikCzujnika&quot; i &quot;led&quot; abudowany w Arduino żeby mi wskazywał kiedy skończy się czas obserwowania czujnika<br /><br />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)<br /><br />To co napisałem działa ale nie do końca. <br />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.<br />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.\<br /><br />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.<br /><br />Włożenie czujnika z powrotem do wody powoduje wznowienie błyskania diodą i pewnie zliczanie impulsów<br /><br />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<br /><br />No a oto kod &quot;Zdziś&quot;<br />[syntax=cpp]//zmienne których wartości są zawsze te same:<br /> const int czujnikPin = 1;    //  czujnik na pin 1<br /> const int przekaznikPin = 10;    //  przekaznik na pin 10<br /> int led = 13; // dioda sygnalizujaca koniec czasu mierzenia<br /> <br /> //zmienne których wartości będą się zmieniać:<br />int licznikCzujnika = 0;   //  definiujemy zmienna - licznik ile razy został włączony czujnik wilgotnosci<br /><br /> <br /> void setup() <br /> {<br />      pinMode(czujnikPin, INPUT);  // ustawiamy pin 1 jako wejście<br />      pinMode(przekaznikPin, OUTPUT); // ustawiamy pin 10 jako wyjscie <br />      digitalWrite(przekaznikPin, HIGH); // ustawienie pinu przekaznika w stanie wysokim poprzez rezystor podciagajacy<br />      // bo przekaznik sterowany jest stanem niskim <br />      pinMode(led, OUTPUT); <br />}<br />void loop()<br />{<br />     if (digitalRead(czujnikPin)==LOW) // jeśli stan czujnika jest niski (czyli jest mokro)<br />    {<br />    licznikCzujnika++;// zwiekszamy licznik czujnika o jeden<br />     delay(5 * 1000);// przerwa 5 x sekunda aby szybko potestowac, tu trzeba bedzie dac przerwe czasowa 10 minut za pomoca biblioteki Time<br />     digitalWrite(led, HIGH);   // turn the LED on  - migniecie dioda zeby bylo widac uplyw czasu<br />     delay(1000);               // wait for a second<br />     digitalWrite(led, LOW);    // turn the LED off <br />     delay(1000);               // wait for a second<br />    } <br /><br />    if (licznikCzujnika&lt;=3)  //sprawdź czy co najmniej 3 razy było mokro<br />    {<br />      digitalWrite(przekaznikPin, LOW); // jeśli mokro było mniej niż 3 razy - włącz przekaźnik (przekaźnik włącza się stanem niskim)<br />   }<br />   else<br />   {<br />   digitalWrite(przekaznikPin, HIGH); // wyłącz przekaźnik<br />   }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 14 lis 2013, o 19:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-11-14T13:57:42+01:00</updated>
<published>2013-11-14T13:57:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56796#p56796</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56796#p56796"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56796#p56796"><![CDATA[
dokładnie i działa bez RTC<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 14 lis 2013, o 13:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-14T12:38:44+01:00</updated>
<published>2013-11-14T12:38:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56791#p56791</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56791#p56791"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56791#p56791"><![CDATA[
Dobra - zamówiłem gotowca z <!-- m --><a class="postlink" href="http://allegro.pl/show_item.php?item=3705868943" >http://allegro.pl/show_item.php?item=3705868943</a><!-- m --><br /><br />Czy będę mógł użyć w takim razie boblioteki Timer (tu są łatwe przykłady - <!-- m --><a class="postlink" href="http://playground.arduino.cc/Code/Timer#Examples" >http://playground.arduino.cc/Code/Timer#Examples</a><!-- m -->) bez konieczności uczenia się odwołań do tej biblioteki? <br /><br />Tu jest przykład na to jak zrobić chyba dokładnie taki 10 minutowy delaj za pośrednictwem tej biblioteki<br />[syntax=cpp]#include &quot;Timer.h&quot;<br /><br /><br />Timer t;<br />int pin = 13;<br /><br /><br />void setup()<br />{<br />  pinMode(pin, OUTPUT);<br />  t.pulse(pin, 10 * 60 * 1000, HIGH); // 10 minutes  <br />}<br /><br /><br />void loop()<br />{<br />  t.update();<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 14 lis 2013, o 12:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-11-14T10:42:57+01:00</updated>
<published>2013-11-14T10:42:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56776#p56776</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56776#p56776"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56776#p56776"><![CDATA[
no dobrze by było użyć RTC do tego celu np DS1307<br /><br />albo zainteresuj sie ta biblioteka:<br /><!-- m --><a class="postlink" href="http://playground.arduino.cc/Code/Timer" >http://playground.arduino.cc/Code/Timer</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 14 lis 2013, o 10:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-14T08:49:46+01:00</updated>
<published>2013-11-14T08:49:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56772#p56772</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56772#p56772"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56772#p56772"><![CDATA[
Sun - a czy delay może być na pewno  10 minut? Podpowiadają mi że nie i żebym zapomniał o tym i podłączył zegar czasu rzeczywistego i bibliotekę jakąś użył &quot;czasową&quot;. Wolę to zrobić tak jak mówisz bo chcę zrobić prymityw.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 14 lis 2013, o 08:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-13T21:00:36+01:00</updated>
<published>2013-11-13T21:00:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56736#p56736</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56736#p56736"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56736#p56736"><![CDATA[
Do momentu Twojego postu SunRiver wysmażyłem poniższy kod. Zacząłem tworzyć zmienną stan czujnika oraz licznik czujnika. Być może nie do końca z sensem patrząc na Twój post.<br />Po linii 23 powinny nastąpić rzeczy których jeszcze nie napisałem bo na razie nie potrafię. Poniżej tej linii jest jakby ten sam kod który miałem do tej pory. Wywaliłem tylko migającą diodę z CAŁEGO kodu bo nie chciałem zaciemniać sprawy<br /><br />[syntax=cpp]//zmienne których wartości są zawsze te same:<br /> const int czujnikPin = 1;    //  czujnik na pin 1<br /> const int przekaznikPin = 10;    //  przekaznik na pin 10<br /> <br /> //zmienne których wartości będą się zmieniać:<br />int licznikCzujnika = 0;   //  definiujemy zmienna - licznik ile razy został włączony czujnik wilgotnosci<br />int stanCzujnika = 0;         // definiujemy zmienna - stan czujnika<br /><br /> <br /> void setup() <br /> {<br />      pinMode(czujnikPin, INPUT);  // ustawiamy pin 1 jako wejście<br />      pinMode(przekaznikPin, OUTPUT); // ustawiamy pin 10 jako wyjscie <br />      digitalWrite(przekaznikPin, HIGH); // ustawienie pinu przekaznika w stanie wysokim poprzez rezystor podciagajacy<br />      // bo przekaznik sterowany jest stanem niskim <br />}<br />void loop()<br />{<br />    stanCzujnika = digitalRead(czujnikPin); // odczytujemy stan czujnika  z pinu czujnika<br />     if (stanCzujnika == LOW) // jeśli stan czujnika jest niski (czyli jest mokro)<br />    {<br />      licznikCzujnika++; // zwiekszamy licznik czujnika o jeden<br />    }<br />   if (digitalRead(czujnikPin) == HIGH)  //sprawdź czy na pinie 1 jest stan wysoki (sucho)<br />   { <br />   digitalWrite(przekaznikPin, LOW); // włącz przekaźnik (przekaźnik włącza się stanem niskim)<br />   }<br />   else<br />   {<br />   digitalWrite(przekaznikPin, HIGH); // wyłącz przekaźnik<br />   }<br />}[/syntax]<br />Wklejam go bo może przynajmniej powiesz mi (lub ktoś inny) czy idę dobrym tropem. Muszę przeanalizować co napisałeś. Mam 99 % pewności że dobrze gadasz tylko że...<br />Funkcję PODLEJ (czy jak to sobie w programie zrealizujemy) chcę wywoływać ZAWSZE co 6 godzin (a nie wtedy kiedy było sucho) bo bym zlewał ziemię zawsze.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 13 lis 2013, o 21:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-11-13T18:38:06+01:00</updated>
<published>2013-11-13T18:38:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56712#p56712</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56712#p56712"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56712#p56712"><![CDATA[
chyba nie bardzo rozumiem co chcesz zrobić .<br /><br />ale wydaje mi się że skoro czujnik wystawia ci 1 jak jest mory  to  jedynie go możesz zrestetowac osuszając go <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br /><br />ale jakie ma to znaczenie ?? żadne <br />bo skoro chcesz sprawdzać co 10 min czy ma 1 czy 0  no to sprawdzasz   <br />czy :<br /><br />PIN_CZUJ = 1  jak tak to zmiena np MOKRO ++   i delay 10min  , a potem sprawdzasz zmów czy 1 i jak tak to MOKRO ++<br />i tak w koło ....    aż do czasu gdy MOKRO = 6  jeśli mokro = 6 to  wywołasz funkcje PODLEJ  <br />jeśli sprawdzisz np 5x że jest MOKRO   i MOKRO = 5 , a tym razem było else SUCHO  to ustawiasz MOKRO = 0  i sprawdzasz sobie dalej <br />wkoło   chyba jasno ... rozpisałem ...<br /><br />załatwisz to pętlą IF ... ELSE    ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 13 lis 2013, o 18:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-13T18:00:08+01:00</updated>
<published>2013-11-13T18:00:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56710#p56710</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56710#p56710"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56710#p56710"><![CDATA[
Zmagań ciąg dalszy.<br /><br />Będę podlewał co 6 godzin. Myśle że godzina podlewania wystarczy (linia kropelkowa a więc woda się sączy).<br />Cykl ma się powtarzać co 6 godzin i w ten sposób ziemia będzie podlana 4 razy w ciągu doby.<br /> <br />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. <br /><br />Męczę się teraz nad &quot;licznikiem&quot; czyli prostym fragmentem programu który będzie zliczał te impulsy (czujnik daje logiczną jedynkę gdy jest mokro).<br />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.<br />Jeśli zliczy minimum 6 impulsów to NIE PODLEWA a w przeciwnym razie podlewa przez godzinę.<br /><br />Program powinien chyba przez 5 godzin zajmować się tylko sprawdzaniem stanu wilgotności i zliczaniem tych impulsów a następnie przez godzinę podlewać.<br />Może to być prosta pętla i nie musi mieć żadnych wówczas skomplikowanych przerwań. Można chyba zastosować wówczas zwykłe &quot;delay&quot;.<br />Trzeba by jakoś &quot;zerować&quot; 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ść...<br /><br />Jeśli ktoś może pomóc w przełamaniu impasu w programowaniu to będę wdzięczny.<br />Mam wrażenie że poszukuję od paru dni informacj w necie jak rozwiązać trywialny temat<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 13 lis 2013, o 18:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-12T11:27:55+01:00</updated>
<published>2013-11-12T11:27:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56488#p56488</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56488#p56488"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56488#p56488"><![CDATA[
<div class="quotetitle">Domiss napisał(a):</div><div class="quotecontent"><br />Nie skonstruowałem (jeszcze) podlewaczki tego typu, ale mam pewne uwagi/idee:<br />1) mierzymy wilgotność w określonych odstępach czasu (np. co pięć minut) i jeśli przekracza pewien próg dodajemy 1 do licznika opadów. Kiedy przychodzi czas podlewania sprawdzamy wartość tego licznika, podlewamy lub nie (można też od tego uzależnić długość podlewania) i zerujemy go. Ten sposób rozumowania powinien być (w miarę) sensowny jeśli mierzysz wilgotność powietrza. Można też użyć ilorazu (ile_razy_było_mokro)/(ile_razy_mierzyliśmy) jeśli potencjalne podlewania nie mają być w równych odstępach czasu (uwaga na int/int żeby nie zawsze było zero <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ).<br /></div><br />W tym kierunku zacząłem parę dni temu właśnie kombinować. Myślę nad pętlą czasu mniejszą niż cała doba. Boję się po prostu że to może bardziej skomplikować program. Chyba będę podlewał co 6 godzin. Myśle że godzina podlewania wystarczy. 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. <br /><br /><div class="quotetitle">Domiss napisał(a):</div><div class="quotecontent"><br />2) jeśli mierzysz wilgotność gleby, to po prostu mierzysz ją tuż przed podlewaniem i jak jest dość mokro to nie podlewasz (lub uzależniasz czas podlewania od zmierzonej wilgotności).<br /></div><br />Tego właśnie nie chcę bo to właściwie sprowadza &quot;podlewaczkę&quot; do roli włącz/wyłącz w zależności od tego czy jest mokro czy nie. W tej sytuacji może się okazać że tej wody będzie za dużo w ciągu doby - szkoda roślin no i wody <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br />Takie podlewanie można zrobić na samym czujniku spiętym razem z przekaźnikami i zegarem któy kupiłem za 15 zł... Nie potrzeba Arduino<br /><div class="quotetitle">Domiss napisał(a):</div><div class="quotecontent"><br />3) kwestia użycia zewnętrznego zegara RTC zależy w dużym stopniu od stabilności źródła zasilania - jeśli chcesz prawie wcale do tego nie zaglądać a zdarzą się przerwy w zasilaniu arduino, to jednak lepiej mieć RTC i liczyć wszystko względem czasu z RTC. Choć z drugiej strony jeśli te przerwy zdarzać się będą sporadycznie (nie częściej niż raz na tydzień), to nawet jeśli podlewanie przesunie się z tego powodu o np. 4 godziny to chyba też nic się nie stanie. Tak czy siak bez zewnętrznej pamięci po przerwie w zasilaniu program wystartuje &quot;na czysto&quot; od zera.<br /></div><br />Też zaczynam sie skłaniać ku rezygnacji z zegara. Natomiast kwarc chyba raczej pomoże (jeśli zastosuję na końcu sam procek z czujnikami bez płytki Arduino)<br /><div class="quotetitle">Domiss napisał(a):</div><div class="quotecontent"><br />4) co się dzieje, jeśli otworzysz elektrozawór i wtedy akurat zabraknie prądu? (podłącz arduino i elektrozawór na jednej listwie i sprawdź i napisz tutaj jeśli możesz - ja planuję zrobić system automatycznego podlewania roślin w mieszkaniu, a nie chciałbym zalewać sobie parkietu).<br /></div><br /><br />To będzie chwilowo trudne bo zawór mam już zamontowany na wsi w domku a w ciągu tygodnia siedzę we Wrocławiu<br />ale... <br />myśle że ten zawór jest otwarty TYLKO wtedy gdy dopływa do niego prąd. To są zaworki od pralki i nie mają raczej stanów stabilnych a więc jak nie ma prądu to nie płynie woda. To coś jak przycisk (nie wyłącznik) - tak długo jak go naciskamy to przewodzi prąd a jak puścimy to przestaje przewodzić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 12 lis 2013, o 11:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-11-11T11:47:47+01:00</updated>
<published>2013-11-11T11:47:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56331#p56331</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56331#p56331"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56331#p56331"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />4) co się dzieje, jeśli otworzysz elektrozawór i wtedy akurat zabraknie prądu? (podłącz arduino i elektrozawór na jednej listwie i sprawdź i napisz tutaj jeśli możesz - ja planuję zrobić system automatycznego podlewania roślin w mieszkaniu, a nie chciałbym zalewać sobie parkietu).<br /></div><br /><br /><br />nie mam pojęcia .... nigdy nie budowałem tego typu urządzenia poza jednym systemem podlewania i zraszania trawników , a w domu nie mam roślin bo i tak by padły <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 11 lis 2013, o 11:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Domiss]]></name></author>
<updated>2013-11-11T10:27:51+01:00</updated>
<published>2013-11-11T10:27:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56308#p56308</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56308#p56308"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=56308#p56308"><![CDATA[
Nie skonstruowałem (jeszcze) podlewaczki tego typu, ale mam pewne uwagi/idee:<br />1) mierzymy wilgotność w określonych odstępach czasu (np. co pięć minut) i jeśli przekracza pewien próg dodajemy 1 do licznika opadów. Kiedy przychodzi czas podlewania sprawdzamy wartość tego licznika, podlewamy lub nie (można też od tego uzależnić długość podlewania) i zerujemy go. Ten sposób rozumowania powinien być (w miarę) sensowny jeśli mierzysz wilgotność powietrza. Można też użyć ilorazu (ile_razy_było_mokro)/(ile_razy_mierzyliśmy) jeśli potencjalne podlewania nie mają być w równych odstępach czasu (uwaga na int/int żeby nie zawsze było zero <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ).<br />2) jeśli mierzysz wilgotność gleby, to po prostu mierzysz ją tuż przed podlewaniem i jak jest dość mokro to nie podlewasz (lub uzależniasz czas podlewania od zmierzonej wilgotności).<br />3) kwestia użycia zewnętrznego zegara RTC zależy w dużym stopniu od stabilności źródła zasilania - jeśli chcesz prawie wcale do tego nie zaglądać a zdarzą się przerwy w zasilaniu arduino, to jednak lepiej mieć RTC i liczyć wszystko względem czasu z RTC. Choć z drugiej strony jeśli te przerwy zdarzać się będą sporadycznie (nie częściej niż raz na tydzień), to nawet jeśli podlewanie przesunie się z tego powodu o np. 4 godziny to chyba też nic się nie stanie. Tak czy siak bez zewnętrznej pamięci po przerwie w zasilaniu program wystartuje &quot;na czysto&quot; od zera.<br />4) co się dzieje, jeśli otworzysz elektrozawór i wtedy akurat zabraknie prądu? (podłącz arduino i elektrozawór na jednej listwie i sprawdź i napisz tutaj jeśli możesz - ja planuję zrobić system automatycznego podlewania roślin w mieszkaniu, a nie chciałbym zalewać sobie parkietu).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2015">Domiss</a> — 11 lis 2013, o 10:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2013-11-09T11:56:57+01:00</updated>
<published>2013-11-09T11:56:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55950#p55950</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55950#p55950"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55950#p55950"><![CDATA[
Jesli chodzi o funkcjonalnosc to moze sterownik Neptun czymś Ciebie jeszcze natchnie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />sterownik24.pl<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 9 lis 2013, o 11:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hyena]]></name></author>
<updated>2013-11-09T00:36:10+01:00</updated>
<published>2013-11-09T00:36:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55925#p55925</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55925#p55925"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55925#p55925"><![CDATA[
Witajcie wszyscy. To mój pierwszy post na tym forum. Jestem wielkim laikiem w temacie AVR. Mam nadzieje że się czegoś nauczę, choć idzie mi to strasznie opornie. Bibloteka time.h służy do wykonywania zadań w przesunięciu czasowym. Chodzi o wielozadaniowość. Że się tak zapytam, jak będziesz decydował na jak długo ma być otwarty zawór ?? Bo decyzję czy zawór jest otwarty czy zamiknięty podejmuje czujnik.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1983">hyena</a> — 9 lis 2013, o 00:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-06T10:07:13+01:00</updated>
<published>2013-11-06T10:07:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55623#p55623</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55623#p55623"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55623#p55623"><![CDATA[
<img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /> No nie wiem Sun co chciałeś pokazać bo kod jak dla mnie jest dość skomplikowany i sporo czasu upłynie zanim coś takiego skonstruuję.<br />Chyba że chodziło właśnie o pokazanie że to zbyt skomplikowany projekt jak na początkującego ...<br /><br />Widzę że jest jakaś biblioteka &quot;Time&quot; co sugeruje że nie muszę dołączać żadnego zegara w formie dodatkowej płytki...<br /><br />Widzę tu termometry które chyba nie będą mi potrzebne a nie widzę co jest czujnikiem wody który właśnie chcę zastosować. Bardzo mnie interesuje mierzenie opadów i podlewanie w zależności od nich. Temperatury już raczej mniej. Chcę wykorzystać podlewaczkę tylko w okresie letnim bo mi słońce pali posadzone żywopłoty.<br /><br />Oczywiście w miarę upływu czasu fajnie by mieć taką stację pomiarową która mierzy temperatury i może nawet nasłonecznienie. Fulwypas ale na razie muszę mieć prostą maszynę.<br /><br />Z tego kodu wnioskuję że go nie skumam... Wydrukowałem i będę zgłębiał ale wolał bym żebyś walił prostym tekstem a nie robił tajemnice <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":-P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 6 lis 2013, o 10:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-11-05T20:32:42+01:00</updated>
<published>2013-11-05T20:32:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55563#p55563</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55563#p55563"/>
<title type="html"><![CDATA[Re: PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55563#p55563"><![CDATA[
Może zrobię tak trochę złośliwie a może i nie ale ja zrobiłbym  to tak :<br /><br />[syntax=cpp]// Definicje i  funkcje .... -------------------------------------------------<br />#include &lt;Time.h&gt;<br /><br />int s0=2;            // wybrany czujnik na pinie 4051 (s0)<br />int s1=3;            // wybrany czujnik na pinie 4051 (s1)<br />int s2=4;            // wybrany czujnik na pinie 4051 (s2)<br />int count=0;        // wybieramy pin ?? <br /><br />int PompaWody = 5;   // pompa wody<br /><br />//Timery smc<br /><br />int flipTimer = 500;  <br />int wodaOn = 3000;     //trzeba by przetestować <br />int wodaOff = 3000;     //dla testu <br /><br /><br />int wDelay = 180000; //czekamy y czasu do nastepnego podlewania<br /><br />//wejścia multiplexera 4051<br />int val1a;<br />int val1b;<br />int val2a;<br />int val2b;<br />int val3a;<br />int val3b; <br /><br />//zatrzaski<br /><br />int voltageFlipPin1 = 6;<br />int voltageFlipPin2 = 7;<br /><br />//czujniki temperatury<br /><br />int t1 = A5;<br />int t2 = A4;<br /><br />// Typy wiadomości<br /><br />int DEBUG = 0;<br />int SENSOR = 1;<br />int PROGNOZA = 2;<br />unsigned int counter = 0;<br /><br />// Jeśli prawda .... wyrzucamy wszystkie dane ... a jak nie to.... nic<br />boolean log_output = true;     //debug on<br />// boolean log_output = false;   //debug off<br /><br />void debug(String message) <br />{<br />  if(log_output) <br />{<br />    send_message(DEBUG, message);<br />  }<br />}<br /><br />void process_debug(String message) <br />{<br />  send_message(DEBUG, message);<br />}<br /><br />// prognozowanie <br />void process_forecast(String message) <br />{<br />  // cosik do obsługi prognozowania pogody <br /><br />  debug(&quot;Odebrano raport pogodowy: &quot; + message);<br />  if (message.charAt(0)=='1') <br />  {<br />      debug(&quot;Podlewanie&quot;);<br />      digitalWrite(PompaWody, HIGH);<br />      // datetime :  aby wiedzieć ile sec minęło <br />      delay(wodaOn);<br />        time_t t = now();<br />        int s= second(t);<br />        debug(&quot;sekund&quot;+s);<br />      digitalWrite(PompaWody, LOW);<br />      delay(wodaOff);<br />      rewater();<br />      }<br />   else if (message.charAt(0)=='0')<br />  {<br />        debug(&quot;Opóżnienie 24 godziny&quot;);<br />        //czekamy 24h<br />        digitalWrite(PompaWody, LOW); <br />        delay(86400000);<br />    }<br />  else {<br /><br />        debug(&quot;Błąd odczytu prognozy:&quot;);<br />        debug(message);<br />  } <br />}<br /><br />// funkcja odczytu wiadomości <br />void read_message() {<br />  debug(&quot;Oczekiwanie na wiadomosc&quot;);<br />  String indata = String();<br /><br />  if(!(Serial.available() &gt; 0)) {<br />    debug(&quot;Brak Wiadomosci&quot;);<br />    return;<br />  } <br />  else {<br />    while (Serial.available() &gt; 0) <br />   {<br />      debug(&quot;Dostepne&quot;);<br />      char incomingByte = Serial.read();<br />      if (incomingByte == '\n') <br />   {<br />        break;<br />      }<br />      indata += incomingByte;<br />    }<br /><br />    // type, message = indata.split('\t')   // hmmm..... <br />    int where = indata.indexOf('\t');<br />    String type = indata.substring(0, where); // wszystko przed<br />    String message = indata.substring(where+1); // wszystko inne<br />    message.trim();<br />    debug(&quot;Przyjęta wiadomość to:&quot; + message);<br /><br />    if (type == String(DEBUG)) <br />   {<br />      process_debug(message);<br />    } <br />    else if (type == String(PROGNOZA)) <br />   {<br />      process_forecast(message);<br />    }<br />  }<br /><br />}<br /><br />void send_message(int type, String message) <br />{<br />  Serial.println(String(type) + String('\t') + message);<br />}<br /><br /><br />void setSensorPolarity(boolean flip)<br />{<br />  if(flip) <br />  {<br />    digitalWrite(voltageFlipPin1, HIGH);<br />    digitalWrite(voltageFlipPin2, LOW);<br />  }<br />  else{<br />    digitalWrite(voltageFlipPin1, LOW);<br />    digitalWrite(voltageFlipPin2, HIGH);<br />  }<br />}<br /><br />///  ustawienia  programu   ----------------------------------------<br />void setup() {<br />  Serial.begin(9600);<br />  pinMode(s0, OUTPUT); <br />  pinMode(s1, OUTPUT);<br />  pinMode(s2, OUTPUT);<br />  pinMode(A0, INPUT);<br />  pinMode(voltageFlipPin1, OUTPUT);<br />  pinMode(voltageFlipPin2, OUTPUT);<br />  pinMode(t1, INPUT);<br />  pinMode(t2, INPUT);<br />  pinMode(PompaWody, OUTPUT);<br /><br />}<br /><br />// Pętla główna  -------------------------------------------------------------<br />  <br />  void loop ()<br /> {<br />  debug(&quot;w pętli&quot;);<br />  read_message(); // czekamy na dane z komputera <br /><br />  int moisture = flipflop();<br />  debug(&quot;Wilgotnosc&quot;);<br />  debug(String(wilgoc));<br /><br />  //temperatura gleby  <br />  int temp1 = analogRead(t1);<br />  int temp2 = analogRead(t2);<br />  int temp = temperature(temp1, temp2);<br /><br />  //Kalibracja SMC z temp ...:<br />  //...<br />  water(moisture);<br />  read_message(); // czekanie na nowe informacje <br />  //delay(wDelay);<br />  delay(2000);<br /><br />}<br /><br />int flipflop() {<br />  setSensorPolarity(true);<br />  delay(flipTimer);<br /><br />  //y1<br />  digitalWrite(s0, LOW);<br />  digitalWrite(s1, LOW);<br />  digitalWrite(s2, LOW);<br />  val1a = analogRead(A0);<br /><br />  delay(flipTimer);<br />  setSensorPolarity(false);<br />  delay(flipTimer);<br />  val1b = 1023 - analogRead(A0); <br /><br /><br />  //y2<br />  setSensorPolarity(true);<br />  delay(flipTimer);<br /><br />  digitalWrite(s0, HIGH);<br />  digitalWrite(s1, LOW);<br />  digitalWrite(s2, LOW);<br />  val2a = analogRead(A0);<br /><br />  delay(flipTimer);<br />  setSensorPolarity(false);<br />  delay(flipTimer);<br />  val2b = 1023 - analogRead(A0); <br /><br />  //y3<br />  setSensorPolarity(true);<br />  delay(flipTimer);<br /><br />  digitalWrite(s0, LOW);<br />  digitalWrite(s1, HIGH);<br />  digitalWrite(s2, LOW);<br />  val3a = analogRead(A0);<br /><br />  delay(flipTimer);<br />  setSensorPolarity(false);<br />  delay(flipTimer);<br />  val3b = 1023 - analogRead(A0);<br /><br />  //srednia wilgotnosc gleby<br />  findSMC();<br />  <br />  //Serial.println(printSMC());<br />  //Serial.println(); <br /><br />}<br /><br />int findSMC() {<br />  int val1 = (val1a + val1b)/2;<br />  //Serial.print(&quot;val1&quot;);<br />  //Serial.println(val1);<br />  int val2 = (val2a + val2b)/2;<br />  int val3 = (val3a + val3b)/2;<br />  <br /><br /><br />  int SMCavg = (val1+val2+val3)/3; <br />}<br /><br /><br />// rezystory dla czujników tc74   1K<br /><br />int temperature(int t1, int t2) <br />{<br />  int diff = t1 - t2;<br />  if (diff &lt; 1) {<br />    diff = -1*diff;<br />  }<br />  return diff;<br />}<br /><br />//Pamietajka ....: <br /><br />int moisture_lower = 1000;<br />int moisture_upper = 1500; <br />boolean water (int smc) {<br />  if (smc &lt; moisture_lower) {<br />    send_message(DEBUG, &quot;Podlej mnie !!&quot;);<br />    send_message(SENSOR, &quot;1&quot;);<br />  } else {<br />    send_message(DEBUG, &quot;Tone ratunkuuu !&quot;);<br />    send_message(SENSOR, &quot;2&quot;);<br />   // delay(1200000); <br />  }<br />}<br /><br /><br />//Czekamy 1s po 1 podlaniu  i .....<br />//po wykonaniu pomiarów decydujemy co robic dalej ...<br /><br />void rewater() {<br />  debug(&quot;Ponowne podlewanie włączone&quot;);<br /> //delay(wDelay);<br />  int newMoisture = flipflop(); // pobieramy srednią SMC<br />  debug(&quot;nowy FilFlop&quot;);<br />  if (newMoisture &lt;= moisture_upper - 30) { <br />    debug(&quot;Decyzja: ponowne podlewanie&quot;);<br />    water(newMoisture);<br />  }<br />  else(&quot;Nie podlewamy&quot;);<br />  // tu sobie wstawimy wymagany delay dla decyzji <br />}[/syntax]<br /><br />tak na szybko i nie musi działać bo nie sprawdzałem , ale chciałem coś pokazać ....<br />już ty wiesz co <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 5 lis 2013, o 20:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Procent]]></name></author>
<updated>2013-11-05T18:01:43+01:00</updated>
<published>2013-11-05T18:01:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55543#p55543</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55543#p55543"/>
<title type="html"><![CDATA[PODLEWACZKA - Czyli jak inteligentnie podlewać ogród]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4684&amp;p=55543#p55543"><![CDATA[
Zamierzam zbudować inteligentne podlewanie ogrodu. Z grubsza chodzi oczywiście o to żeby nie podlewać jeśli w ciągu ostatniej doby były opady deszczu.<br /><br />Kupiłem czujnik wilgotności oraz zespół dwóch przekaźniczków do płytki Arduino.<br />Do tej pory nauczyłem się zaledwie sterować włączaniem się przekaźnika gdy czujnik jest suchy a także miganiem diody (gdy sucho).<br />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  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> <br /><br />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).<br />Nie wiem na przykład czy potrzebne jest dołączenie zegara czasu rzeczywistego na osobnej płyteczce.... itd<br /><br />Założenia mam ogólnie takie :<br />1 - Program działa w pętli dobowej i bada opady deszczu uzależniając od tego podlewanie ogródka.<br />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.<br />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ć.<br />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 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> <br /><br />Poniżej zamieszczam kod o którym wspomniałem napisany na podstawie przykładu zamieszczonego przez SunRivera tu: <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic3336.html" >topic3336.html</a><!-- l --><br /><br />Kod został utworzony w celach nauki programowania a więc nie chodzi o to żeby sie na nim opierać. <br /><br />Proszę po prostu o podpowiedzi jak się za temat zabrać.<br /><br />KOD:<br />[syntax=cpp]int czujnikPin = 1;    //  czujnik na pin 1<br /> int ledPin = 13;  // ustawiamy diode na pin 13<br /> int przekaznikPin = 10;    //  przekaznik na pin 10<br /> <br /> void setup() <br /> {<br />      pinMode(czujnikPin, INPUT);  // pin 1 jako wejście<br />      pinMode(ledPin, OUTPUT);   //pin 13 jako wyjście<br />      pinMode(przekaznikPin, OUTPUT); // pin 10 jako wyjscie <br />      digitalWrite(przekaznikPin, HIGH); // ustawienie pinu przekaznika w stanie wysokim poprzez rezystor podciagajacy<br />      // bo przekaznik sterowany jest stanem niskim <br />}<br />void loop()<br />{<br />   if (digitalRead(czujnikPin) == HIGH)  //sprawdź czy na pinie 1 jest stan wysoki (sucho)<br />   { <br />   digitalWrite(przekaznikPin, LOW); // włącz przekaźnik aby podlewać (przekaźnik włącza się stanem niskim)<br />   digitalWrite(ledPin, HIGH);  // włacz diodę (migamy diodą bo jest sucho)<br />   delay(500);<br />   digitalWrite(ledPin, LOW);  // wyłacz diodę<br />   delay(500);<br />   }<br />   else<br />   {<br />   digitalWrite(przekaznikPin, HIGH); // wyłącz przekaźnik<br />   digitalWrite(ledPin, LOW);  // wyłacz diodę<br />   }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1963">Procent</a> — 5 lis 2013, o 18:01</p><hr />
]]></content>
</entry>
</feed>