/* * * Casovac zalevani skleniku pomoci arduina * PhDr. Mgr. Jeroným Klimeš, Ph.D. * www.klimes.us * * cas_offset - nastavite cas spusteni arduina * rele1_cas1, rele1_cas2 - zacatek prvniho a druheho zalevani * rele1_trvani1, rele1_trvani2 - trvani prvniho a druheho zalevani (vse v milisekundach) * * */ // constants won't change. They're used here to set pin numbers: const int tlacitko = 3; // the number of the pushbutton pin const int hadice_rele1 = 6; // the number of the pushbutton pin //const int buzzer = 9; //buzzer to arduino pin 9 = zapnuty zvuk const int buzzer = 33; //buzzer to arduino pin 33 = vypnuty zvuk const int SHORT_PRESS_TIME = 500; // 500 milliseconds int b=0; //buzzer index int t=0; //cas index //cas="10:01";sekundy=$(( $(date -d "today $cas" "+%s") - $(date -d "today 0:00" "+%s") )); echo $sekundy //cas_sekundy=52214562; date -u -d @$cas_sekundy +"%T" int hodiny=0; int minuty=0; //int test=0; String cas, cas_stary, rele1_cas1_string, rele1_cas2_string, cas_test_string, mezicas, mezicas_stary; const unsigned long den=86400000; //pocet milisekund za den, hodinu, minutu const unsigned long hodina=3600000; const unsigned long minuta=60000; /* testovaci hodnoty unsigned long cas_offset=23*hodina + 59*minuta ; //23:59 - testovani prekuleni dne unsigned long rele1_cas1=0*hodina + 1*minuta ; unsigned long rele1_cas2=0*hodina + 2*minuta ; unsigned long rele1_trvani1=1/5*minuta; unsigned long rele1_trvani2=1/6*minuta; unsigned long cas_offset=14*hodina + 30*minuta ; //14:30 unsigned long rele1_cas1=14*hodina + 31*minuta ; unsigned long rele1_cas2=14*hodina + 32*minuta ; unsigned long rele1_trvani1=1*minuta/5; unsigned long rele1_trvani2=1*minuta/6; */ unsigned long cas_offset=16*hodina + 30*minuta ; //definitivni hodnoty - arduino strkam do zasuvky v 16:30 unsigned long rele1_cas1=22*hodina + 1*minuta ; // první zalévání začne v 22:01 unsigned long rele1_cas2=4*hodina + 2*minuta ; // druhé zalévání začne v 04:02 unsigned long rele1_trvani1=1*minuta; // na prvnim rele první zalévání trva minutu unsigned long rele1_trvani2=1*minuta/2; //na prvnim rele druhé zalévání trvá půl minuty //unsigned long rele1_cas1=cas_offset + 1*minuta ; // testovani unsigned long cas_test=9999999999999999;//cas_offset + 2*minuta ; unsigned long trvani_test=minuta/4; //testovaci zalevani je 15 s a spousti ho tlacitko int rele1_cas1_zalito=0; // hodnoty: 0Pred zalevanim; 1=Po zalevani; 2 Mezi zalevanim, ergo prave zaleva - kontrolni int rele1_cas2_zalito=0; //podobne nastavte promenne jinych rele int cas_test_zalito=0; unsigned long cas_nyni=0; // Promenne pro tlacitko: int lastState = LOW; // the previous state from the input pin int currentState = LOW; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void kremikove_nebe(int pocet) { // nejjednodussi kraval maker - hymna kremikoveho nebe // random(min, max) // tone(buzzer, 1000); // Send 1KHz sound signal... //randomSeed(analogRead(0)); randomSeed(millis()); for(b=1; blen) kolik=len; for (int m = 1; m <= kolik; m++) { //Serial.println(exp(log(440)+array[m]*log(2)/12)); //Serial.println(m); //Serial.println(len); //Serial.println(len); if (array[m]==0) { noTone(buzzer); // Stop sound... //delay(800/array[m+len]); } else { tone(buzzer, int(exp(log(440)+array[m]*log(2)/12))); // Send 1KHz sound signal... } delay(800/array[m+len]); } noTone(buzzer); // Stop sound... } void ton_z_melodie(int array[], int kolikaty) { int len=array[0]; kolikaty=kolikaty%(len)+1; //Serial.println(exp(log(440)+array[m]*log(2)/12)); // Serial.println(kolikaty); // Serial.println(len); //Serial.println(len); if (array[kolikaty]==0) { noTone(buzzer); // Stop sound... } else { tone(buzzer, int(exp(log(440)+array[kolikaty]*log(2)/12))); // Send 1KHz sound signal... } delay(800/array[kolikaty+len]); } void setup() { Serial.begin(9600); pinMode(tlacitko, INPUT_PULLUP); pinMode(hadice_rele1,OUTPUT); // set relay pins as output pinMode(buzzer, OUTPUT); // Set buzzer - pin 9 as an output rele1_cas1_string=cas_prevod(rele1_cas1); rele1_cas2_string=cas_prevod(rele1_cas2); melodie(sedmicka); //Kremilek a Vochomůrka indikuji zapnuti zalevani - zkontrolujte, ze je vyse spravne nastaveny PIN reproduktoru // melodie(ovcaci); //melodie(icacvo); //melodie(kuku); // melodie(stupnice_dur); // melodie(morava); // melodie(stupnice_dur, 12); // for (b=0;b<186;b++) { // Serial.println("b"+String(b)); // ton_z_melodie(sedmicka, b); // } // exit(0); //Serial.println(den/hodina); // Serial.println("den/hodina: " + String(den,DEC)+ String(hodina,DEC)+ String((den/hodina),DEC)); } String cas_prevod(unsigned long millis) { hodiny=millis/hodina; minuty=(millis%hodina)/minuta; return String(hodiny) + ":" + String(minuty); } void loop() { cas_stary=cas; cas_nyni= ((millis()+cas_offset)%den); //posune hodiny na zacatek zapnuti // hodiny=cas_nyni/hodina; // minuty=(cas_nyni%hodina)/minuta; // cas=String(hodiny) + ":" + String(minuty); cas=cas_prevod(cas_nyni); if (cas_stary!=cas) { // kremikove_nebe(3); melodie(kuku); Serial.println("Cas nyni: " + cas + " (" + rele1_cas1_string + "/" + String(rele1_trvani1/1000) + " " + rele1_cas2_string + "/" + String(rele1_trvani2/1000) + ")"); //String(hodiny)+ ":" + String(minuty)+ " (" + String(cas_nyni)+ ") " ); } if (cas_nyni<(rele1_cas1)) rele1_cas1_zalito=0; //Pred casy if (cas_nyni<(rele1_cas2)) rele1_cas2_zalito=0; if (cas_nyni<(cas_test)) cas_test_zalito=0; if (cas_nyni>(rele1_cas1+rele1_trvani1)) rele1_cas1_zalito=1; //Po casy if (cas_nyni>(rele1_cas2+rele1_trvani2)) rele1_cas2_zalito=1; if (cas_nyni>(cas_test+trvani_test)) cas_test_zalito=1; if ((cas_nyni>rele1_cas1) && (cas_nyni<(rele1_cas1+rele1_trvani1))) rele1_cas1_zalito=2; //Mezi casy if ((cas_nyni>rele1_cas2) && (cas_nyni<(rele1_cas2+rele1_trvani2))) rele1_cas2_zalito=2; if ((cas_nyni>cas_test) && (cas_nyni<(cas_test+trvani_test))) cas_test_zalito=2; if ((rele1_cas1_zalito | rele1_cas2_zalito | cas_test_zalito) > 1 ) { //binary or if (mezicas!="Zaleva se: " + String(rele1_cas1_zalito) + " " + String(rele1_cas2_zalito) ) { mezicas="Zaleva se: " + String(rele1_cas1_zalito) + " " + String(rele1_cas2_zalito); Serial.println(mezicas); t=0; } digitalWrite(hadice_rele1,HIGH); //kremikove_nebe(1); ton_z_melodie(morava, t); //kdyz to zalévá, tak si to při práci zpívá t++; // delay(2000); } else { digitalWrite(hadice_rele1,LOW); // turn relay off noTone(buzzer); // Stop sound... } // read the state of the switch/button: currentState = digitalRead(tlacitko); if(lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if ((pressDuration < SHORT_PRESS_TIME )) { Serial.println("A short press is detected"); digitalWrite(hadice_rele1,LOW); // turn relay off cas_test=9999999999999999; melodie(icacvo); } else if (millis()>10000) { Serial.println("A long press is detected"); digitalWrite(hadice_rele1,HIGH); // turn relay off cas_test=cas_nyni; cas_test_string=cas_prevod(cas_test); Serial.println("Running test... "+ cas_test_string + " Trvani:" + String(trvani_test/1000)); melodie(ovcaci); //kremikove_nebe(5); } } // save the the last state lastState = currentState; // exit(0); }