martes, 3 de febrero de 2015

Arduino: Reloj simple sin modulo RTC DS1307

Siguiendo con Arduino y el LCD, este ejemplo es algo más practico que los que hemos visto hasta ahora. Se trata de un reloj, un reloj simple, pero un reloj al fin y al cabo.

Esta programado de tal manera que no sea necesario un modulo RTC DC1307.

En realidad es un reloj que solo funciona mientras Arduino esta enchufado, en el momento que deje de recibir corriente, el reloj volverá a estar a cero. Puede no parecer muy practico, pero va muy bien para practicar con variables, el  "if", y diferentes operadores.

También le pondremos un par de pulsadores para poder ponerlo en hora, uno para los minutos y otro para las horas.

También se le puede añadir una alarma por ejemplo o que ponga la fecha, pero eso os lo dejo a vuestra imaginación.

El LCD lo conectaremos como en los ejemplos anteriores, y los pulsadores en modo pul.up en los pines 6 y 7



Aquí os dejo el código, y un vídeo de como funciona


#include 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Configuramos los pines 12=RS 11=E 5,4,3,2=pines de control
int pulsador1=6;          //Cargamos un 6 ena la variable "pulsador1"
int pulsador2=7;          //Cargamos un 7 en la variable "pulsador2"
int u_hora=0;             //Cargamos un 0 en la variable "u_hora"
int u_minuto=0;           //Cargamos un 0 en la variable "u_minuto"
int u_segundo=0;          //Cargamos un 0 en la variable "u_segundo"
int d_hora=0;             //Cargamos un 0 en la variable "d_hora"
int d_minuto=0;           //Cargamos un 0 en la variable "d_minuto"
int d_segundo=0;          //Cargamos un 0 en la variable "d_segundo"
unsigned long timer1=0;  
unsigned long timer2=0;

void setup (){
  pinMode(pulsador1,INPUT);  //El pulsador 1 en el pin 6 es un pin de entrada
  pinMode(pulsador2,INPUT);  //El pulsador 2 en el pin 7 es un pin de entrada
  lcd.begin(16, 2);          //Configuramos los números de filas y de columnas del LCD
  lcd.clear();
 
}
void loop(){    //Programa principal

  un_seg ();    //Va a la rutina un_seg
  
  contador();   //Va a la rutina contador
  
  escribe_hora();  //Va a la rutina escribe_hora
  
  set_hora();   //Va a la rutina set_hora
  
}
  
void un_seg(){    //Rutina para cada segundo
  
timer2=(millis()/1000);    
if ( timer1 != timer2 ) {
 timer1=timer2;
 u_segundo++;    // unidades de segundo se incrementa cada segundo       
 }     
}

void contador(){ // Rutina para el reloj

if ( u_segundo == 10 ) {
u_segundo =0;
d_segundo++;} 

if ( ( d_segundo == 6 ) && ( u_segundo == 0 ) ) {
d_segundo =0;
u_minuto++;} 


// Rutina de minutos

if ( u_minuto == 10 ) {
u_minuto =0;
d_minuto++; } 

if ( ( d_minuto == 6 ) && ( u_minuto == 0 ) ) {
d_minuto =0;     
u_hora++;} 
// Rutina de horas

if ( u_hora == 10 ) {
u_hora =0;
d_hora++; } 

if ( (d_hora == 2) &&  (u_hora == 4) ) {
u_hora =0; 
d_hora =0; } 


}
  
  void escribe_hora(){ //Rutina para escribir la hora en el LCD
    
  lcd.setCursor(1,0);  //Situa el cursor en la segunda posición de la primera línea
  lcd.print("Reloj Arduino"); //Escribe el texto entre comillas
  lcd.setCursor(3, 1);  //Situa el cursor en la cuarta posición de la segunda línea
  lcd.print(d_hora);    //Escribe la cantidad almacenada en la variable d_hora
  lcd.print(u_hora);    //Escribe la cantidad almacenada en la variable u_hora
  lcd.print(":");        //Escribe el texto entre comillas
  lcd.print(d_minuto);  //Escribe la cantidad almacenada en la variable d_minuto
  lcd.print(u_minuto);  //Escribe la cantidad almacenada en la variable u_minuto
  lcd.print(":");        //Escribe el texto entre comillas
  lcd.print(d_segundo);  //Escribe la cantidad almacenada en la variable d_segundo
  lcd.print(u_segundo);  //Escribe la cantidad almacenada en la variable u_segundo
  
  }
  
  void set_hora(){    //Rutina para poner el reloj en hora
  if(digitalRead(pulsador2)==LOW){    //Si el presionas el pulsador2
   u_minuto++;                        //Incrementa la variable "u_minuto" 1 unidad
   delay (250);                        //Pausa antirebote
  }
  if(digitalRead(pulsador1)==LOW){    //Si el presionas el pulsador1
   u_hora++;                          //Incrementa la variable "u_hora" 1 unidad
   delay(250);                         //Pausa antirebote
  }
}

CORRECCIÓN: no se porque en la ultima linea me agrega una linea que no tendría que estar, la linea 101 no hay que copiarla. También puedes descargar el programa en este enlace Relog_sin_RTC.rar

Y aquí el vídeo de como funciona:


Parte de la información la he encontrado en la web fritzing.org
Espero que les guste!!!
Saludos!!!

5 comentarios :

  1. Si se utiliza un display LCD 1602D de 16x2 hay que
    alimentar el terminal 16(K) y el terminal 15(A) a la
    alimentación (-)y (+)respectivamente
    y el terminal 3 (V0)conectalo el punto medio de un
    potenciometro de 10 K, los extremos de los terminales
    van a (-)y (+) del módulo Arduino.
    En la linea 1 tuve que cargar la librería
    #include
    de lo contrario daba un error en la compliación.

    ResponderEliminar
    Respuestas
    1. Buenas Colegio 28, Como bien dices los terminales 16K y 15A son la alimentación de la iluminación de la pantalla(Cátodo y ánodo respectivamente)y además de conectarlos a - y + se le tiene que añadir una resistencia de 220/330 ohm. El terminal 3 corresponde a el contraste de la pantalla. Tienes más información sobre estas conexiones en esta entrada de este mismo blog: Arduino: El LCD 16x2

      Si da ese error si copias y pegas el sketch por que al poner el código me hace eso y no me deja ponerlo bien, si te has fijado la ultima linea tampoco esta bien. He puesto un enlace al programa para que se pueda descargar y no de estos errores. Un Saludo y gracias por visitar Infotronikblog.com

      Eliminar
  2. Genial el tutorial, lo malo es que se desprograma al apagar arduino... pero es muy didactico. ¿Se podría hacer también una alarma como esta pero sin el RTC?:

    http://www.tuelectronica.es/tutoriales/arduino/reloj-alarma-con-arduino.html o

    seria muy interesante

    Saludos.

    ResponderEliminar
    Respuestas
    1. Buenas FjRamirez, claro que se puede, habría que incluir otro menú para configurarlo pero para que "salte" la alarma solo habría que dar un sentencia if, if (horaAlarma==hora)&& (minutoAlarma==minuto)... Algo asi, no lo incluí en el programa porque no me hacía falta, pero haré una actualización más adelante, Saludos!!!

      Eliminar
  3. Buenas, me gustaria saber como usar ese codigo con el adaptador I2C.

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...