// Hlidani hladiny a spinani rele // verze 2 // Zadani: http://duinozone.cz/index.php/topic,657.0.html // ================================================================= // prirazeni vstupu a vystupu byte pin_re1 = 2; // rele 1 byte pin_re2 = 3; // rele 2 byte pin_cidlo = A0; // analogovy vystup z cidla // konstanty int hladina_max = 400; // uroven hladiny, pri ktere se sepne rele 1 (1V) int hladina_min = 800; // uroven hladiny, ktera se vyhodnoti jako "voda neni" (4V) int prodleva_re1 = 10; // cas v desetinach sekundy, po ktery bude sepnute rele 1 int prodleva_re2 = 50; // cas v desetinach sekundy, po ktery bude sepnute rele 2 byte pocet_re1 = 20; // po kolika cvaknutich rele 1 se ma sepnout rele 2 // vnitrni promenne programu byte pocitadlo = 0; // pocitadlo sepnuti rele 1 int casovani_re1 = 0; // odpocet casu sepnuteho rele 1 int casovani_re2 = 0; // odpocet casu sepnuteho rele 2 boolean aktivni = true; // znacka, jestli je cidlo aktivni (jestli bude mit vliv na spinani rele) void setup() { pinMode(pin_re1, OUTPUT); // rele 1 (digitalni vystup) pinMode(pin_re2, OUTPUT); // rele 2 (digitalni vystup) pinMode(pin_cidlo, INPUT); // cidlo vody (analogovy vstup) digitalWrite(pin_re1, HIGH); // obe rele se rozepnou logickou "1" digitalWrite(pin_re2, HIGH); } void loop() { // vyhodnoceni pritomnosti vody, nebo jejiho poklesu pod minimalni uroven if (aktivni == true) // kdyz je cidlo aktivni, testuj pritomnost vody { if (analogRead(pin_cidlo) <= hladina_max ) // kdyz je pritomna voda ... { casovani_re1 = prodleva_re1; // ... zacne se casovat rele 1 pocitadlo ++; // pocitadlo sepnuti rele 1 se zvetsi o jednicku aktivni = false; // cidlo se deaktivuje (stale testuje vodu, ale nezpusobi dalsi sepnuti rele) } } else // kdyz je cidlo neaktivni (nezpusobuje spinani rele) ... { if (analogRead(pin_cidlo) >= hladina_min ) // ... je mozne ho aktivovat az pri poklesu hladiny pod minimalni uroven { aktivni = true; } } // obsluha rele 2 if (pocitadlo == pocet_re1 ) // kdyz pocitadlo sepnuti rele 1 dosahne hodnoty pro sepnuti rele 2 ... { pocitadlo = 0; // ... tak se pocitadlo vynuluje casovani_re2 = prodleva_re2; // a aktivuje se casovac sepnuti rele 2 } // casove ovladani RELE 1 if (casovani_re1 > 0) // kdyz je casovac pro rele 1 spusteny ... { digitalWrite(pin_re1, LOW); // ... sepne rele 1 casovani_re1 --; // a odecte 1 od casovace pro rele 1 } else { digitalWrite(pin_re1, HIGH); // kdyz casovac dobehne do 0, rele 1 rozepne } // casove ovladani RELE 2 if (casovani_re2 > 0) // kdyz je casovac pro rele 2 spusteny ... { digitalWrite(pin_re2, LOW); // ... sepne rele 2 casovani_re2 --; // a odecte 1 od casovace pro rele 2 } else { digitalWrite(pin_re2, HIGH); // kdyz casovac dobehne do 0, rele 2 rozepne } delay(100); // jeden pruchod hlavni smyckou trva asi 0.1 sekundy (proto je nastaveni casovacu pro rele v desetinach sekundy) } // konec hlavni smycky