domingo, 6 de marzo de 2016

Programador horario

INTRODUCCIÓN

En la entrada anterior vimos como establecer la hora en el RTC y que no se pierda por un corte de electricidad. En esta entrada vamos hacer un programador horario, bien para encender una luz, dispositivo electrónico o electrodoméstico.


ELEMENTOS

Arduino uno o compatible
RTC DS3231 (previamente programado, entrada anterior)
Led


ESQUEMA

VCC RTC-5V Arduino
GND RTC-GND Arduino
SDA RTC-A4 Arduino
SCL RTC-A5 Arduino
Patilla larga Led-Pin 13 Arduino
Patilla corta Led-GND Arduino

¡Ojo, en caso de cambiar el pin 13 por otro hay que poner una resistencia de 220 ­ohmnios!





CODIGO


#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> 

void setup(){
  Serial.begin(9600);

  setSyncProvider(RTC.get);      // Vamos a usar el RTC
  setSyncInterval(86400000);        // Sincronizo una vez cada 24 horas

  pinMode( 13, OUTPUT) ;
  digitalWrite(13 , LOW) ; // Apagamos el LED al empezar

  if (timeStatus() != timeSet){
    Serial.println("Fallo al sincronizar con el RTC");
  }else{
    Serial.println("El RTC se ha sincronizado con el sistema");
  }
}

void loop(){
  //Muestro por el puerto serie la hora
  Serial.print("Son las: ");
  Serial.println(String(hour()) + ": " + String(minute()));
  //comprobamos si es la hora
  if (esHora()) {
    //Si es la hora, mostramos un mensaje indicándolo por el puerto serie
    Serial.print("Es hora!!");
    digitalWrite(13 , HIGH) ;
    delay(1000);
  } else {
    //Muestro por el puerto serie la hora
    digitalWrite(13 , LOW);
    Serial.print("Son las: ");
    Serial.println(String(hour()) + ": " + String(minute()));
    //Si no es la hora, mostramos un mensaje indicándolo por el puerto serie tambien
    Serial.print("No es hora");
    delay(1000);          
  }
}

boolean  esHora() {
  //Defino horas Inicio a las 19:30 y termina a las 21:00
  byte horaInicio = 19;
  byte minutoInicio = 30;
  byte horaFin = 21;
  byte minutoFin = 00;

  //Para hacer las comparaciones de cuando empezar y cuando terminar, lo paso todo a minutos.

  int momentoInicio = (horaInicio * 60) + minutoInicio;
  int momentoFin = (horaFin * 60) + minutoFin;
  int momentoAhora = (hour() * 60) + minute();

  //Esto es que si hemos pasado o estamos en el momento de inicio , pero antes del momento del fin…
  if ((momentoInicio <= momentoAhora) && (momentoAhora < momentoFin)) {
    //devolver "Cierto" en esta función "esHora"
    return true;
  } else {
    //devolver "Falso" en esta función "esHora"
    return false;
  }
}


NOTAS

Usamos el RTC para sincronizar la hora con la placa Arduino a través de la librería Time.
Cada 24 horas se sincronizan la placa y el RTC
La función booleana nos permite establecer un rango horario, así evitamos que ante un pequeño corte de electricidad durante el rango horario y volver, el sistema no altera su funcionamiento.
El led es el ejemplo, podemos cambiarlo por lo que se desee.


Código:

programador horario

Librerías:


Fuente:

Foro arduino