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.h"
// Configuramos los pines 12=RS 11=E 5,4,3,2=pines de control
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
int pulsador1=6;          //Cargamos un 6 "pulsador1"
int pulsador2=7;          //Cargamos un 7 "pulsador2"
int u_hora=0;             //Cargamos un 0 "u_hora"
int u_minuto=0;           //Cargamos un 0 "u_minuto"
int u_segundo=0;          //Cargamos un 0 "u_segundo"
int d_hora=0;             //Cargamos un 0 "d_hora"
int d_minuto=0;           //Cargamos un 0 "d_minuto"
int d_segundo=0;          //Cargamos un 0 "d_segundo"
unsigned long timer1=0;  
unsigned long timer2=0;

void setup (){
  pinMode(pulsador1,INPUT);  // El pulsador 1 en pin 6 es una entrada
  pinMode(pulsador2,INPUT);  // El pulsador 2 en pin 7 es una entrada
  lcd.begin(16, 2);          // Número de filas y de columnas en LCD
  lcd.clear();
 
}
void loop(){    // Loop programa principal

  un_seg();    // Subrutina un_seg
  
  contador();   // Subrutina contador
  
  escribe_hora();  // Subrutina escribe_hora
  
  set_hora();   // Subrutina set_hora
  
}
  
void un_seg(){    // Rutina para cada segundo
  
timer2=(millis()/1000);    
if ( timer1 != timer2 ) {
 timer1=timer2;
 u_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);  // Cursor en posición 2 linea 1 (0)
  lcd.print("Reloj Arduino"); //Escribe el texto entre comillas
  lcd.setCursor(3, 1);  // Cursor en posición 4 línea 2 (1)
  lcd.print(d_hora);    // Muestra la variable d_hora
  lcd.print(u_hora);    // Muestra la variable u_hora
  lcd.print(":");       // Escribe el texto entre comillas
  lcd.print(d_minuto);  // Muestra la variable d_minuto
  lcd.print(u_minuto);  // Muestra la variable u_minuto
  lcd.print(":");       // Escribe el texto entre comillas
  lcd.print(d_segundo); // Muestra la variable d_segundo
  lcd.print(u_segundo); // Muestra la variable u_segundo
  
  }
  
  void set_hora(){    //Rutina para poner el reloj en hora
  if(digitalRead(pulsador2)==LOW){    // Si presionas el pulsador2
   u_minuto++;                        // Incrementa la variable "u_minuto" 1 unidad
   delay (250);                       // Pausa antirebote
  }
  if(digitalRead(pulsador1)==LOW){    // Si presionas el pulsador1
   u_hora++;                          // Incrementa la variable "u_hora" 1 unidad
   delay(250);                        // Pausa antirebote
  }
}

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!!!

18 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. Magnifica la noticia, voy a hacerla.
      Gracias.

      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
  4. Como podria hacerlo con un displey de 4 digitos 7 segmentos multiplexado?

    ResponderEliminar
    Respuestas
    1. Buenas, pues no he trabajado con display de ese tipo, siento no poder ayudarte, Saludos!.

      Eliminar
  5. NO PUEDO SABER POR QUE LOS MINUTOS PASAN VOLANDO COMO LOS SEGUNDOS ALGUIEN PODRA AYUDARME GRACIAS

    ResponderEliminar
    Respuestas
    1. asta abajo en las ultimas lineas dice dealy borra eso y ponle un delay mas grande que tu creas que esta bien

      Eliminar
    2. Line 92 y 96 debes cambiar el estadod e los pulsadores por HIGH en lugar de LOW ya que por la configuracion del circuito, si no la haces completa y solo el display, arduino esperara esta entrada en bajo

      Eliminar
  6. // Hola muy feliz día
    // envió el código con la pantalla I2C
    // Espero que sea de ayuda apague la configuración manual para que Dan pueda resolver el problema
    /////////////////////////////////////////////////////////////////////////////////////////////////////////LCD
    #include
    #include
    LiquidCrystal_I2C lcd(0x3F,16,4); // I2C

    /////////////////////////////////////////////////////////////////////////////////
    byte PINarriba=10;
    byte PINabajo=9;
    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(PINarriba,INPUT); //El pulsador 1 en el pin 6 es un pin de entrada
    pinMode(PINabajo,INPUT); //El pulsador 2 en el pin 7 es un pin de entrada
    lcd.begin(20, 4);
    lcd.init(); // initialize the lcd
    lcd.backlight();
    lcd.setBacklight(HIGH);
    lcd.home();
    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();
    if ( timer2 > (1000+timer1)) {
    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++;
    lcd.clear();
    }


    // 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(PINarriba)==LOW){ //Si el presionas el pulsador2
    u_minuto++; //Incrementa la variable "u_minuto" 1 unidad
    delay (250); //Pausa antirebote
    }
    if(digitalRead(PINabajo)==LOW){ //Si el presionas el pulsador1
    u_hora++; //Incrementa la variable "u_hora" 1 unidad
    delay(250); //Pausa antirebote
    }
    }

    ResponderEliminar
    Respuestas
    1. hola por alguna razon no me anda al pulsador, que puede ser?

      Eliminar
    2. Seteá en "set_hora" los pulsadores en "HIGH"

      Eliminar
  7. Gracias por el aporte profesor Rafael-Telles!!!

    ResponderEliminar
  8. Buenas tardes, basicamente quisiera saber si alguno aqui tiene o me puede decir donde puedo conseguir un circuito con arduino sin rtc que me active tres salidas por intervalos, tengo un compresor de aire con tres motores, quiero que solo enciendan 2 por intervalos, es decir, cuando baje la presion debejo de cierto nivel que se va a medir con un presostato mecanico normal dicha señal entrara por un pin del arduino, se activen por ejemplo el motor 1 y 2, pasada media hora de trabajo continuo, se active el 2 y 3, luego de media hora, pasa el 1 y 3, y asi suscesivamente, es para que siempre este un motor descansando.

    ResponderEliminar