#include <Bounce2.h>
typedef enum {Chiuso, Apertura, Aperto, Chiusura, Emergenza, Arresto} Staticancello;
int pinFc1 = 13;
int pinFc2 = 3;
int pinPa = 8;
int pinPc = 7;
int pinL = 4;
int pinB = 12;
bool MotoreOnOff;
bool Motoreverso;
bool Luce;
Bounce2::Button Pa = Bounce2::Button();
Bounce2::Button Pc = Bounce2::Button();
Bounce2::Button Fc1 = Bounce2::Button();
Bounce2::Button Fc2 = Bounce2::Button();
Bounce2::Button B = Bounce2::Button();
Staticancello Stato = Chiuso;
// variabili per la chiusura temporizzata
unsigned long t0;
unsigned long t;
void setup() {
Serial.begin(115200);
Pa.attach(pinPa, INPUT_PULLUP);
Pc.attach(pinPc, INPUT_PULLUP);
Fc1.attach(pinFc1, INPUT_PULLUP);
Fc2.attach(pinFc2, INPUT_PULLUP);
B.attach(pinB, INPUT_PULLUP);
pinMode(pinL, OUTPUT);
}
void loop() {
Pa.update();
Pc.update();
Fc1.update();
Fc2.update();
B.update();
switch (Stato) {
case Chiuso:
digitalWrite(MotoreOnOff, LOW);
digitalWrite(Motoreverso, LOW);
digitalWrite(pinL, LOW);
if (Pa.fell()) {
Stato = Apertura;
Serial.println("Il cancello si sta aprendo.");
}
break;
case Apertura:
digitalWrite(MotoreOnOff, HIGH);
digitalWrite(Motoreverso, HIGH);
digitalWrite(pinL, HIGH);
if (Fc2.fell()) {
Stato = Aperto;
t0 = millis(); // e conto i 30 secondi a partire da questo istante
Serial.println("Il cancello si è aperto.");
}
else if (B.fell()) {
Stato = Emergenza;
Serial.println("EMERGENZA");
}
else if (Pa.fell()) {
Stato = Arresto;
Serial.println("Il cancello è fermo.");
}
break;
case Aperto:
digitalWrite(MotoreOnOff, LOW);
digitalWrite(Motoreverso, LOW);
digitalWrite(pinL, LOW);
//è STATO PREMUTO Pc
if (Pc.fell()) {
Stato = Chiusura;
Serial.println("Il cancello si sta chiudendo.");
}
// è scaduto il tempo
t = millis();
if ( t - t0 >= 10000) {
Stato = Chiusura;
Serial.println("Il cancello si sta chiudendo.");
}
break;
case Chiusura:
digitalWrite(MotoreOnOff, HIGH);
digitalWrite(Motoreverso, LOW);
digitalWrite(pinL, HIGH);
if (Fc1.fell()) {
Stato = Chiuso;
Serial.println("Il cancello si è chiuso.");
}
else if (B.fell()) {
Stato = Emergenza;
Serial.println("EMERGENZA");
}
else if (Pc.fell()) {
Stato = Arresto;
Serial.println("Il cancello è fermo.");
}
break;
case Emergenza:
digitalWrite(MotoreOnOff, LOW);
digitalWrite(Motoreverso, LOW);
digitalWrite(pinL, HIGH);
if (Pa.fell()) {
Stato = Apertura;
Serial.println("Il cancello si sta aprendo.");
}
else if (Pc.fell()) {
Stato = Chiusura;
Serial.println("Il cancello si sta chiudendo.");
}
break;
case Arresto:
digitalWrite(MotoreOnOff, LOW);
digitalWrite(Motoreverso, LOW);
digitalWrite(pinL, HIGH);
if (Pa.fell()) {
Stato = Apertura;
Serial.println("Il cancello si sta aprendo.");
}
else if (Pc.fell()) {
Stato = Chiusura;
Serial.println("Il cancello si sta chiudendo.");
}
break;
}
}