Hola chicos, estoy terminando el proyecto de las pantallas y quiero enviar la hora a una de ellas y lo consigo, pero el formato que me da es H:M:S hay alguna forma de que el formato que envie a la pantalla oled sea HH:MM:SS. Decir que uso un RTC_DS3231.
//**** INICIO CODIGO **** ENVIANDO HORA Y TEMPERATURA A PANTALLA 6 ****
void draw (void) {
hora = clock.getDateTime();
u8g2.firstPage();
do {
u8g2.setFont(u8g_font_fub14);
u8g2.drawStr(0, 16, "Tem: ");
u8g2.drawHLine(0,0,130);
u8g2.drawHLine(0,17,130);
u8g2.drawHLine(0,63,130);
u8g2.drawVLine(0,0, 90);
u8g2.drawVLine(127,0, 90);
u8g2.setFont(u8g_font_fub14);
u8g2.setPrintPos(55, 16);
u8g2.print(rtc.getTemperature());
u8g2.setPrintPos(110, 16);
u8g2.println("C");
u8g2.setPrintPos(105, 6);
u8g2.println(".");
u8g2.setFont(u8g_font_fub25);
u8g2.setPrintPos(1, 55);
u8g2.print(hora.hour);
u8g2.drawStr(45, 50, ":");
u8g2.setFont(u8g_font_fub30);
u8g2.setPrintPos(57, 55);
u8g2.print(hora.minute);
u8g2.setFont(u8g_font_fub14);
u8g2.setPrintPos(103, 55);
u8g2.print(hora.second);
}
while( u8g2.nextPage() );
tiempoSegundos = millis();
draw();
}
//**** FIN CODIGO **** ENVIANDO HORA Y TEMPERATURA A PANTALLA 6 ****
Muchas gracias.
No se si te refieres a que el formato sea 01:02:03, es decir que te muestre ese "0" de delante.
Si es eso puedes usar la funcion sprintf
char s[16]; // Un cadena de texto.
sprintf(s, "%02d:%02d:%02d", hora.hour, hora.minute, hora.second); //formateas la cadena con la hora
u8g2.print(s); // dibujas en pantalla la cadena.
Muchas gracias victorjam, funciona el formato de la hora correctamente, ahora salen los ceros delante, pero ocurre que a los 5 segundos me reinicia arduino, creo que el problema esta al entrar de nuevo en el loop, igual hay otra forma de entrar en bucle para que siempre este refrescando.
Lo he modificado para poder darle el tamaño a los segundos pero he visto que ese no es problema ya que lo he probado tal cual me lo has posteado.
//**** INICIO CODIGO **** ENVIANDO HORA Y TEMPERATURA A PANTALLA 6 ****
void draw (void) {
hora = clock.getDateTime();
char HH[16]; // Un cadena de texto.
char MM[16]; // Un cadena de texto.
char SS[16]; // Un cadena de texto.
sprintf(HH, "%02d", hora.hour); //formatea la cadena con la hora
sprintf(MM, "%02d", hora.minute); //formatea la cadena con los minutos
sprintf(SS, "%02d", hora.second); //formatea la cadena con los segundos
u8g2.firstPage();
do {
u8g2.setFont(u8g_font_fub14);
u8g2.drawStr(0, 16, "Tem: ");
u8g2.drawHLine(0,0,130);
u8g2.drawHLine(0,17,130);
u8g2.drawHLine(0,63,130);
u8g2.drawVLine(0,0, 90);
u8g2.drawVLine(127,0, 90);
u8g2.setFont(u8g_font_fub14);
u8g2.setPrintPos(55, 16);
u8g2.print(rtc.getTemperature());
u8g2.setPrintPos(110, 16);
u8g2.println("C");
u8g2.setPrintPos(105, 6);
u8g2.println(".");
u8g2.setFont(u8g_font_fub30);
u8g2.setPrintPos(1, 55);
//u8g2.print(hora.hour);
u8g2.print(HH); // dibujas en pantalla la hora
u8g2.drawStr(45, 50, ":");
u8g2.setFont(u8g_font_fub30);
u8g2.setPrintPos(57, 55);
//u8g2.print(hora.minute);
u8g2.print(MM); // dibujas en pantalla los minutos
u8g2.setFont(u8g_font_fub14);
u8g2.setPrintPos(103, 55);
//u8g2.print(hora.second);
u8g2.print(SS); // dibujas en pantalla los segundos
}
while( u8g2.nextPage() );
tiempoSegundos = millis();
draw();
}
//**** FIN CODIGO **** ENVIANDO HORA Y TEMPERATURA A PANTALLA 6 ****
Creo que ahora la pega viene en tu uso de la libreria grafica, más porque creo que estas haciendo una llamada recursiva en draw.
//**** INICIO CODIGO **** ENVIANDO HORA Y TEMPERATURA A PANTALLA 6 ****
void draw (void) {
hora = clock.getDateTime();
char HH[16]; // Un cadena de texto.
char MM[16]; // Un cadena de texto.
char SS[16]; // Un cadena de texto.
sprintf(HH, "%02d", hora.hour); //formatea la cadena con la hora
sprintf(MM, "%02d", hora.minute); //formatea la cadena con los minutos
sprintf(SS, "%02d", hora.second); //formatea la cadena con los segundos
u8g2.firstPage();
do {
u8g2.setFont(u8g_font_fub14);
u8g2.drawStr(0, 16, "Tem: ");
u8g2.drawHLine(0,0,130);
u8g2.drawHLine(0,17,130);
u8g2.drawHLine(0,63,130);
u8g2.drawVLine(0,0, 90);
u8g2.drawVLine(127,0, 90);
u8g2.setFont(u8g_font_fub14);
u8g2.setPrintPos(55, 16);
u8g2.print(rtc.getTemperature());
u8g2.setPrintPos(110, 16);
u8g2.println("C");
u8g2.setPrintPos(105, 6);
u8g2.println(".");
u8g2.setFont(u8g_font_fub30);
u8g2.setPrintPos(1, 55);
//u8g2.print(hora.hour);
u8g2.print(HH); // dibujas en pantalla la hora
u8g2.drawStr(45, 50, ":");
u8g2.setFont(u8g_font_fub30);
u8g2.setPrintPos(57, 55);
//u8g2.print(hora.minute);
u8g2.print(MM); // dibujas en pantalla los minutos
u8g2.setFont(u8g_font_fub14);
u8g2.setPrintPos(103, 55);
//u8g2.print(hora.second);
u8g2.print(SS); // dibujas en pantalla los segundos
}
while( u8g2.nextPage() );
tiempoSegundos = millis();
draw(); // ESTO ES UNA LLAMADA RECURSIVA DENTRO DE DRAW!!!!
}
//**** FIN CODIGO **** ENVIANDO HORA Y TEMPERATURA A PANTALLA 6 ****
Teniendo en cuenta el "esqueleto" del programa básico de u8g2, haria lo siguiente:
// Variables globales.
char s[16]; // La declaro global como la voy a usar en varios sitios.
// La función de dibujado.
void draw() {
// Dibujo todo y la cadena.
u8g2.print(s);
// No hago llamada recursiva a nada.
}
void setup(void) {
u8g2.begin();
}
void loop(void) {
//Leo la hora y creo la cadena que se ha de mostrar.
sprintf(s, "%02d:%02d:%02d", hora.hour, hora.minute, hora.second);
//Bucle de la libreria.
u8g2.firstPage();
do {
draw(); // La funcion de dibujado.
} while ( u8g2.nextPage() );
}
Muchas gracias, voy a probarlo.
Probado, la hora sale perfectamente y no se reinicia la placa, pero la hora no se actualiza.
Solucionado, estaba poniendo por separado el sprintf, al ponerlo como tu me has puesto arriba todo correcto, muchisimas gracias victorjam.
Salu2.