// Ejemplo de Luz domótica
//Luz domótica --> Invertir estado de una luz al presionar un botón
//Con dos toques de botón--> Encender la luz temporizada (5 seg)
//Si no pasó más de cierto tiempo desde el último toque
// --> Incrementar contador de toques
#define PIN_LED 13
#define CONFIGURAR_LED pinMode(PIN_LED, OUTPUT)
#define ENCENDER_LED digitalWrite(PIN_LED, HIGH)
#define APAGAR_LED digitalWrite(PIN_LED, LOW)
#define PIN_LUZ 11
#define CONFIGURAR_LUZ pinMode(PIN_LUZ, OUTPUT)
#define ENCENDER_LUZ digitalWrite(PIN_LUZ, HIGH)
#define APAGAR_LUZ digitalWrite(PIN_LUZ, LOW)
#define PIN_BOT 7
#define CONFIGURAR_BOT pinMode(PIN_BOT, INPUT)
#define BOT_PRESIONADO (digitalRead(PIN_BOT)==HIGH)
#define MS_ESPERA 1000 //Tiempo de espera desde la última pulsacion
#define MS_TEMPORIZADOR 2000
bool luz=0;
byte toques=0; //Cantidad de toques del botón
unsigned long millis_ini_luz=0; //Para el temporizador de apagado
void setup()
{
CONFIGURAR_LED;
CONFIGURAR_BOT;
CONFIGURAR_LUZ;
APAGAR_LUZ;
Serial.begin(9600);
}
//-------------------------------------------------------
bool SePresionoBoton(void)
{
static bool bot_presionado_ant=0;
if(BOT_PRESIONADO == bot_presionado_ant) return(0);
bot_presionado_ant=BOT_PRESIONADO;
return(BOT_PRESIONADO);
}
//-------------------------------------------------------
void InvertirLuz(void)
{
luz = !luz;
if(luz) ENCENDER_LUZ;
else APAGAR_LUZ;
}
//-------------------------------------------------------
void SupervisarToquesBoton(void)
{
static char cont=0;
static unsigned long millis_ini=0;
static bool bot_presionado_ant=0;
if(BOT_PRESIONADO == bot_presionado_ant)
{
if(!cont) return;
//...Hay algún toque
if(millis() - millis_ini < MS_ESPERA) return;
toques=cont;
cont=0;
}
bot_presionado_ant= BOT_PRESIONADO;
//Se presionó o se liberó
if(!BOT_PRESIONADO) return;
//Se presionó el botón
cont++;
millis_ini=millis();
}
//-------------------------------------------------------
void ProcesaToques(void)
{
if(!toques) return;
Serial.print("Toques:");
Serial.println(toques);
switch(toques)
{
case 1: InvertirLuz(); break;
case 2:
luz=1; ENCENDER_LUZ;
millis_ini_luz=millis();
break;
}
toques=0;
}
//-------------------------------------------------------
void TemporizadorApagadoLuz(void)
{
if(!millis_ini_luz) return;
if(millis() - millis_ini_luz < MS_TEMPORIZADOR) return;
//Apagar la luz
luz=0;
APAGAR_LUZ;
millis_ini_luz=0;
}
//-------------------------------------------------------
void loop()
{
SupervisarToquesBoton(); //Actualice una variable toques
ProcesaToques();
TemporizadorApagadoLuz();
LedTest();
delay(1);
}
//-------------------------------------------------------
void LedTest(void)
{
static bool encender_led=0;
static unsigned long millis_ant=0;
if(millis()-millis_ant < 1000) return;
millis_ant=millis();
//Invertir el estado del led
encender_led = !encender_led;
if(encender_led) ENCENDER_LED;
else APAGAR_LED;
}