Problema con RTC SD1307

Buenas grupo!
Una vez más, necesito de vuestra ayuda. Sigo tratando de desarrollar un sistema de riego automático. Ahora mismo, estoy tratando de hacer que funcione mi RTC DS1307 y que muestre la fecha y la hora actual por una pantalla OLED. El problema, es que cuando uso la instrucción que se encarga de poner en hora el RTC haciendo uso del archivo .hex generado al compilar el código, la fecha y la hora no son correctas (al menos las que muestro por la pantalla OLED). Cuando en vez de eso uso la instrucción de ajustar el RTC a una fecha determinada, tampoco se ajusta correctamente (repito, o quizás no lo estoy mostrando correctamente por pantalla). El RTC funciona correctamente, lo he probado con el ejemplo del IDE de arduino. Dejo el código a ver si alguien puede decirme si ve algo raro.

#include <Keypad.h>
#include <SPI.h>
#include <Wire.h>//Librería necesaria para la comunicación I2C conel chip de la pantalla(Reloj)
#include <Adafruit_GFX.h>//Librería gráfica para la pantalla OLED
#include <Adafruit_SSD1306.h>//Librería necesaria para laspantallas OLED
#include "RTClib.h"
 
// Definimos constantes
#define ANCHO_PANTALLA 128 // ancho pantalla OLED. Valor típico 128
#define ALTO_PANTALLA 64 // alto pantalla OLED. Valor típico son 64 y 32

const byte filas =4;
const byte columnas=4;
char teclas [filas][columnas] ={
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
  };
byte pinesFilas [filas] = {11, 10, 9, 8};//Definimos los pines correspondientes a las filas del teclado matricial
byte pinesColumnas [columnas] = {7, 6, 5, 4};//Definimos los pines correspondientes a las filas del teclado matricial
char tecla_pulsada;
byte ano,mes,dia,hora,minuto,segundo;
char fecha[] = ("  :  :  ");
char calendario[] = ("  /  /20  ");

int i=0;
int tecla_numerica;
int tecla_anterior;
char opcion_seleccionada;
bool bandera;
bool bandera_seleccion;

void menu_principal();
void ver_fecha();
 
// Objeto de la clase Adafruit_SSD1306 y del RTC
Adafruit_SSD1306 display(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1);//&Wire es un puntero de la clase estática Wire. -1 es el pin de Arduino o ESP8266 que se utiliza para resetear la pantalla en caso de que la pantalla tenga un pin RST (no es nuestro caso)
Keypad teclado = Keypad(makeKeymap(teclas), pinesFilas, pinesColumnas, filas, columnas); ///Crea el mapa del teclado 
RTC_DS1307 rtc;
DateTime hoy;
 
void setup() {
  

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//Iniciamos la pantalla OLED que se encuentra en la dirección 0x3C
  Wire.begin();
  rtc.begin();

  rtc.adjust(DateTime(__DATE__, __TIME__));///ESTA LINEA SE TIENE QUE COMENTAR NADA MAS SE CARGUE UNA VEZ, Y VOLVER A CARGAR EL SKECTH PARA QUE DE ESTA MANERA SOLO SE PONGA EN HORA UNA VEZ A TRAVÉS DEL ORDENADOR
  //rtc.adjust(DateTime(2021, 02, 17, 19, 44, 00));
  
  menu_principal();

 
}
 
void loop() {

  
    hoy = rtc.now();///Recuperamos la fecha actual
    tecla_pulsada = teclado.getKey();//Comprobamos que tecla se ha pulsado
    opcion_seleccionada=tecla_pulsada;//La guardamos en una nueva variable

    if(opcion_seleccionada== 'D'){
      bandera_seleccion=1;
      ver_fecha();
    }


}

void ver_fecha(){
  
  hoy = rtc.now();///Recuperamos la fecha actual
  
  ano= hoy.year();
  ano= (ano>>4)*10 + (ano & 0x0F);//Convertimos el año de BCD a decimal 
  mes=hoy.month();
  mes= (mes>>4)*10 + (mes & 0x0F);//Convertimos el mes de BCD a decimal 
  dia=hoy.day();
  dia= (dia>>4)*10 + (dia & 0x0F);//Convertimos el dia de BCD a decimal 
  hora=hoy.hour();
  hora= (hora>>4)*10 + (hora & 0x0F);//Convertimos la hora de BCD a decimal 
  minuto=hoy.minute();
  minuto = (minuto >> 4) * 10 + (minuto & 0x0F); // Convertimos los minutos de BCD a decimal 
  segundo = hoy.second ();
  segundo = (segundo >> 4) * 10 + (segundo & 0x0F); // Convertimos los segundos de BCD a decimal 
  
  
  fecha [7] = segundo% 10 + 48;
  fecha [6] = segundo / 10 + 48;
  fecha [4] = minuto% 10 + 48;
  fecha [3] = minuto / 10 + 48;
  fecha [1] = hora% 10 + 48;
  fecha [0] = hora / 10 + 48;

  
  calendario [9] = ano% 10 + 48;
  calendario [8] = ano / 10 + 48;
  calendario [4] = mes% 10 + 48;
  calendario [3] = mes / 10 + 48;
  calendario [1] = dia% 10 + 48;
  calendario [0] = dia / 10 + 48;

  
  display.clearDisplay ();
  display.setCursor (0,0);
  display.print (fecha);
  display.setCursor (60,0);
  display.print (calendario);
  display.display ();
  retraso (2000);
  menu_principal ();
}
[code]

Tu problema son las conversiones de BCD a decimal que haces. RTCLib devuelve enteros con los datos en binario natural, no tienes que convertir nada, a lo sumo truncar el año a 2 dígitos. Luego, sí, la conversión a ASCII es correcta.

hoy = rtc.now();///Recuperamos la fecha actual
  
  ano = hoy.year() % 100; // eliminamos el siglo y queda año en 2 digitos
  mes = hoy.month();
  dia = hoy.day();
// carga de la demás variables

  fecha [7] = segundo % 10 + 48;
  fecha [6] = segundo / 10 + 48;
  fecha [4] = minuto % 10 + 48;
  fecha [3] = minuto / 10 + 48;
  fecha [1] = hora % 10 + 48;
  fecha [0] = hora / 10 + 48;

  calendario [9] = ano % 10 + 48;
  calendario [8] = ano / 10 + 48;
  calendario [4] = mes % 10 + 48;
  calendario [3] = mes / 10 + 48;
  calendario [1] = dia % 10 + 48;
  calendario [0] = dia / 10 + 48;

Saludos

Muchísimas gracias gatul!
Una pregunta más... ¿Cómo sabes que RTClib devuelve enteros? ¿Dónde puedo ver eso? ¿En qué archivo de la librería de Github?.
De nuevo gracias por la respuesta. Un saludo!

Tu librería no es RTClib.h? bueno, busca en Documentos\Arduino\libraries y ahi encontrarás la librería. No toques nada, solo lee con un editor pero si se te escapa el dedo recuerda cancelar.
Ahora ahi dice absolutamente como hace todo.

La otra alternativa es que vayas al administrador de librerías y busques RTClib y verás que hay un link, dicho link te lleva al Github de dicha librería y podras ver como esta realizada la librería en su totalidad.

Por supuesto que eso te va a generar mas preguntas pero para eso estamos.

@nachett primero miré los ejemplos y en ninguno hace ninguna conversión, para confirmar, revisé RTCLib.h en github (no fuese que hubiese un modo BCD y no lo estaba viendo), y para estar bien seguro, RTCLib.cpp. :smiley:

Saludos

Muchas gracias a los dos @surbyte y @gatul!!!

Moderador:
3 preguntas similares con el mismo eje, el control de riego, la pantalla OLED.
Voy a cerrar este hilo porque considero que esta respondido.
Si no esta solucionado me avisas para moverlo al hilo común y constinuar ahi con todas las preguntas relacionadas en el mismo lugar.
Gracias.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.