Lépcsőzetes időzítés

Lépcsőzetes időzítés az öntőzőrendszer relészigetének az időzítéséhez. A 8. reléportra a "master" szelepet kötöm; ennek nyitnia kell, ha bármelyik másik szelep is nyit. Az indítások közötti várakozási idő és a szelepek nyitásának ideje a programban állítható. A program a ide monitorra kijelzi, hogy éppen hol tart. Az időzítéshez a millis() funkciót használtam fel, semmi delay..

A 8 elemű relé-sziget az 5. és 12. pin közé lett huzalozva

#define valve_1 5
#define valve_2 6
#define valve_3 7
#define valve_4 8
#define valve_5 9
#define valve_6 10
#define valve_7 11
#define valve_8 12

unsigned long pause_mil, prev_mil, current_mil, gap_mil; 
int valve_time[] = {20, 4, 4, 8, 5, 8, 5, 4, 3};   // valve running times in sec; first is standby time
int max_valve, valve_nr, valve_nr_old;


void setup() {
  Serial.begin(9600);
  pinMode(valve_1, OUTPUT);
  pinMode(valve_2, OUTPUT);
  pinMode(valve_3, OUTPUT);
  pinMode(valve_4, OUTPUT);
  pinMode(valve_5, OUTPUT);
  pinMode(valve_6, OUTPUT);
  pinMode(valve_7, OUTPUT);
  pinMode(valve_8, OUTPUT);  // master valve, its need open, if an other valve is opened
  
  pause_mil = 60*1000; // 1 minute
  gap_mil = 1000;      // 1 sec
  max_valve = 7;       // 7 valves
  prev_mil = millis(); // start with pause
  valve_nr = 99;       // init value
  valve_nr_old = 0;    // nr of valve to open; 0: standby

}

void loop() {
  current_mil = millis();  // read time
  // waiting for standby


    if (abs(current_mil - prev_mil) > pause_mil) {   // standby time is over
      valve_nr = valve_nr + 1;
      prev_mil = current_mil;
    }    

 if (not(valve_nr == valve_nr_old)) {     // change phase

    if (valve_nr > max_valve) {          // all valves runout
      valve_nr = 0;
    }
    valve_nr_old = valve_nr;

        
      if (valve_nr == 0) {
        Serial.print("Standby, waiting time: ");
      } 
      else {
        Serial.print("Valve ");
        Serial.print(valve_nr);
        Serial.print(", running time ");
      }
    
      Serial.print(valve_time[valve_nr]);
      Serial.println(" sec");
  
    
    pause_mil = valve_time[valve_nr] * 1000;      // waiting s -> msec
  }
  for (int thisPin = 1; thisPin < 8; thisPin++) {
    if (thisPin == valve_nr) {
      digitalWrite(thisPin + 4, LOW);            // relais-island is low-activ!
    }
    else {
      digitalWrite(thisPin + 4, HIGH);  
    }
  }
  if (not(valve_nr == 0)) {
     digitalWrite(valve_8, LOW);            // master-valve, relais-island is low-activ!    
  }
  else {
    digitalWrite(valve_8, HIGH);  
  }  
}