martes, 28 de abril de 2015

Arduino Ejemplos: Reloj calendario sin RTC con LCD 16x2

Logo arduinoBuenas los fanáticos y fanáticas de Arduino!!!

Buscando información para un proyecto de un reloj con calendario y RTC me encontré con un programasin hacer uso de 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


Antes de empezar con el proyecto estos son los componentes que vamos a necesitar

🛠️ Componentes necesarios
Placa de desarrollo UNO R3 ATmega328P CH340
UNO R3 ATmega328P CH340 Placa de desarrollo UNO R3 ATmega328P CH340 .
LCD1602 16x2 HD44780 para Arduino
Pantalla LCD 16x2 HD44780 para Arduino" LCD1602 16x2 HD44780 para Arduino.
Cables Dupont hembra hembra
Cables Dupont h/h Kit de 40pin 10cm 2,54mm 1pin hembra a hembra .
Surtido de resistencias
Surtido de resistencias resistencia 1% de película metálica Kit surtido 1K 10K 100K 220ohm 1M.

Conexion entre Arduino UNO y la pantalla LCD 16x02



Control de la pantalla con pulsadores

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.

Código para el programa


Este es el código para un reloj digital simple con calendario para Arduino UNO/NANO.


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



Espero que estos lineas de código les sean de utilidad, sobre todo a los que estáis empezando en la programación
Saludos a todos!!!

Si quieres más información Arduino y relojes con y sin RTC puedes visitar:


36 comentarios :

Unknown dijo...

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

Peyutron dijo...

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

Unknown dijo...

tienes el diagrama del reloj candelario sin rtc

Unknown dijo...

si fuera si....me lo podrias pasar por favor

Peyutron dijo...

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

Peyutron dijo...

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

Unknown dijo...

"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

Peyutron dijo...

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

Guillermo dijo...

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

Peyutron dijo...

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

Anónimo dijo...

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

Guillermo dijo...

Peyutron Nocturno. Gracias por su información.

Peyutron dijo...

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

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

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

Daniel dijo...

Buenas noches, necesito hacer un calendario en un LCD 16x2

Peyutron dijo...

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

Unknown dijo...

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

Peyutron dijo...

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

Hector W dijo...

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

Peyutron dijo...

Buenas Hector, las resistencias son de 10K, Saludos!!!

Guillermo dijo...

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

Anónimo dijo...

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

Peyutron dijo...

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

Anónimo dijo...

si descargue la librería de esta pagina
es la de windows

Anónimo dijo...

ARDUINO 1.8.5

Peyutron dijo...

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

Anónimo dijo...

te paso mi correo cesarguerrerolopez@gmail.com y gracias

Unknown dijo...

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.

Peyutron dijo...

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

Unknown dijo...

gracias

Unknown dijo...

pero me indica q la libreia no es valida

TU PUTA PERRA MADRE dijo...

cual enlace??

TU PUTA PERRA MADRE dijo...

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

Unknown dijo...

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

Guillermo dijo...

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