int stato = 0;
unsigned long postit1;
unsigned long tempochiusura = 10000; //tempo di chiusura automatica
unsigned long lamp;
unsigned long tempolampeg = 1000; //tempo di lampeggio del led di movimento del cancello
void setup() {
Serial.begin(115200);
pinMode(16, INPUT_PULLUP); //pulsante di apertura BT2
pinMode(17, INPUT_PULLUP); //finecorsa 1
pinMode(18, INPUT_PULLUP); //finecorsa 2
pinMode(19, INPUT_PULLUP); //pulsante di chiusura BT1
pinMode(4, OUTPUT); //motore di apertura
pinMode(5, OUTPUT); //motore di chiusura
pinMode(14, OUTPUT); //led movimento cancello
lamp=millis(); //inizio conteggio per far lampeggiare il led
}
void loop() {
//creo uno switch per gestire lo stato del cancello
switch (stato) {
case 0:
chiuso();
break;
case 1:
apertura();
lampeggiante();
break;
case 2:
aperto();
chiusotemp();
break;
case 3:
chiusura();
lampeggiante();
break;
}
}
void chiuso() {
//cancello chiuso aspetta il tasto per attivarsi
if (!digitalRead(16)) {
Serial.println("apre!");
digitalWrite(4, HIGH);
delay(300);
stato = 1;
}
}
void apertura() {
//il cancello si sta aprendo finche non raggiunge il finecorsa 1
if (!digitalRead(17)) {
Serial.println("aperto");
digitalWrite(4, LOW);
delay(300);
stato=2;
postit1=millis();
}
if (!digitalRead(19)) {
//il cancello si sta aprendo e aspetta il tasto di chiusura per chiudersi
Serial.println("mi sto richiudendo!");
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
delay(300);
stato = 3;
}
}
void aperto() {
//il cancello è aperto e aspetta il comando di chiusura
if (!digitalRead(19)){
Serial.println("chiusura!");
digitalWrite(5, HIGH);
delay(300);
stato = 3;
}
}
void chiusura() {
//il cancello si sta chiudendo fino a quando raggiunge il fine corsa 2
if (!digitalRead(18)){
Serial.println("chiuso");
digitalWrite(5, LOW);
delay(300);
stato = 0;
}
if (!digitalRead(16)){
//serve per poter riaprire il cancello in chiusura
Serial.println("mi sto riaprendo");
digitalWrite(5, LOW);
digitalWrite(4, HIGH);
delay(300);
stato = 1;
}
}
void chiusotemp(){
//controlla la chiusura automatica
if ((millis()-postit1)>tempochiusura){
Serial.println("chiusura automatica");
digitalWrite(5, HIGH);
stato = 3;
}
}
void lampeggiante(){
//controlla il lampeggio del led
if (stato==1 || stato==3){
if ((millis()-lamp)>tempolampeg){
digitalWrite(14, !digitalRead(14));
lamp=millis();
}
else digitalWrite(14, LOW);
}
}
BT1
BT2
FC1
FC2
apertura
chiusura
led movimento