Start programma, stop e memoria posizione

Una sequenza con "delay interrompibili" più KISS di questa non riesco a pensarla: https://wokwi.com/projects/384209310516219905

Contatto di stop di tipo normalmente chiuso per sicurezza.

Riepilogo
#define START   A0    // pull-down normalmente 0 (contatto NO)
#define STOP    A1    // pull-down normalmente 1 (contatto NC)

byte   fase = 0;
byte   ripetizioni = 0;

//==============================================

// delay interrompibile, dt in secondi
bool dly(int dt) {
    for (int n=0; n<(dt*100); n++) {
        delay(10);
        if (1==fase  &&  digitalRead(STOP)==0) {
           fase = 2;
           return 1;
        }
    }
    return 0;
}

//==============================================

void setup() {
    Serial.begin(115200);
    pinMode(START, INPUT);
    pinMode(STOP,  INPUT);
}


void loop() {

    switch(fase) {

      case 0:  // attesa avvio
          if (digitalRead(START)==1) {
             Serial.println("Avvio sequenza");
             if (0 == ripetizioni) ripetizioni = 5; 
             fase = 1;
          }
      break;

      case 1:  // esecuzione sequenze
          Serial.println("------------------------");
          Serial.print("Inizio ciclo: -");
          Serial.println(ripetizioni);
          Serial.println("------------------------");
          Serial.println("ASPIRAZIONE");
          Serial.println("   Apri valvola aspirazione");
          if (dly(1)) break;
          Serial.println("   Accendi pompa vuoto");
          if (dly(1)) break;
          Serial.println("   Chiudi valvola aspirazione");
          if (dly(1)) break;
          Serial.println("   Spegni pompa vuoto");
          if (dly(1)) break;
          Serial.println("SCARICO ARIA");
          Serial.println("   Apri valvola scarico aria");
          if (dly(1)) break;
          Serial.println("   Chiudi valvola scarico aria");
          if (dly(1)) break;
          Serial.println("RIEMPIMENTO");
          Serial.println("   Apri valvola carico olio");
          if (dly(1)) break;
          Serial.println("   Chiudi valvola carico olio");
          if (dly(1)) break;
          Serial.println("SCARICO ARIA");
          Serial.println("   Apri valvola scarico aria");
          if (dly(1)) break;
          Serial.println("   Chiudi valvola scarico aria");
          if (dly(1)) break;
          ripetizioni--;
          if (ripetizioni == 0) { 
              Serial.println("Finito cicli.");
              fase = 0;
          }
      break;

      case 2:  // fase di stop
          Serial.println("------------------------");
          Serial.println("Interruzione ciclo...");
          Serial.println("------------------------");
          Serial.println("Chiudi valvola carico olio");
          Serial.println("Chiudi valvola aspirazione");
          Serial.println("Spegni pompa vuoto");
          Serial.println("Apri valvola scarico aria");
          dly(1);
          Serial.println("Chiudi valvola scarico aria");
          Serial.println("Finito stop.");
          Serial.println("------------------------");
          fase = 0;
      break;
    }

}
3 Likes