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;
}
}