martes, 28 de abril de 2015

Arduino: Reloj calendario sin RTC

Buenas!!!
Buscando información para un proyecto de un reloj con calendario y RTC me encontré con un programasin RTC mucho más completo que el que ya tenia publicado en Arduino: Reloj simple sin modulo RTC DS1307.


Este reloj utiliza una librería llamada TimedAction que esta disponible en GitHub

Esta "actualización" (vamos a llamarla así) incluye, además de la hora:

  • Día (1, 2, 3,....)
  • Día de la semana (Lunes, Martes, Miércoles...)
  • Mes (Enero, Febrero, Marzo....)
  • Año



Se controla mediante dos pulsadores, uno para seleccionar el dato de manera ascendente y otro para confirmar dicho dato.

Como en el anterior ejemplo este reloj, en el momento que deje de recibir corriente se resetearan los valores teniendo que volver a poner el reloj en hora. 





Saludos!!!

// -------------------------------------------------------
// Reloj digital simple con calendario
// Developed by Darren Yates for APC magazine
// Traducido y modificado por Peyutron para Infotronikblog
// Se han sustituido los botones un modo analógico por 
// dos pulsadores
// -------------------------------------------------------
#include "LiquidCrystal.h"
#include "TimedAction.h"
LiquidCrystal lcd(8,9,4,5,6,7);
int keyIn;
int pul_select = 11;
int pul_conf= 12;
int NUM_KEYS = 5;
int key=-1;
int oldkey=-1;
char dia[7][10] = { "Lun","Mar","Mie","Jue","Vie","Sab","Dom"};
char mes[12][11] = { "Enero    ","Febrero ","Marzo ","Abril ","Mayo ","Junio ","Julio ","Agosto","Septiembre","Octubre   ","Noviembre","Diciembre" };
char hourTime [24][5] = { 
  "12am","1am","2am","3am","4am","5am","6am","7am","8am","9am","10am","11am",
  "12pm","1pm","2pm","3pm","4pm","5pm","6pm","7pm","8pm","9pm","10pm","11pm" };
byte DiaMes[12] = {
  31,28,31,30,31,30,31,31,30,31,30,31};
char pregunta [6][16] = { "Selec. ano:","Selec. mes:","Sel. dia/fecha:","Selec. dia:","Selec. hora:","Selec. minuto:" };

int qNum = 0;
int tempVar = 0;
int maxVar = 0;
int minVar = 0;
int delayTiempo = 3500;
int startClock = 0;

int selDia = 0;
int selDiaSem = 1;
int selMes = 0;
int selAno = 2015;
int selHora = 0;
int selMin = 0;
int secs = 0;
String strMin = "";
String strSecs = "";
String strHora = "";
String hora12 = "";
String topLine = "";
String botLine = "";
String spaceChar = " ";


void setup() {
pinMode (pul_select,INPUT);
pinMode (pul_conf,INPUT);  
  lcd.begin (16,2);
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("Infotronikblog");
  lcd.setCursor(0,1);
  lcd.print("Reloj Calendario");
  delay(delayTiempo);
  lcd.clear();  
  lcd.setCursor(0,0);
  lcd.print("Poner en hora");
  lcd.setCursor(0,1);
  lcd.print("usando el boton");
  delay(delayTiempo);
  lcd.clear();  
  lcd.setCursor(0,0);
  lcd.print("Selct y presiona");
  lcd.setCursor(0,1);
  lcd.print("el boton Conf ");
  delay(delayTiempo);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("para continuar");
  delay(delayTiempo);
  PonerHora();
  }
TimedAction timer = TimedAction(1000,clockUpdate);
  void PonerHora(){
  delay(1000);  
  for (qNum = 0; qNum < 6; qNum++)
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(pregunta[qNum]);

    keyIn = 0;
    waitForSelect();
  } 
  lcd.clear();
}

void loop() {
  if (startClock ==1 ) {timer.check();} 
  if (digitalRead(pul_select)==LOW && digitalRead(pul_conf)==LOW){
  PonerHora();
  }

} 

void waitForSelect() {
  switch (qNum) {
  case 0: 
    tempVar = selAno;  
    maxVar = 2020; 
    minVar = 2015; 
    break;
  case 1:
    tempVar = selMes; 
    maxVar = 11; 
    minVar = 0; 
    break;
  case 2:
    tempVar = selDiaSem; 
    maxVar = DiaMes[selMes]; 
    minVar = 1; 
    break;
  case 3:
    tempVar = selDia; 
    maxVar = 6; 
    minVar = 0; 
    break;
  case 4:
    tempVar = selHora; 
    maxVar = 23; 
    minVar = 0; 
    break;
  case 5:
    tempVar = selMin; 
    maxVar = 59; 
    minVar = 0;
  }

  lcd.setCursor(0,1);
  displayVars();

  while (keyIn != 4) { 

  
if (digitalRead(pul_conf)==LOW) {
  delay(300);
      switch (qNum) {
      case 0:
        selAno = tempVar; 
        break;
      case 1:
        selMes = tempVar; 
        break;
      case 2:
        selDiaSem = tempVar; 
        break;
      case 3:
        selDia = tempVar; 
        break;
      case 4:
        selHora = tempVar; 
        break;
      case 5:
        selMin = tempVar;
        startClock = 1;
      }
      keyIn = 4;
    } 

if (digitalRead(pul_select) ==LOW) {
  tempVar++;
  if (tempVar> maxVar){
    tempVar = minVar;
    }
    delay(200);
  }      
      lcd.setCursor(0,1);
      displayVars();
    }
    delay(50);
  }


void displayVars() {
  switch (qNum) {
  case 0:
    lcd.print(tempVar + spaceChar); 
    break;
  case 1:
    lcd.print(mes[tempVar] + spaceChar); 
    break;
  case 2:
    lcd.print(tempVar + spaceChar); 
    break;
  case 3:
    lcd.print(dia[tempVar] + spaceChar); 
    break;
  case 4:
    lcd.print(hourTime[tempVar] + spaceChar); 
    break;
  case 5:
    lcd.print(tempVar + spaceChar);  
  }        
}

void clockUpdate() {
  secs++;
  if (secs == 60) {
    secs = 0;
    selMin++;
  }
  if (selMin == 60) {
    selMin = 0;
    selHora++;
  }
  if (selHora == 24) {
    selHora = 0;
    selDia++;
    if (selDia ==7) {
      selDia = 0;
    }
    selDiaSem++;
  }
  if (selDiaSem > DiaMes[selMes]) {
    selDiaSem = 1;
    selMes++;
    if (selMes == 12) {
      selMes = 0; 
      selAno++;
    }
  }    
  if (secs < 10) {
    strSecs = "0"+String(secs);
  } 
  else {
    strSecs = String(secs);
  }
  if (selMin < 10) {
    strMin = "0"+String(selMin);
  } 
  else {
    strMin = String(selMin);
  }
  if (selHora < 12) {
    hora12 = "am"; 
    if (selHora==0) {
      strHora = "12";
    } 
    else {
      strHora = String(selHora);
    }
  } 
  else { 
    hora12 = "pm"; 
    strHora = String(selHora); 
  }
  if (selHora > 12) {
    strHora = String(selHora-12);
  }

  topLine = String(dia[selDia]).substring(0,3)+","+spaceChar+selDiaSem+spaceChar+String(mes[selMes]).substring(0,3)+spaceChar
    +selAno+spaceChar;
  botLine = strHora+":"+strMin+":"+strSecs+hora12+spaceChar;
  lcd.setCursor(0,0);
  lcd.print(topLine);
  lcd.setCursor(3,1);
  lcd.print(botLine);
}

  int get_key(unsigned int input) {
  int k;
  for (k = 0; k < NUM_KEYS; k++){
      return k;
    }   
  if (k >= NUM_KEYS) k = -1; 
  return k;
}


36 comentarios :

  1. Esta muy buenl, pero la librería no funciona u.u T-T

    ResponderEliminar
    Respuestas
    1. Buenas Tamara, cual es el mensaje que sale al compilar?
      Aquí tienes el enlace a la librería original: http://playground.arduino.cc/uploads/Code/TimedAction-1_6.zip
      Solo tienes que extraer en zip en la carpeta de Arduino llamada "libraries". Espero te funcione con esto, Saludos!!!

      Eliminar
  2. tienes el diagrama del reloj candelario sin rtc

    ResponderEliminar
    Respuestas
    1. si fuera si....me lo podrias pasar por favor

      Eliminar
    2. Buenas Galvani, Ya he puesto el esquema en la entrada, Saludos!!!

      Eliminar
  3. Después de varios comentarios he revisado y actualizado el programa, ya no debería de dar ningún error. Gracias por colaborar!!!

    ResponderEliminar
  4. "TimedAction timer = TimedAction(1000,clockUpdate);" amigo ya cambie esto y puse a voip loop y me descarge la librery de TimedAction y me sale compilation terminated.
    Error de compilación

    ResponderEliminar
  5. Buenas Luis, has descargado el nuevo programa? He revisado el código y ahora no da el error, también probé a descargar la librería por si era fallo de la librería y no, era el programa que estaba mal, aunque siempre subo los programas una vez que los he probado, tal y como se ve en el vídeo es como lo subí, así que no tengo muy claro por qué dejo de funcionar. Por suerte ya está arreglado. Descarga el archivo desde el enlace, Saludos!!!

    ResponderEliminar
  6. Se consigue lista de elementos para este proyecto de reloj-calendario-sin-rtc.html

    ResponderEliminar
    Respuestas
    1. Buenas Guillermo! te refieres a la lista de componentes? o donde he comprado los componentes? la primera sería un Arduino ONE, un LCD16x2, 2resistencias de 10K y una de 330ohm, una resistencia variable de 10K y dos pulsadores NA(normalmente abierto).
      Para la segunda pregunta, los elementos los compro todos por Ebay.com.
      Saludos!!!

      Eliminar
    2. Gracias Peyutron por la informacion. Algo tarde te doy las gracias ya estoy en marcha con este y otros proyectos.

      Eliminar
  7. Colega sabe que el lcd no para de entrar a configurarse solo, osea se prende y entra en el ciclo de configuracion y se pone solo la fecha y hora, sera un problema del codigo? porque con o sin pulsadores conectados comienza a configurarse solo igual y nunca se detiene

    ResponderEliminar
    Respuestas
    1. Buenas, revisa la conexión de los botones, prueba conectando las resistencias directamente de los pines 11 y 12 a +5V, eso tendría que estabilizar, y a partir de ahí monta los botones con una configuración PULL UP. Así debería de funcionar.
      Saludos

      Eliminar
  8. Peyutron Nocturno. Gracias por su información.

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Hola, Baje tu programa y la libreria para hacer unas pruebas, pero me sale un error al compilarlo

    imedAction.h:33:22: fatal error: WProgram.h: No such file or directory

    por que marcar error con la libreria WProgram.h ?

    saludos

    ResponderEliminar
  11. Buenas noches, necesito hacer un calendario en un LCD 16x2

    ResponderEliminar
    Respuestas
    1. Buenas, puedes modificar el archivo para que solo muestre el calendario.

      Eliminar
  12. Buenas, quisiera saber si el código sufre atrasos, me refiero a si en funcionamiento continuo se atrasa. Saludos

    ResponderEliminar
  13. Buenas, si, al no llevar un reloj RTC muy posiblemente tenga algún retardo al terminar las 24h. Si necesitas algo más preciso usa el RTC. Saludos!!!

    ResponderEliminar
  14. Me podrias ayudar con el diagrama, en mi compu no se logra ver bien y creo que tengo problemas en la coneccion de los botones, también el valor de las resistencias, soy novato

    ResponderEliminar
    Respuestas
    1. Buenas Hector, las resistencias son de 10K, Saludos!!!

      Eliminar
  15. disculpa pero al verificar el programa me dice #include "WProgram.h" como error
    que hago?

    ResponderEliminar
    Respuestas
    1. Buenas cesar, ese error es por una librería mal referenciada, tendrás que buscar en la librería donde ponga WProgram.h y sustituirlo por arduino.h. bajaste la librería de esta web? Que IDE de Arduino estás usando?saludos!!!

      Eliminar
    2. si descargue la librería de esta pagina
      es la de windows

      Eliminar
    3. Buenas Cesar, voy a revisar los archivos, escríbeme al correo y cuando lo tenga te lo mando directamente. Un saludo!!!

      Eliminar
    4. te paso mi correo cesarguerrerolopez@gmail.com y gracias

      Eliminar
  16. me sale esto mm no entiendo ya hice todo lo de arriba
    C:\Users\Acer\Desktop\jose\Relog_sin_RTC\Relog_sin_RTC.ino:8:24: fatal error: TimeAction.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Error compilando para la tarjeta Arduino/Genuino Uno.

    ResponderEliminar
    Respuestas
    1. No encuentra el archivo TimeAction.h o falta el #include esté bien escrito en el encabezado del programa y que este la librería en la carpeta librarte, saludos!!!

      Eliminar
  17. pero me indica q la libreia no es valida

    ResponderEliminar
  18. Arduino:1.8.5 (Windows Store 1.8.10.0) (Windows 10), Tarjeta:"Arduino/Genuino Uno"

    In file included from C:\Users\JE_DT\AppData\Local\Temp\arduino_modified_sketch_212697\sketch_jul12a.ino:9:0:

    C:\Users\JE_DT\Documents\Arduino\libraries\TimeAction/TimedAction.h:33:22: fatal error: WProgram.h: No such file or directory

    #include "WProgram.h"

    ^

    compilation terminated.

    exit status 1
    Error compilando para la tarjeta Arduino/Genuino Uno.

    Este reporte podría tener más información con
    "Mostrar salida detallada durante la compilación"
    opción habilitada en Archivo -> Preferencias.

    que hago

    ResponderEliminar
    Respuestas
    1. hermano aqui te dice como solucionarlo yo lo hice y funciono ese error http://cursoarduinomega.blogspot.com/2015/04/error-wprogramh-no-such-file-or.html

      Eliminar
  19. Gracias por esta comunicación me servirá mucho.
    Hare mi segundo reloj con este sistema.

    ResponderEliminar