Reloj, LCD, ajuste con pulsadores

Sigo, poco a poco, probando cositas para mí nuevas.
En esta ocasión ha sido la gestión de un reloj con un DS3231, midiendo temperatura (TMP36GT9Z), y mostrando los datos en un LCD de 20x4, conectado por I2C.

El principal reto para mí, ha sido resolver de forma satisfactoria la gestión del ajuste del reloj a través de los pulsadores (3)

El controlador, de momento, un Arduino Uno. Puede que pruebe con un Nano que tengo desocupado.

Actualiza pantalla con fecha, hora y temperatura cada 5 segundos.
Temperatura: suaviza las lecturas con una media móvil de las 10 últimas lecturas, y después muestra sólo resolución de medio grado.
Para la media, tengo dos funciones, una propia, y otra de una librería que surbyte ha recomendado.

surbyte:
prueba con este filtro y me cuentas luego Moving-Avarage-Filter--Arduino-Library

En el puerto serie muestro las dos informaciones.

A seguir pensando: algún efecto para mostrar los segundos en la tercera línea, quizá como una barra de progresión.
A mejorar: la respuesta de los pulsadores: algo perezosos. Quizá pruebe las interrupciones, que hasta ahora no lo he hecho.

Funcionamiento de los pulsadores:
//Primero.
//Pulsación simple en modo vis., apaga y enciende iluminación
//Pulsación simple en modo ajuste, resta un número el campo seleccionado
//Pulsación 2s en modo ajuste, sale sin guardar

//Segundo.
//Pulsación 2s en modo vis,. entra en modo ajuste
//Pulsación simple en modo ajuste, avanza campo
//Pulsación 2s en modo ajuste, sale guardando

//Tercero
//Pulsación simple en modo ajuste, suma un número al campo seleccionado
//Pulsación 2s en modo ajuste, sale sin guardar

No sé si me olvido alguna información esencial que no esté clara en los comentarios del código. Si no, lo siento, ya la añadiré si me decís.
Agradeceré sugerencias para mejora. Gracias.

Incluyo el código como adjunto, ya que por la longitud no me deja meterlo entre tags de código.

chema_reloj_lcd_v1.ino (12.7 KB)

Buenas.
Me gustó tu proyecto.

Podrías poner el esquema del mismo? Vale en la hoja viene si uno lo deduce, pero creo sería de mas información. A todo esto vi un código de dígitos grandes que ocupa todo el LCD 20x4 y quedaría muy bien. Si quieres te lo adjunto para que lo pruebes.

Saludos.

Gracias. Relojes hay muchos, y algunos impresionantes (he alucinado viendo este: http://www.instructables.com/id/Arduino-Atomic-Grandfather-Clock/

En este caso sólo es la exposición de, digamos, prácticas de aprendizaje.

Empecé a hacer un esquema con fritzing, pero era la primera vez que lo usaba, y me estaba costando más que la propia programación. Haré otro intento.

Para este fin de semana quiero sacar algún rato para cambiar las funciones de los pulsadores, asociando dos a interrupciones, y usar el reloj con la librería RTC, que resulta en un código más simple.

También quería hacer para los segundos algo así como esta imagen:

Lo del efecto en el LCD, si tienes el enlace te lo agradecería. Se podría poner conmutación entre distintos modos de visualización.
Tengo encargado un par de módulos de esos de display de 4 dígitos, también para ver cómo hacerlos funcionar.

Hola Chema.
Te dejo el reloj como dije de dígitos grandes.

Te pongo también una captura del mismo.
El LCD 20x4 va por BUS I2C tanto el DST

No he podido antes por tener problemas con mi ISP.
Saludos.

reloj.ino (6.06 KB)

Acabo de sugerir en un post donde tu aconsejas que librerias RTC usar, justamente las librerías que yo uso para manejar RTC, time y timealarms.

Uso DS1307RTC Library
Uso Time Library
y Uso TimeAlarms Library para las comparaciones.

Mira la página y los ejemplos presentados. Tiene soporte para actualizar la hora via internet.. esta todo pensado y resuelto.

Entre los dos ya me habeis puesto buenos deberes para el fin de semana.

El tema fuentes grandes ya lo miré. Hay alguna libreria para llegar y usar, pero intentare hacerlo a pelo. Antes mirare el aporte de lightcalamar. (Edito: he visto las fotos y el código. Las fuentes me parecen más atractivas que las que tenía yo vistas, y el código muy simple. Creo que iré directamente a ello y me dejaré de crear los mapas de caracteres uno a uno, como pensaba).

Con las librerias de surbyte seguramente intentare sacar dos versiones paralelas del reloj, con el mismo funcionamiento, pero con el uso de librerias distintas. (Edito: ojeado la página de las librerías, que no conocía. Me ha gustado cómo documenta las funciones. Con total seguridad que las pruebo. Con el tiempo, creo que será bueno decantarse por una u otra librería, ya que la sintaxis de todas es muy similar, y los matices pueden llevar a que funcione o que los resultados sean incorrectos).

El tema pulsadores lo he mejorado. En la funcion de tratamiento había un fallo en el flujo. Ahora actualizo reloj cada segundo y responden rapido, incluso con algun rebote que he de revisar.
Con cuatro caracteres especiales definidos he hecho una barra de progreso que se incrementa cada segundo.
He metido tambien varios modos de visualizacion conmutables, de cara a que uno sea el de los numeros grandes.
Quizá meter el watchdog, y en uno de los modos visualizar el tiempo que lleva el sketch en marcha podría ser de utilidad.
Y tema que me gustaria es la actualizacion de hora via internet. Con el modulo wifi tengo una guerra, en la que el ha ganado ya dos batallas. Tengo que sentarme, e ir por la tercera.

Así estaba ayer la cosa:

trata de armar tu prototipo en un pcd para prototipos, Vas a comenzar a tener problemas de contactos con el ajetreo.

En la librería que te pasó el soporte por NTP esta previsto. verás que fácil es hacerlo.

surbyte:
En la librería que te pasó el soporte por NTP esta previsto. verás que fácil es hacerlo.

He vuelto a repasar info de los Wifi. Tengo varios ESP8266, pero hasta ahora, algo hacía mal que perdía horas y horas sin avanzar. Este fin de semana, que aquí se promete lluvioso, lo que favorece dedicar tiempo a estas tareas, iré a otro intento. Les tengo ganas.

El paso a una placa lo tengo previsto. Esta semana llegaron de un par de tipos, de aliexpress (todavía no he usado), y me tengo que poner a ello.

De momento, he avanzado en la pantalla de números grandes, y tengo definidos tres modos de visualización.

Quiero repasar un poco el código, pues voy justo de tiempo, y prácticamente he copiado y pegado, y cuando me entere con detalle de lo que hace, subiré este versión del sketch, para pasar a cambiarlo a las otras librerías, ya como versión 3.

Pongo las pantallas definidas hasta ahora


Me ha costado, hasta que creo que he comprendido las diferencias entre la gestión de la DS1307RTC y la Time, a la hora de usarlas adecuadamente en el mismo sketch:

  • trabajan con tipos de datos distintos (convertibles con dos funciones de Time)
  • DS1307RTC trabaja con el RTC, mientras que Time con la hora "del sistema".
    Así, basta con leer el RTC en el setup, y asignarle la hora al sistema. Luego, no es preciso volver a recurrir al RTC.
  • Y acordarse de volver a asignar al sistema la hora desde el RTC después de realizar ajustes.

Aún quedará algún fleco, pero esencialmente ya funcionan igual las dos versiones:

2: con librería RTClib
3: con librerías DS1307RTC y Time

Esta es la función de los botones actualizada. Hay definidos 4 modos de visualización distintos

//Primero.
//Pulsación simple en modo vis., apaga y enciende iluminación
//Pulsación 2s en modo vis,. entra en modo ajuste
//Pulsación simple en modo ajuste, avanza campo
//Pulsación 2s en modo ajuste, sale guardando

//Segundo.
//Pulsación simple en modo visualización, cambia el modo de visualización
//Pulsación simple en modo ajuste, suma un número al campo seleccionado
//Pulsación 2s en modo ajuste, sale sin guardar

//Tercero
//Pulsación simple en modo ajuste, resta un número el campo seleccionado
//Pulsación 2s en modo ajuste, sale sin guardar

El tema hacer un esquema, he vuelto a echar un rato al Fritzing, y he vuelto a desistir.

Lo siguiente pensado: hacerme con el funcionamiento del ESP8266, y activar como opción el ajuste automático.

chema_reloj_lcd_v2.ino (20.3 KB)

chema_reloj_lcd_v3.ino (20.4 KB)

Hola chema

He intentado subir la versión 3 y me da error, concretamente este;

Arduino:1.6.5 (Windows XP), Placa:"Arduino Nano, ATmega328"

CHEMA_V3.ino: In function 'void loop()':
CHEMA_V3:308: error: invalid conversion from 'const char*' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
In file included from E:\arduino-1.6.5-r2\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:35:0,
                 from CHEMA_V3.ino:31:
E:\arduino-1.6.5-r2\libraries\LiquidCrystal_I2C/LCD.h:382:9: error:   initializing argument 2 of 'void LCD::createChar(uint8_t, uint8_t*)' [-fpermissive]
    void createChar(uint8_t location, uint8_t charmap[]);
         ^
CHEMA_V3:339: error: invalid conversion from 'const char*' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
In file included from E:\arduino-1.6.5-r2\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:35:0,
                 from CHEMA_V3.ino:31:
E:\arduino-1.6.5-r2\libraries\LiquidCrystal_I2C/LCD.h:382:9: error:   initializing argument 2 of 'void LCD::createChar(uint8_t, uint8_t*)' [-fpermissive]
    void createChar(uint8_t location, uint8_t charmap[]);
         ^
CHEMA_V3:398: error: invalid conversion from 'const char*' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
In file included from E:\arduino-1.6.5-r2\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:35:0,
                 from CHEMA_V3.ino:31:
E:\arduino-1.6.5-r2\libraries\LiquidCrystal_I2C/LCD.h:382:9: error:   initializing argument 2 of 'void LCD::createChar(uint8_t, uint8_t*)' [-fpermissive]
    void createChar(uint8_t location, uint8_t charmap[]);
         ^
CHEMA_V3:428: error: invalid conversion from 'const char*' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
In file included from E:\arduino-1.6.5-r2\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:35:0,
                 from CHEMA_V3.ino:31:
E:\arduino-1.6.5-r2\libraries\LiquidCrystal_I2C/LCD.h:382:9: error:   initializing argument 2 of 'void LCD::createChar(uint8_t, uint8_t*)' [-fpermissive]
    void createChar(uint8_t location, uint8_t charmap[]);
         ^
invalid conversion from 'const char*' to 'uint8_t* {aka unsigned char*}' [-fpermissive]

  This report would have more information with
  "Show verbose output during compilation"
  activala desde Archivo > Preferencias

Que versión de librería usas del LCD LiquidCrystal_I2C.h?

Saludos.

lightcalamar:
Que versión de librería usas del LCD LiquidCrystal_I2C.h?

Ésta: (la última versión):
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

Aprovecho para actualizar una función (la que traduce a cadena el tiempo desde el arranque, que a partir de las 4 horas empezaba a hacer "tonterías".

//Lee los millis y los formatea a cadena "amigable"
String Format_millis(){
    byte dias, horas, minutos, segundos;
    unsigned long tiempo;
    String scadena="";
    tiempo=millis()/1000;
    dias=tiempo/(86400); //86400 = 24horas * 60 min * 60 seg - segundos en un día
    horas=(tiempo/(3600))-(dias*24); //3600 = 60min * 60seg - segundos en una hora
    minutos=(tiempo/60)-(dias*1440)-(horas*60); //1440 = 24horas * 60min - minutos en un día
    segundos=tiempo-(dias*86400)-(horas*3600)-(minutos*60);
    if (dias>0){scadena+= dias; scadena+="d ";}
    if (horas>0){scadena+= horas; scadena+="h ";}
    if (minutos>0){scadena+= minutos; scadena+="m ";}
    scadena+= segundos; scadena+="s";
    byte longi=scadena.length()+4;
    for (byte i=longi;i<20;i++){scadena+=" ";}
    return scadena;
}

Ok.

El funcionamiento es correcto ahora. Tenia la versión 1.2.1 y he actualizado a la versión 1.3.4 de NewCrystalLiquid.

Gracias y Saludos. :slight_smile:

Hola otra vez.

Bueno he realizado unos pequeños cambios. Chema he logrado a través de un mando a distancia realizar las funciones para el reloj.

Hace unos días atrás estoy realizando un proyecto para un montaje mio que es un conmutador USB, y a todo ello me va muy bien en tu proyecto para adicionarle el reloj, porque solo realizar una función de conmutar pues quedaba un poco soso.

A ver si lo termino y expongo mi proyecto, dejo capturas de como ha quedado y con tu reloj;

Qué envidia me da ver esos montajes tan compactos y ordenados.
Tengo que ponerme y aprender. Será como todo, ensayo/error.

Le he metido ya como final al reloj un ESP8266 (por fin parece que le he ganado la batalla), y ya sincroniza la hora con un servidor NTP.
El montaje se ha complicado un poquito más, pues ha habido que meter una fuente externa al Arduino, que proporcione 3,3 y 5V.

Ahora, lo único que me gustaría, sería poder apagar totalmente el ESP8266 hasta que inicie la llamada a la función de ajuste.

chema_zgz:
Qué envidia me da ver esos montajes tan compactos y ordenados.
Tengo que ponerme y aprender. Será como todo, ensayo/error.

Es la experiencia a través de los años (no en Arduino, sino otros de electrónica..)

Por cierto hoy ya tengo funcionando mi conmutador USB y con tu reloj que es impresionante, lo que me ocurre es que tuve que cambiar los pulsadores por teclas de mando a distancia (y vale cualquier mando, sea el protocolo que use, de ello lo puedo afirmar) sin embargo el "pulsador 2" tengo un problema de programación y por mas que lo intento tengo que poner un "HIGH" y ponerlo a masa, muy curioso el tema

Sobre el tema del ESP8266 es interesante. También te puedo poner un simple esquema para obtener los 3,3 VCC que necesita sin mas complicaciones. Vale si pero con condiciones al consumo del mismo. Yo lo alimento a través de un simple divisor de tensión con resistencias del 1% todo sea dicho.

Saludos.

lightcalamar:
Es la experiencia a través de los años (no en Arduino, sino otros de electrónica..)

Yo es que de electrónica nada de nada. Hasta hace dos días, eso de resistencias pull-up y pull-down me sonaba a chino, así que no digo más. Menos mal que google hace maravillas.
Yo vengo de otra rama: bases de datos, programación, gestión de medidas. A mí me llegan ya las señales "limpias", y me encargo de marearlas.

Los tres pulsadores supongo que los habrás independizado y simplificado en las distintas teclas del mando (lo simple sería dos por cada botón, simulando la pulsación corta y la larga).

Lo de los 3,3 V lo resuelvo de momento con una alimentación de este tipo

A esto le daré un par de vueltas y ya subiré el sketch con la actualización incluida.
Después dejaré esto, que empezó como ensayo de las pantallas LCD, y volveré a otras cosas que tengo por ahí "atascadas", ahora que el ESP8266 más o menos lo voy comprendiendo.

Quiero mantener la alimentación del ESP8266 cortada hasta que llegue la petición del ajuste NTP (se hace sólo a demanda por pulsador).

En el kit de inicio con el que empecé venía un TIP120, que he visto que puede hacer el papel, actuando de interruptor controlado por un pin digital de Arduino.

Aparte de la resistencia de 1K entre el pin y la pata del transistor, ¿tendría que poner algún otro elemento, o para la gestión del circuito de 3,3 V del ESP8266 ya voy servido?

He probado, con un led, y funcionar funciona.

Nota: mi nivel es de preescolar de electrónica

Me imagino que la resistencia de 1K va entre la salida Dx de Arduino y la Base del transistor.
Es un transistor NPN Darlington.

Yo le añadiría a la "salida" es decir por el Colector del transistor un resistencia de bajo valor por ejemplo de 27 Ohms.tendrías mas o menos 3,2 y funcionaría sin mas.

Saludos

Bueno, con esto voy a dejar cerrado el añadido de cositas al reloj.
Está funcionando el ESP8266, para la sincronización NTP a demanda.
Para el aumento de la fiabilidad de la conexión, y bajar el consumo, tengo el módulo apagado hasta su uso.
Después también he activado el reset a través del pin Rst del módulo.
He hecho una "especie de esquema" de las conexiones de esta parte. No sé si se entenderá.

Si me animo a montarlo bien, y ponerlo en una caja, ya pondré alguna fotillo.
No creo que me vaya a programar la posibilidad de alarmas.

chema_reloj_lcd_v4_con_ajuste_NTP.ino (26.9 KB)