CCCPaste

LuzDomoticaMultiFuncion

// 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; 
  }