#include<Bounce2.h>
//fc1 13, pa 11, pc 10, fc2 8, led 5
int pinLed = 5;
int pinFC1 = 13;
int pinFC2 = 8;
int pinPa = 11;
int pinPc = 10;
int pinAllarm = 7;
int MotoreOnOff;
int MotoreVerso = LOW;
//dichiaro i pulsanti virtuali e le fotocellule
Bounce2::Button Pa = Bounce2::Button();
Bounce2::Button Pc = Bounce2::Button();
Bounce2::Button FC1 = Bounce2::Button();
Bounce2::Button FC2 = Bounce2::Button();
Bounce2::Button Allarm = Bounce2::Button();
//DICHIARO LE UNITà DI TEMPO
int t0=millis();
int t=millis();
typedef enum {
Chiuso, Chiusura, Aperto, Apertura, Emergenza, Blocco
}Staticancello;
//dichiaro la variabile stato a valori finiti
Staticancello stato = Chiuso;
void setup() {
// collego i pulsanti virtuali
Pa.attach(pinPa,INPUT_PULLUP);
Pc.attach(pinPc,INPUT_PULLUP);
FC1.attach(pinFC1,INPUT_PULLUP);
FC2.attach(pinFC2,INPUT_PULLUP);
Allarm.attach(pinAllarm,INPUT_PULLUP);
//collego il led
pinMode(pinLed, OUTPUT);
//apro comunicazione seriale
Serial.begin(9600);
Serial.println("Il cancello è chiuso.");
}
void loop() {
// put your main code here, to run repeatedly:
Pa.update();
Pc.update();
FC1.update();
FC2.update();
Allarm.update();
switch (stato){
case Chiuso:
MotoreOnOff = LOW;
MotoreVerso = LOW;
digitalWrite(pinLed, LOW);
if(Pa.fell()){
stato = Apertura;
Serial.println("Il cancello si sta aprendo...");
}
break;
case Apertura:
MotoreOnOff = HIGH;
MotoreVerso = HIGH;
digitalWrite(pinLed, HIGH);
if(Pa.fell()){
stato = Blocco;
Serial.println("Il cancello è in blocco");
}else if(Allarm.fell()){
stato = Emergenza;
Serial.println("Emergenza");
}else if(FC2.fell()){
stato = Aperto;
Serial.println("Il cancello è aperto.");
t0=millis();
}
break;
case Aperto:
t=millis();
MotoreOnOff = LOW;
MotoreVerso = LOW;
digitalWrite(pinLed, LOW);
if(Pc.fell()){
stato = Chiusura;
Serial.println("Il cancello si sta chiudendo...");
}else if((t-t0)>=5000){
stato = Chiusura;
Serial.println("Il cancello si sta chiudendo...");
}
break;
case Chiusura:
MotoreOnOff = HIGH;
MotoreVerso = LOW;
digitalWrite(pinLed, HIGH);
if(Pc.fell()){
stato = Blocco;
Serial.println("Il cancello è in blocco");
}else if(Allarm.fell()){
stato = Emergenza;
Serial.println("Emergenza");
}else if(FC1.fell()){
stato = Chiuso;
Serial.println("Il cancello è chiuso.");
}
break;
case Emergenza:
MotoreOnOff = LOW;
MotoreVerso = LOW;
digitalWrite(pinLed, HIGH);
if(Pc.fell()){
stato = Chiusura;
Serial.println("Il cancello si sta chiudendo...");
}else if(Pa.fell()){
stato = Apertura;
Serial.println("Il cancello si sta aprendo...");
}
break;
case Blocco:
MotoreOnOff = LOW;
MotoreVerso = LOW;
digitalWrite(pinLed, HIGH);
if(Pc.fell()){
stato = Chiusura;
Serial.println("Il cancello si sta chiudendo...");
}else if(Pa.fell()){
stato = Apertura;
Serial.println("Il cancello si sta aprendo...");
}
break;
}
}