// verzija 3_2 apemenljivka cas se avtomatsko poveča cas++ vsakih 100ms v delu LOOPa ki je zadolžen za čas //Za čakajne da preteče določen čas se ga na začetku merjenja postavi na 0, //potem pa se v naslednjem case čaka da bo dosegel željeno vrednost T1 , T2 in podobno. //DRŽAL SEM SE PRAVILA: - vedno ko se spremenim k- prestopim v novi korak (s k++ ali k=__ ) tudi cas nastavim na 0 in s tem startam merjenje časa ki ga bo preverjal naslednji korak. // enako tudi za v, ko ga spremenim - prestopim v mnovi kolrak , cas_v nastavim na 0 iz istega razloga // - v vsakem koraku (case) ki čaka na pretek določenega časa je ta čas naveden v pogoju za prehod "if (cas >= T) {" // (prej je bila ta vrednost nastavljena v prejšnjem koraku in je prihajalo do zmede pri razumevanju delovanja) // - v korakih g ne delamo s časom, zato tam ni sprememb // verzija 4_0 v njej je upoštevano: // 1.- v K==1 ko sveti rdeča lučka se preverjajo vsi začetni pogoji 1)vrat, 2)stikala za nivo vode in 3)termostat=stikalo grelca // - v k==2 se ugasne rdeča lučka in se čaka na tipko start, medtem se preverjajo vsi pogoji če eden ali kateri manjka se vrne v k=1 // 2. - dovoljeno je večkratno dotakanje vode V==1 in V==2, vse do trenutka ko se vklopi črpalka V==3, takrat se ventil za dotok vode izklopi, če je bil v tem trenutku morda vklopljen // 3. - v trtenutku zapiranja vode V1->V2 se starta grelec G=1 samo prvič ko je še G v mirovanju na G==0 #define T1 50 // = 5 sek #define T2 10 #define T3 20 #define T4 100 #define T5 80 bool start; bool stikalo_nivo; bool stikalo_grelec; bool vrata; bool on; bool off; bool ventil; bool crpalka; bool ozemanje; bool pranje_L; bool pranje_D; bool grelec; int k; int v; int g; unsigned long sedaj; unsigned long prej; unsigned long cas; unsigned long cas_v; //drugi odštevalnik časa int stevec; //stevec pralnih ciklov //_________________________________________________________________________________________________________// void setup() { Serial.begin (9600); pinMode(A0, INPUT_PULLUP); //start pinMode(A1, INPUT_PULLUP); //vrata pinMode(A2, INPUT_PULLUP); //stikalo_nivo pinMode(A3, INPUT_PULLUP); //stikalo_grelec pinMode(11, OUTPUT); //on pinMode(12, OUTPUT); //off pinMode(2, OUTPUT); //ventil pinMode(3, OUTPUT); //crpalka pinMode(4, OUTPUT); //ozemanje pinMode(5, OUTPUT); //pranje_L pinMode(6, OUTPUT); //pranje_D pinMode(7, OUTPUT); //grelec k = 1; v = 0; g = 0; } //_________________________________________________________________________________________________________// void loop() { /* start = digitalRead(A0); vrata = digitalRead(A1); stikalo_nivo = digitalRead(A2); stikalo_grelec = digitalRead(A3); */ // za print na COM if (Serial.available() > 0) { switch(Serial.read()){ case '1': start = !start; break; case '2': vrata = !vrata; break; case '3': stikalo_nivo = !stikalo_nivo; break; case '4': stikalo_grelec = !stikalo_grelec; break; } // konec switch } // konec if Serial.print(" I:"); Serial.print(start); Serial.print(vrata); Serial.print(stikalo_nivo); Serial.print(stikalo_grelec); Serial.print(" Q:"); Serial.print(on); Serial.print(off); Serial.print(ventil); Serial.print(crpalka); Serial.print(ozemanje); Serial.print(pranje_L); Serial.print(pranje_D); Serial.print(grelec); Serial.print(" stevec:"); Serial.print(stevec); Serial.print(" k:"); Serial.print(k); Serial.print(" v:"); Serial.print(v); Serial.print(" g:"); Serial.print(g); Serial.print(" cas:"); Serial.print(cas); Serial.print(" cas_v:"); Serial.print(cas_v); Serial.print("\n"); //funkcija preko millis(); bere prosto tekoči timer in vsakih 100ms prišteva cas in cas_v sedaj = millis(); if (sedaj - prej >= 100) { //100 ms = 0,1 s prej = sedaj; cas++; cas_v++; } //__________________________________________________________// switch (k) { case 1: v = 0; g = 0; stevec = 0; on = 0; off = 1; ventil = 0; crpalka = 0; ozemanje = 0; pranje_L = 0; pranje_D = 0; grelec = 0; if ( vrata == 1 && stikalo_nivo == 0 && stikalo_grelec == 0) { //začetni pogoji k++; cas=0; } break; case 2: off = 0; if (vrata == 0 || stikalo_nivo == 1 || stikalo_grelec == 1) { // Če se med čakanjem na tipko start vrata ponovno odprejo ali zazna voda v bobnu ali zazna temperatura idi v k==1 in ponovno vklopi LED off ter čaka da se vrata zaprejo k=1; cas = 0; } if (start == 1) { //v tem stanju ko so vrata zaprta in ostala sitkala v pravem položaju se pranje začne, ko pritisnemo tipko start v = 1; k++; cas = 0; } break; case 3: on = 1; //zelena if (cas >= T1) { k++; cas = 0; } break; case 4: pranje_L = 1; if (cas >= T3) { k++; cas = 0; } break; case 5: pranje_L = 0; if (cas >= T2) { k++; cas = 0; } break; case 6: pranje_D = 1; if (cas >= T3) { k++ ; cas = 0; if (g == 2) { //ko je potekel čas za pranje desno, preveri tudi če je grelec končal gretje in se izklopil, stevec++; // potem povečaj števec } } break; case 7: pranje_D = 0; if (stevec == 3) { //v tem koraku se pranje desno izklopi, takoj preveri števec, če je 3 ne čaka ampak vklopi vodo in zaključi obračanje motorja v = 3; k = 0; cas = 0; } if (cas >= T2) { //če števec še ni 3 se čaka da bo potekel čas in nato idi ponovno na vrtenje motorja. k = 4; cas = 0; } break; } //konec switch k //__________________________________________________________// switch (v) { case 1: ventil = 1; if (stikalo_nivo == 1) { v++; cas_v=0; if (g == 0){ // če grelec še ne deluje g = 1; //startaj grelec } } break; case 2: ventil = 0; if (stikalo_nivo == 0) { //če voda pade, idi v ponovno dotakanje, dovoljeno tudi ko je grelec že izklopljen v = 1; cas_v=0; } break; case 3: crpalka = 1; ventil = 0; if (stikalo_nivo == 0) { //med črpanjem vode se čaka da bo nivo vode padel, nato idi v korak za ožemanje v++; cas_v = 0; } break; case 4: ozemanje = 1; if (cas_v >= T4) { //po času T4 idi v izklop črpalke in ožemanja v++; cas_v = 0; } break; case 5: crpalka = 0; ozemanje = 0; if (cas_v >= T5) { //po času idi T5 idi v oranžno v++; cas_v = 0; } break; case 6: off = 1; //rdeča on = 1; //zelena - skupaj sveti oranžna if (vrata==0) { //čakaj da se vrata odprejo, nato idi na začetek k=1; cas=0; } break; } //konec switch v //__________________________________________________________// switch (g) { case 1: grelec = 1; if (stikalo_grelec == 1) { g++; } break; case 2: grelec = 0; break; } //konec switch g digitalWrite(11, on); digitalWrite(12, off); digitalWrite(2, ventil); digitalWrite(3, crpalka); digitalWrite(4, ozemanje); digitalWrite(5, pranje_L); digitalWrite(6, pranje_D); digitalWrite(7, grelec); }