#define ESTADO_NOCHE_TEMPRANA 1
#define ESTADO_NOCHE_TARDIA 2
#define ESTADO_APAGADO 1
#define ESTADO_ENCENDIDO 2
#define ESTADO_NO_PULSADO 1
#define ESTADO_ANTIRREBOTES 2
#define ESTADO_PULSADO 3
#define PULSADOR_PRESIONADO 0
#define TIEMPO_NOCHE_TEMPRANA (1000L * (4*3600 + 30*60 + 0))
#define TIEMPO_ENCENDIDO_MANUAL (1000L * (1*3600 + 0*60 + 0))
#define TIEMPO_ANTIRREBOTES (50)
const int PIN_LUCES = 13;
const int PIN_PULSADOR = A1;
int estado_noche, estado_luces, estado_pulsador;
int pulsador_pulsado;
long unsigned int temporizador_1, temporizador_2, temporizador_3;
void setup() {
pinMode(PIN_PULSADOR, INPUT_PULLUP);
pinMode(PIN_LUCES, OUTPUT);
estado_noche = ESTADO_NOCHE_TEMPRANA;
estado_luces = ESTADO_ENCENDIDO;
estado_pulsador = ESTADO_NO_PULSADO;
temporizador_1 = millis() + TIEMPO_NOCHE_TEMPRANA;
temporizador_2 = millis();
}
void loop() {
//
// Evolucion de los estados
//
if (estado_noche == ESTADO_NOCHE_TEMPRANA) {
if (millis() > temporizador_1) {
estado_noche = ESTADO_NOCHE_TARDIA;
estado_luces = ESTADO_APAGADO;
}
}
if (estado_luces == ESTADO_APAGADO) {
if (flanco_pulsador() == 1) {
estado_luces = ESTADO_ENCENDIDO;
temporizador_2 = millis() + TIEMPO_ENCENDIDO_MANUAL;
}
}
if (estado_luces == ESTADO_ENCENDIDO) {
if (flanco_pulsador() == 1) {
estado_luces = ESTADO_APAGADO;
}
if ((estado_noche != ESTADO_NOCHE_TEMPRANA) && (millis() > temporizador_2)) {
estado_luces = ESTADO_APAGADO;
}
}
if (estado_pulsador == ESTADO_NO_PULSADO) {
if (digitalRead(PIN_PULSADOR) == PULSADOR_PRESIONADO) {
estado_pulsador = ESTADO_ANTIRREBOTES;
temporizador_3 = millis() + TIEMPO_ANTIRREBOTES;
}
}
if (estado_pulsador == ESTADO_ANTIRREBOTES) {
if (millis() > temporizador_3) {
estado_pulsador = ESTADO_PULSADO;
pulsador_pulsado = 1;
}
}
if (digitalRead(PIN_PULSADOR) != PULSADOR_PRESIONADO) {
estado_pulsador = ESTADO_NO_PULSADO;
}
//
// Salidas digitales según los estados
//
if (estado_luces == ESTADO_ENCENDIDO) {
digitalWrite(PIN_LUCES, HIGH);
}
if (estado_luces == ESTADO_APAGADO) {
digitalWrite(PIN_LUCES, LOW);
}
}
int flanco_pulsador(void) {
if (pulsador_pulsado == 1) {
pulsador_pulsado = 0;
return 1;
}
return 0;
}