Aiuto per un vecchio appassionato

Un uso di millis() per attendere 3 minuti di treno fermo.

Se hai bisogno di arrestare il treno o farlo ripartire in altre parti del programma, devi mettere stato=0 IL TRENO PARTE, stato=1 IL TRENO SI FERMA.

// descrizione: Partenza Treno, si spegne la croce di S.andrea, il treno rientra in galleria preme un contatto e si interrompe la corsa al treno, 
//si riaccende la Croce di S.Andrea e dopo 3 min riparte il treno




const int  BUTTON = 2;    // pin di input a cui è collegato il pulsante
const int LED_A = 13;       // led A croce di S.Andrea
const int LED_B = 11;       // led B croce di S.Andrea 
const int TRENO = 10;       // Treno collegato al pin digitale 13
// Variabili globali (tutti interi)
int statoButton     = 0;      // stato del pulsante (inizialmente non premuto)
int lastStatoButton = 0;      // ultimo stato del pulsante (per ora non premuto)
int countButton     = 0;      // Conteggio del bottone

unsigned long tempo=0;
byte stato=0; // Se stato vale zero il treno funziona, se stato vale 1 il treno si ferma

// Avvio dell'applicazione


void setup()
{
  pinMode(LED_A, OUTPUT);       // imposta il pin digitale come output
  pinMode(LED_B, OUTPUT);
  pinMode(TRENO, OUTPUT);
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
}

// Avvio del loop
void loop()
{

  // Verifico se l'utente ha premuto il bottone ??? 
  if(digitalRead(BUTTON))
  {
    // Aspetto 15ms per far alzare il dito all'utente
    delay(15);
    // Cambio l'ultimo stato del bottone
    if(lastStatoButton==0) lastStatoButton=1;
    else lastStatoButton=0;
    // Aumento il count del bottone
    if(countButton<=3) countButton=countButton+1;
    else countButton=0;
  }

  // In base allo stato del bottone scelgo l'azione del led
  switch (countButton)
  {
    // Led lampeggia ogni mezzo secondo
  case 1:
    digitalWrite(LED_A, HIGH);  // accende il LED
    delay(500);              // aspetta un secondo
    digitalWrite(LED_B, LOW);   // spegne il LED
    delay(500);              // aspetta un secondo
     digitalWrite(LED_B, HIGH);  // accende il LED
    delay(500);              // aspetta un secondo
    digitalWrite(LED_A, LOW);   // spegne il LED
    stato=1; // Ferma il treno
	tempo=millis(); // Inizia il conteggio
     
    break;
// quando il treno arriva in galleria c'è lo switch o tasto ma la funzione dovrebbe portarmi il riavvio dell loop come faccio???
  }
  if(stato){// Ferma il treno se stato vale 1
  
      digitalWrite(LED_A, LOW);
      digitalWrite(LED_B, LOW);
      digitalWrite(TRENO, LOW); 
  
  }else{
	  
	  digitalWrite(TRENO, HIGH); // Se stato vale 0 il treno è in moto
  }
  
  if(stato==1 && millis()-tempo >= (3*60*1000)){
	  /* Se stato è uguale a uno e sono passati 
	     tre minuti, mette stato a zero e quindi accende il treno */
       stato=0;
  }
}