/* Cancello automatico (MSF)
* Autore: DL
* Classe: 2 ELE A
* Data inizio: 25/03/2025
* Versione: 0.1
*/
// impiego la libreria Bounce2 per filtrare i rimbalzi dei pulsanti
#include <Bounce2.h>
// mappa degli ingressi
const int pinPa = 2;
const int pinPc = 3;
const int pinFCa = 4;
const int pinFCc = 5;
const int pinBarriera = 6;
const int pinCordino = 7;
// mappa delle uscite
const int pinMotoreOnOff = 10;
const int pinMotoreVerso = 11;
// dichiaro i pulsanti virtuali con debounce
Bounce2::Button Pa = Bounce2::Button();
Bounce2::Button Pc = Bounce2::Button();
Bounce2::Button FCa = Bounce2::Button();
Bounce2::Button FCc = Bounce2::Button();
Bounce2::Button Barriera = Bounce2::Button();
Bounce2::Button Cordino = Bounce2::Button();
// tipo dati per rappresentare gli stati del motore
typedef enum { CHIUSO,
APERTURA,
APERTO,
CHIUSURA,
EMERGENZA,
FERMO } tStati;
// tipo dati per lo stato del motore
typedef enum { SPENTO = LOW,
ACCESO = HIGH } tMotore;
// tipo dato per il verso del motore
typedef enum { APRI = LOW,
CHIUDI = HIGH } tVerso;
// dichiaro la variabile per lo stato
tStati stato = CHIUSO;
void setup() {
// configuro le uscite
pinMode(pinMotoreOnOff, OUTPUT);
digitalWrite(pinMotoreOnOff, SPENTO);
pinMode(pinMotoreVerso, OUTPUT);
// configuro gli ingressi
Pa.attach(pinPa, INPUT_PULLUP);
Pc.attach(pinPc, INPUT_PULLUP);
FCa.attach(pinFCa, INPUT_PULLUP);
FCc.attach(pinFCc, INPUT_PULLUP);
Barriera.attach(pinBarriera, INPUT_PULLUP);
Cordino.attach(pinCordino, INPUT_PULLUP);
// Seriale
Serial.begin(9600);
Serial.println("Cancelli automatici Malignani & Co");
}
void loop() {
// aggiornare ciclicamente tutti i pulsanti virtuali:
Pa.update();
Pc.update();
FCa.update();
FCc.update();
Barriera.update();
Cordino.update();
// codifica della MSF e gestione uscite e transizioni di stato
switch (stato) {
case CHIUSO:
// comando delle uscite
digitalWrite(pinMotoreOnOff, SPENTO);
digitalWrite(pinMotoreVerso, APRI);
// se premo Pa passo allo stato APERTURA
if (Pa.fell()) {
stato = APERTURA;
}
break;
case APERTURA:
// comando delle uscite
digitalWrite(pinMotoreOnOff, ACCESO);
digitalWrite(pinMotoreVerso, APRI);
// se premo Pa passo allo stato APERTURA
if (FCa.fell()) {
stato = APERTO;
} else if (Pc.fell()) {
stato = FERMO;
} else if (Cordino.fell()) {
stato = EMERGENZA;
}
break;
case APERTO:
// comando delle uscite
digitalWrite(pinMotoreOnOff, SPENTO);
digitalWrite(pinMotoreVerso, CHIUDI);
// transizioni di stato
if (Pc.fell()) {
stato = CHIUSURA;
}
break;
case CHIUSURA:
// comando le uscite
digitalWrite(pinMotoreOnOff, ACCESO);
digitalWrite(pinMotoreVerso, CHIUDI);
// transizioni di stato
if (FCc.fell()) {
stato = CHIUSO;
} else if (Barriera.fell()) {
stato = EMERGENZA;
}
break;
case EMERGENZA:
// comando le uscite
digitalWrite(pinMotoreOnOff, SPENTO);
// transizioni di stato
if (Pa.fell()) {
stato = APERTURA;
} else if (Pc.fell()) {
stato = CHIUSURA;
}
break;
case FERMO:
// comando le uscite
digitalWrite(pinMotoreOnOff, SPENTO);
// transizioni di stato
if (Pa.fell()) {
stato = APERTURA;
} else if (Pc.fell()) {
stato = CHIUSURA;
}
break;
default: // gestione dell'errore sulla variabile di stato
stato = EMERGENZA;
Serial.println("Errore sulla variabile di stato");
break;
} // fine switch-case
}
Pa
Pc
FCa
FCc
Barr
Cord
On/Off
Verso