#include<Servo.h>
//===========================================================
const byte LED_A = 13;
const byte LED_B = 12;
const byte PIN_PULS = 5;
const byte PREMUTO = LOW;
byte fasePL = 1;
byte fasePLprec = ~fasePL;
bool lampeggioAbilitato = 0;
bool avvioChiusura = 0;
unsigned long tPL;
unsigned long now;
const byte PIN_SERVO_A = 4;
const byte MAXPOS = 90;
const byte MINPOS = 0;
byte pos = MINPOS;
Servo myservoA;
//===========================================================
void setup(void)
{
pinMode(PIN_PULS, INPUT_PULLUP);
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
myservoA.attach(PIN_SERVO_A);
myservoA.write(pos);
}
//===========================================================
void loop(void)
{
now = millis();
if (digitalRead(PIN_PULS) == PREMUTO)
{
avvioChiusura = 1;
}
gestionePL();
lampeggiante();
}
//===========================================================
void gestionePL(void)
{
// azzera tempo trascorso se fase cambiata
if (fasePL != fasePLprec)
{
fasePLprec = fasePL;
tPL = now;
}
unsigned long trascorso = now - tPL;
// fase attesa comando chiusura P.L.
if ((fasePL == 1) && (avvioChiusura == 1))
{
lampeggioAbilitato = 1;
fasePL = 2;
}
// fase pausa 3s con solo lampeggio luci
else if ((fasePL == 2) && (trascorso >= 3000))
{
fasePL = 3;
}
// fase chiusura lenta
else if ((fasePL == 3) && (trascorso >= 30))
{
pos += (pos < MAXPOS);
myservoA.write(pos);
tPL = now;
if (pos == MAXPOS)
{
fasePL = 4;
}
}
// fase pausa 10s chiuso
else if ((fasePL == 4) && (trascorso >= 10000))
{
fasePL = 5;
}
// fase apertura lenta
else if ((fasePL == 5) && (trascorso >= 30))
{
pos -= (pos > MINPOS);
myservoA.write(pos);
tPL = now;
if (pos == MINPOS)
{
fasePL = 6;
}
}
// fase pausa 3s con solo lampeggio luci
else if ((fasePL == 6) && (trascorso >= 3000))
{
avvioChiusura = 0;
lampeggioAbilitato = 0;
fasePL = 1;
}
else // se nessuna delle precedenti
{
// nessuna operazione
}
}
//===========================================================
void lampeggiante(void)
{
if (lampeggioAbilitato)
{
bool sl = ((now % 1000) < 500);
digitalWrite(LED_B, sl);
digitalWrite(LED_A, !sl);
}
else
{
digitalWrite(LED_A, LOW); // entrambi spenti
digitalWrite(LED_B, LOW);
}
}
//===========================================================