6ti mocny zavlazovac kytek

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
powl
Příspěvky: 9
Registrován: 03 kvě 2018, 20:25
Reputation: 0

6ti mocny zavlazovac kytek

Příspěvek od powl » 03 kvě 2018, 20:51

Ahoj,

chci si udelat zalevac kytek co bude obsluhovat 6 kvetinacu. Mam to uz tak nejak vymysleny ale budu rad kdyz mne napisete svoje postrehy.

Melo by to 2x za den zkontrolovat vlhkost pudy. Kdyz bude nizka, tak zalejt ten kvetinac kde nameril nizkou hodnotu, pockat 10s a opakovat mereni.
Az bude dostatecna vlhkost tak prejit na dalsi kvetinac.

Pro parametry jednotlivych kvetinacu jsem si vytvoril promennou pole - tam bude ulozena pozadovana vlhkost, doba proudu vody a vykon motoru.

Motor bude regulovany PWM. Dale bude kontrola hladiny vody - jeste nevim uplne jak.

Arduino bude napajeno stejnym zdrojem jako motor, takze jsem resil i nejake to odruseni viz schema.

Ovladaci "plosnak" si chci udelat sam, prikladam schema.


Momentalne premyslim jak udelat spusteni loopu 2x za den.....nasel jsem reseni pres millis()....je to dobry napad?



Seznam soucastek:

Arduino UNO
6x vlhkomer https://www.gme.cz/modul-pudniho-vlhkomeru
6x solenoid https://www.ebay.com/itm/12V-DC-Small-P ... SwywRaNx-9
1X motorek ostrikovacu (nevim co je zac)
1x napajeci zdroj https://www.gme.cz/napajeci-adapter-sit ... m-t2-vigan

soucastky na plosnak dle schematka.....



Kód: Vybrat vše

int motor = 6;
int beh = 0;
int vlhkost = 100;



// 6x info: vlhkost, doba zalevani, rychlost zalevani
int poledata[6][3]={
{60,3,70},  //1
{70,3,30},  //2
{50,3,60},   //3
{50,6,50},  //4
{40,10,1}, //5
{60,3,40}   //6

};

void setup() {
Serial.begin(9600);




// Vystupy pro sensory
pinMode(0, OUTPUT); 
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);

digitalWrite(0, LOW);
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);

//Vystupy pro solenoidy

pinMode(8, OUTPUT); 
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);

 //kontrola hladiny vody
pinMode(7, INPUT); 


//PWM pro motor (6)
pinMode(motor, OUTPUT); 



//Vstupy od sensoru
pinMode(14, INPUT); 
pinMode(15, INPUT);
pinMode(16, INPUT);
pinMode(17, INPUT);
pinMode(18, INPUT);
pinMode(19, INPUT);

}

void loop() 
{
Serial.println((String) "Novy loop pri " + millis());


for (int i = 1; i <= 6; i = i + 1) // 6 kytek

   {  if (digitalRead(7) == LOW) nenivoda();

        beh = 0;   // reset pocitadla
      
             
      
        do
        {
             
        if (beh!=0)
        
        // --- zaliti kytky ---
        {
        digitalWrite(i+7, HIGH);                                      //otevre solenoid
        delay(300);                                                   //stabilizace solenoidu
        analogWrite(motor, map(poledata[i-1][2], 0, 100, 0, 255));    //spusti motor zadanou rychlosti (%)        
        delay((poledata[i-1][1])/beh*1000);                           //doba behu motoru - kdyz zaleva podruhe je polovicni
        analogWrite(motor, 0);                                        //vypne motor
        digitalWrite(i+7, LOW);                                       //zavre solenoid
        delay(10000);                                                 //pockej az se to vcakne: 10000
        Serial.println((String) "Kytka cislo " + i + " Zalil sem ji " + beh + "x" + " Posledni vlhkost byla " + vlhkost);
        }
        
        // --- nacteni vlhkosti ---
        digitalWrite(i-1, HIGH);                            //zapne napajeni sensoru
        delay(300);                                         //stabilizace sensoru
        vlhkost = map(analogRead(i+13), 0, 1023, 0, 100);   //nacteni hodnoty sensoru
        digitalWrite(i-1, LOW);                             //vypne napajeni sensoru    
        beh = beh + 1;                                      //pocitadlo
        Serial.println((String) "kytka: " + i);
        Serial.println((String) "reference: " + poledata[i-1][0]);
        Serial.println((String) "naměřeno: " + vlhkost);
        
        } while ((vlhkost < poledata[i-1][0]) and (beh < 3));
         
           
   }

 }




 void nenivoda()
{

do

{  
Serial.println((String) "Neni voda");  
delay(10000); 
}

while (digitalRead(7) == LOW);


  
  }
 
Přílohy
kytky6.gif

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: 6ti mocny zavlazovac kytek

Příspěvek od Axamith » 04 kvě 2018, 05:40

Časování pomocí millis() není dobrý nápad, je to informace o délce běhu programu, má své omezení a časovač po naplnění přeteče. Šlo by ovládat pomocí RTC (buď v konkrétním čase nebo periodě), další volbou je nastavit periodu spánku, Arduino se probudí, provede měření vlhkosti, popřípadě spustí závlahu a zase na nastavenou dobu usne.

powl
Příspěvky: 9
Registrován: 03 kvě 2018, 20:25
Reputation: 0

Re: 6ti mocny zavlazovac kytek

Příspěvek od powl » 04 kvě 2018, 10:20

ahoj diky za odpoved. Ten realnej cas urcite zvazim, jen nevim jestli budu mit jeste volny piny...musim si to nakreslit.

Jinak k tomu preteceni millis() jsem nasel reseni ktery vypada docela slibne:

https://www.baldengineer.com/arduino-ho ... illis.html

O ty periode spanku nevim nic....musim nastudovat ;)

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: 6ti mocny zavlazovac kytek

Příspěvek od Axamith » 04 kvě 2018, 11:00

Myslím, že je docela jedno, v jaký čas květináče zaléváš. Nastavil bych periodu (např. 60 minut) a přes režim spánku, lowPower arduino uspával a po probuzení by proběhlo změření vlhkosti, a podmínkou buď znovu uspat (není potřeba zalévat) nebo zalít a uspat.
K tomu režimu spánku, obstarává ho knihovna LowPower. Arduino umí usnout na max. 8 sekund, ale pomocí cyklu ho můžeš nekonečně prodlužovat. V podstatě každých 8 sec. si jen ověří, jestli už má vstávat a pokud ne, pokračuje další smyčka. Hlavně k tomu není potřeba žádný další HW a volný vstup.
Nebo pomocí RTC a tranzistoru probouzet přerušením viz. http://www.astromik.org/raspi/krmitko/index.htm (autor AstroMiK)
Potřebuješ RTC a volný vstup (INT0 nebo INT1)

Uživatelský avatar
gilhad
Příspěvky: 786
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: 6ti mocny zavlazovac kytek

Příspěvek od gilhad » 06 kvě 2018, 01:47

powl: velka pochvala za vyhledani tohoto clanku o millis - ten by si mel precist povinne kazdy, kdy chce na Arduinu delat COKOLI s casem (at uz millis, nebo delay, nebo cokoli) :)

(a dalsi pochvala za ovladani prez tranzistory)

Uspavani je prima, ze setri baterky, ale pokud tam das UNO, tak ti je vyzere prez napetovy regulator a pridruzene obvody (pokud se mu trochu nepohrabes v HW, tak bude sice atmega328 spat, ale ten zbytek bude porad odebirat proud). Ty tam ale mas zdroj z 240V, a docela bych si tipnul, ze takovy cinsky zdroj bude mit klidovy odber vyrazne versi, nez cele slavne Arduino, takze s uspavanim bych si hlavu nelamal, pokud by jeho soucasti nebylo i odpojovani toho zdroje od 240V. A regulator Arduina ti z 12V bude delat 5V pro atmegu328 a zbylych 7V vyzari ve forme tepla (teda vykon pri proudu odebiranem tim Arduinem) takze fakt bych to s uspavanim nehrotil, pokud chces setrit energii, jsou tu mista, kde usetris vyrazne vic.

Millis pretecou jednou za necelych 50 dni a tim zminenym postupem s tim nemas zadny problem. Navic je to samozrejme presnejsi, nez rizeni delkou spanku.

RTC ma vyznam, pokud bys ty kytky chtel zalevat v konkretni hodiny (treba je nezalevat v poledne, kdy prazi slunko, pokud kropis zeshora, tak to pry listum nedela dobre, nebo naopak zalevat v poledne, kdy je nejvic sucho, pokud zalevas zpod zeme (od podlahy kvetinace) odstatou vodou, nebo tak neco.) Pokud ti jde pouze o to, mit je dvakrat denne zalite, tak je RTC celkem zbytecne. Arduino sice nedrzi cas zcela presne ale u zalevani to nemusi byt tak kriticke.

(ted jsem prolitnul web, nektera Arduina se rozchazeji o 1s za den, jina skoro o minutu a lisi se to kus od kusu a taky zalezi na okolnich podminkach. Ale pokud jsou okolni podminky priblizne stale, tak jde zmerit, o kolik se predbiha/zpozduje a zanest to jako opravu a ziskat podstatne lepsi presnost - treba pokud se to za den zpozdi o minutu, ale pokazde stejne, tak si do vypoctu dat, ze den ma 24:01 a tedy spinat po 12 hodinach a pul minute "mistniho Arduinackeho casu z millis")

Ten tvuj kod jsem necetl nijak pozorne, ale vsimnul jsem si, ze pouzivas piny 0 a 1 (coz je Serial) jak pro senzory, tak pro tisky prez Serial (a taky pro programovani vlastniho Arduina). I pokud si to Arduino pro programovani odpojis, tak pri behu ti bude Serial psat do tech senzoru a ty senzory ti naopak budou kazit signal na seriove komunikaci (pridavat sum, vlastni kapacitu, zkratovat k zemi a tak podobne, Serial z toho rozhodne stastny nebude)

A pokud ty senzory spinas na strane zeme, tak muzou byt i problemy s tim, jak jsou konstruovane, IMHO budou mit tu snimaci cast taky spojenou se zemi a nejde vyloucit, ze se ti tim spolecnym uzemnenim prez snimace bude prohanet proud i kdyz ty tranzistory budou rozepnute - cili to by chtelo overit, zda nebude delat problemy nez se pustis do finalni stavby a vyroby plosnaku.

rejze69
Příspěvky: 174
Registrován: 02 dub 2018, 18:56
Reputation: 0

Re: 6ti mocny zavlazovac kytek

Příspěvek od rejze69 » 06 kvě 2018, 20:07

Tak děkuju za ten článek o millis. Zrovna jsem se na to tady ptal a teď mám úolně jasno.

powl
Příspěvky: 9
Registrován: 03 kvě 2018, 20:25
Reputation: 0

Re: 6ti mocny zavlazovac kytek

Příspěvek od powl » 05 čer 2018, 23:06

gilhad píše:
06 kvě 2018, 01:47

Ten tvuj kod jsem necetl nijak pozorne, ale vsimnul jsem si, ze pouzivas piny 0 a 1 (coz je Serial) jak pro senzory, tak pro tisky prez Serial (a taky pro programovani vlastniho Arduina). I pokud si to Arduino pro programovani odpojis, tak pri behu ti bude Serial psat do tech senzoru a ty senzory ti naopak budou kazit signal na seriove komunikaci (pridavat sum, vlastni kapacitu, zkratovat k zemi a tak podobne, Serial z toho rozhodne stastny nebude)
dik za tuhle pripominku, to jsme nevedel a tezko bych na to prisel a divil bych se proc to meri blbosti. serial jsem vypnul.
gilhad píše:
06 kvě 2018, 01:47
A pokud ty senzory spinas na strane zeme, tak muzou byt i problemy s tim, jak jsou konstruovane, IMHO budou mit tu snimaci cast taky spojenou se zemi a nejde vyloucit, ze se ti tim spolecnym uzemnenim prez snimace bude prohanet proud i kdyz ty tranzistory budou rozepnute - cili to by chtelo overit, zda nebude delat problemy nez se pustis do finalni stavby a vyroby plosnaku.
senosry napajim rovnou arduinem, ty tranzistory ukostrujou 12V solenoidy

powl
Příspěvky: 9
Registrován: 03 kvě 2018, 20:25
Reputation: 0

Re: 6ti mocny zavlazovac kytek

Příspěvek od powl » 05 čer 2018, 23:36

jinak uz to funguje, konev setri vodou :D

Zkouska bez sensoru s provizornim kodem - 1. 3 vystupy 7 vterin 90% pwm, 2. 3 vystupy 7 vterin 50% pwm
https://youtu.be/jJYe8dUQMYk

Jeste jsem si uvedomil ze ty solenoidy pri zavreni kopou zpatky vysoky napeti...dodelal jsem proto k nim paralelne diody
Taky jsem dodelal indikaci led na sensory

K casovani - 1x za 12 h pouzivam millis()

No a ted musim prikoupit hadicku, natahnout sensory a bude to

provizorni kod jak je na videu:

Kód: Vybrat vše

int motor = 6;
int beh = 0;
int vlhkost = 100;
long previousMillis = 0;   
long interval = 43200000; // 12h



// 6x info: vlhkost (%), doba zalevani (s), rychlost zalevani (% vykonu)
int poledata[6][3]={
{60,7,90},  //1
{70,7,90},  //2
{50,7,90},  //3
{50,7,50},  //4
{40,7,50},  //5
{60,7,50}   //6

};

void setup() {
// serial.begin(9600);




// Vystupy pro sensory
pinMode(0, OUTPUT); 
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);

digitalWrite(0, LOW);
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);

//Vystupy pro solenoidy

pinMode(8, OUTPUT); 
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);

 //kontrola hladiny vody
pinMode(7, INPUT); 


//PWM pro motor (6)
pinMode(motor, OUTPUT); 



//Vstupy od sensoru
pinMode(14, INPUT); 
pinMode(15, INPUT);
pinMode(16, INPUT);
pinMode(17, INPUT);
pinMode(18, INPUT);
pinMode(19, INPUT);

}

void loop() 
{
          
                 
      
            
            
           
            unsigned long currentMillis = millis();
            if((currentMillis - previousMillis > interval) or (currentMillis < 20))
        

                {
                
                   previousMillis = currentMillis;   
                  // serial.println(digitalRead(7)); 
                   if (digitalRead(7) == HIGH) zalevani();
                }
        
}     //konec loop




//----------------------------------------------------------------------------------------------              
void zalevani()

{

                    for (int i = 1; i <= 6; i = i + 1) // 6 kytek

                         {  

                                  beh = 0;   // reset pocitadla
                                  if (digitalRead(7) == LOW) break;
      
                                 
                                                                               
                                              
        
                                                     // --- zaliti kytky ---
                                                       {
                                                                                  
                                                          digitalWrite(i+7, HIGH);                                      //otevre solenoid
                                                          delay(300);                                                   //stabilizace solenoidu
                                                          analogWrite(motor, map(poledata[i-1][2], 0, 100, 0, 255));    //spusti motor zadanym vykonem (%)        
                                                          delay((poledata[i-1][1]*1000));                                    //doba behu motoru
                                                          analogWrite(motor, 0);                                        //vypne motor
                                                          digitalWrite(i+7, LOW);                                       //zavre solenoid
                                                        // serial.println((String) "Kytka cislo " + i + " Zalil sem ji " + beh + "x" + " Posledni vlhkost byla " + vlhkost);
                                                          delay(1000);                                                 //pockej 1s
        
                                                      }                                                              //konec IF

        
                                                          
                                         
         
           
                                  }                                                                                     //konec FOR

return;                                                                                                                 //vrat se do hlavniho loopu
}

//----------------------------------------------------------------------------------------------
Konecny schema pomocnyho plosnaku prikladam
kytky6.gif

powl
Příspěvky: 9
Registrován: 03 kvě 2018, 20:25
Reputation: 0

Re: 6ti mocny zavlazovac kytek

Příspěvek od powl » 12 čer 2018, 12:53

tak prvni zkouska s vodou probehla uspesne

zbyva dodelat hadice a sensory, zaklad uz funguje (vcetne kontroly hladiny vody)

https://www.youtube.com/watch?v=3sd2PkHf0rE

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 19 hostů