#define INGR 8 //.... <--pin Arduino per ingressi e uscite
#define LE1 5 //....
#define LE2 6 //....
#define LAMP 7 //....
#define CHIUSO 1//.... <--livello a interruttore chiuso
#define APERTO !CHIUSO
#define SPENTO 0 //.... <--livello LED spenti
#define ACCESO !SPENTO
boolean onClose; //true un ciclo quando interruttore chiude
boolean onOpen; //true un ciclo quando interruttore apre
boolean luciAccese = false; //true se luci accese
//----------------------------------------------------------
void setup()
{
pinMode(INGR, INPUT);
pinMode(LE1, OUTPUT);
digitalWrite(LE1, SPENTO);
pinMode(LE2, OUTPUT);
digitalWrite(LE2, SPENTO);
pinMode(LAMP, OUTPUT);
digitalWrite(LAMP, SPENTO);
}
void loop()
{
leggiIngresso();
logica();
blink();
}
void leggiIngresso()
{
static uint32_t t = millis();
static byte stato = 0;
static byte inPrec = digitalRead(INGR);
byte in = digitalRead(INGR);
onClose = false;
onOpen = false;
switch(stato)
{
case 0: //attendi
if (in != inPrec)
{
t = millis();
stato = 1;
}
break;
case 1: //timer
if (in == inPrec)
{
stato = 0;
}
else if (millis()-t >= 50)
{
stato = 0;
inPrec = in;
if (CHIUSO == in) { onClose = true; }
else { onOpen = true; }
}
break;
}
}
void comanda(char n)
{
if (-1 == n)
{
digitalWrite(LE1, SPENTO);
digitalWrite(LE2, SPENTO);
}
else if (0 == n)
{
digitalWrite(LE1, ACCESO);
digitalWrite(LE2, SPENTO);
}
else if ((1 == n) || (3 == n))
{
digitalWrite(LE1, ACCESO);
digitalWrite(LE2, ACCESO);
}
else if (2 == n)
{
digitalWrite(LE1, SPENTO);
digitalWrite(LE2, ACCESO);
}
}
//----------------------------------------------------------
void logica()
{
static byte stato = 0;
static uint32_t t;
static byte seq = 0;
switch(stato)
{
case 0: //spento
if (onClose)
{
comanda(seq);
luciAccese = true;
t = millis();
stato = 1;
}
break;
case 1: //acceso
if (onOpen)
{
t = millis();
stato = 2;
}
else if (millis()-t > 1800000L)
{
comanda(-1);
luciAccese = false;
stato = 3;
}
break;
case 2: //attesa 500ms
if (onClose)
{
seq = (seq + 1) % 4;
comanda(seq);
stato = 1;
}
else if (millis()-t >= 500)
{
comanda(-1);
luciAccese = false;
stato = 0;
}
break;
case 3: //standby
if (onOpen) { stato = 0; }
break;
}
}
void blink()
{
static byte stato = 0;
static uint16_t t;
switch(stato)
{
case 0: //spento
if (luciAccese)
{
t = millis();
stato = 1;
}
else
{
digitalWrite(LAMP, SPENTO);
}
break;
case 1: //acceso
if (!luciAccese)
{
stato = 0;
}
else if ((uint16_t)millis()-t >= 50)
{
t += 1950;
stato = 2;
}
else
{
digitalWrite(LAMP, ACCESO);
}
break;
case 2: //pausa
if (!luciAccese)
{
stato = 0;
}
else if ((uint16_t)millis()-t >= 1950)
{
t += 50;
stato = 1;
}
else
{
digitalWrite(LAMP, SPENTO);
}
break;
}
}