Hola Chicos/as.
Con el fin de seguir aprendiendo, he empezado hace unos días a hacerme un reloj con LCD 20x4 I2c con números grandes.
He encontrado muchos tutoriales y códigos pero ninguno que me funcione.
Cunado esté terminado, la idea es añadirle algún sonido tipo cuco cada 15 minutos y algo con un servo....Está por definir.
Los tutoriales que he encontrado no me sirven ya que utilizan otro LCD u otro modulo reloj. O, lo hacen con números grandes de 2 lineas y el mio es de 4.
Al final me he lanzado a escribir el código desde cero, pero me da la impresión que estoy matando una mosca con los ejércitos de tierra, mar y aire. por ello antes de seguir con el trabajo de chinos en el que me he metido, quizás alguien me sugiera algún atajo para ahorrar trabajo de escritura y copia y pega...
Lo estoy haciendo en base a la info del modulo reloj. Como cada dígito grande se compone de 4 de alto por 4 de ancho, cada uno tiene hasta 32 lineas. una para lcd.setCursor y otra para lcd.write....Esto multiplicado por 24 horas y por 60 minutos....Una burrada...seguro que hay algún atajo, pero a este novato se le escapa por donde buscar....
Utilizo:
- Arduino NANO.
- Modulo DS1302
- LCD20X4 I2c
Primero lo hice funcionar mostrando sin problemas, día de la semana, día del mes, mes, año, hora, minutos y segundos. Tanto en serial como en el LCD.
Mi reloj definitivo solo necesita hora y minutos.
Luego, cree los números del 0 al 9 más los dos puntos.
Al final de este mensaje pongo el código.
Está sin terminar, claro, aunque ya muestra las horas 18 y 19 en grande....Y como referencia provisional, las horas y minutos en tamaño normal...Esto ultimo, lo eliminaré al acabar.
Aquí está el código, gracias de antemano.
Detectado un error en los comentarios... if (myRTC.hours == 21){ // si horas son 21, muestralo en grande. Son horas no minutos.
#include <virtuabotixRTC.h> //Libreria
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// CLK -> 6, DAT -> 7, RST -> 8 Para DS1302
virtuabotixRTC myRTC(6, 7, 8);
LiquidCrystal_I2C lcd(0x27, 20, 4);
//caracteres customizados para crear numeros grandes.
byte N[8] = { //Esquina superior izquierda
B00111,
B01111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte A[8] = { // Cuadro entero
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte Y[8] = { ///Esquina inferior izquierda
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B01111,
B00111
};
byte L[8] = { //Esquina superior derecha
B11100,
B11110,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte M[8] = { //Esquina inferior dereccha
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11110,
B11100
};
byte P[8] = { //Punto bajo
B00000,
B00000,
B00000,
B00000,
B11111,
B11111,
B11111,
B11111
};
byte cara[8] = { //Punto alto
B11111,
B11111,
B11111,
B11111,
B00000,
B00000,
B00000,
B00000
};
byte cuerpo[8] = {// punto fino
B00000,
B00000,
B00000,
B00000,
B00111,
B00111,
B00111,
B00111
};
void setup() {
Serial.begin(9600);//activa serial
lcd.init();//inicia lcd
lcd.backlight();//enciende retroiluminacion
//creamos los nuevos caracteres
lcd.createChar (0,N);//esq sup izq
lcd.createChar (1,A);//full
lcd.createChar (2,Y);//esqu inf izq
lcd.createChar (3,L);//esq sup dere
lcd.createChar (4,M);//esq inf dere
lcd.createChar (5,P);//Punto bajo
lcd.createChar (6,cara);//Punto alto
lcd.createChar (7,cuerpo);//3 de abajo
}
void loop() {
myRTC.updateTime();// Esta función actualiza las variables para obtener resultados actuales
lcd.clear(); //Here after clearing the LCD we take the time from the module and print it on the screen with usual LCD functions
myRTC.updateTime();
Serial.print(myRTC.hours);
Serial.print(":");
Serial.print(myRTC.minutes);
Serial.print(":");
Serial.println(myRTC.seconds);
lcd.setCursor(15,1);
lcd.print(myRTC.hours);
lcd.print(":");
lcd.print(myRTC.minutes);
lcd.setCursor(9,1);
lcd.write (byte (7));
lcd.setCursor(9,2);
lcd.write (byte (7));
//// Empiezo con los if....Si las horas son XX, muestralo en caracters grandes...Trabajo de locos
if (myRTC.hours == 18){ // si minutos son 18, muestralo en grande
lcd.setCursor(2,0);//Empieza el 1
lcd.write (byte (1));
lcd.setCursor(3,0);
lcd.write (byte (3));
lcd.setCursor(3,1);
lcd.write (byte (1));
lcd.setCursor(3,2);
lcd.write (byte (1));
lcd.setCursor(3,3);
lcd.write (byte (1));
lcd.setCursor(5, 0);///empieza el 8
lcd.write (byte (0));
lcd.setCursor(5,1);
lcd.write (byte (2));
lcd.setCursor(5,2);
lcd.write (byte (0));
lcd.setCursor(5,3);
lcd.write (byte (2));
lcd.setCursor(6,0);
lcd.write (byte (1));
lcd.setCursor(6,1);
lcd.write (byte (5));
lcd.setCursor(6,2);
lcd.write (byte (6));
lcd.setCursor(6,3);
lcd.write (byte (1));
lcd.setCursor(7,0);
lcd.write (byte (1));
lcd.setCursor(7,1);
lcd.write (byte (5));
lcd.setCursor(7,2);
lcd.write (byte (6));
lcd.setCursor(7,3);
lcd.write (byte (1));
lcd.setCursor(8,0);
lcd.write (byte (3));
lcd.setCursor(8,1);
lcd.write (byte (4));
lcd.setCursor(8,2);
lcd.write (byte (3));
lcd.setCursor(8,3);
lcd.write (byte (4));
}
if (myRTC.hours == 19){ // si minutos son 19, muestralo en grande
lcd.setCursor(2,0);//empieza el 1
lcd.write (byte (1));
lcd.setCursor(3,0);
lcd.write (byte (3));
lcd.setCursor(3,1);
lcd.write (byte (1));
lcd.setCursor(3,2);
lcd.write (byte (1));
lcd.setCursor(3,3);
lcd.write (byte (1));
lcd.setCursor(5, 0);//empieza el 9
lcd.write (byte (0));
lcd.setCursor(5, 1);
lcd.write (byte (1));
lcd.setCursor(5, 2);
lcd.write (byte (6));
lcd.setCursor(5,3);
lcd.write (byte (2));
lcd.setCursor(6,0);
lcd.write (byte (1));
lcd.setCursor(6,1);
lcd.write (byte (5));
lcd.setCursor(6, 2);
lcd.write (byte (6));
lcd.setCursor(6,3);
lcd.write (byte (1));
lcd.setCursor(7,0);
lcd.write (byte (1));
lcd.setCursor(7,1);
lcd.write (byte (5));
lcd.setCursor(7, 2);
lcd.write (byte (6));
lcd.setCursor(7, 3);
lcd.write (byte (1));
lcd.setCursor(8,0);
lcd.write (byte (3));
lcd.setCursor(8,1);
lcd.write (byte (1));
lcd.setCursor(8, 2);
lcd.write (byte (1));
lcd.setCursor(8,3);
lcd.write (byte (4));
}
delay(1000);
}
Gracias y saludos