Problema resta fecha (con rtclib)

Preformatted textDisculpen hace un tiempo publique un duda similar para restar fechas pero se cerro la consulta.
estoy buscando hacer un conteo regresivo a una fecha todos los años, osea que siempre el año sea el mismo de la resta para que solo me diga la cantidad de dias (mes+dias) , horas, minutos y segundos que restan. les comparto mi codigo. el problema es que me sale por serial que faltan 18832 dias!...17 hs:46min:.. la hora la toma de la computadora por ende supongo que el problema estara en el dt2 `Preformatted text``#include <Wire.h>
#include <RTClib.h>

// Declaramos un RTC DS3231
RTC_DS3231 rtc;

void setup () {
Serial.begin(9600);

delay(3000);

// Comprobamos si tenemos el RTC conectado
if (! rtc.begin()) {
Serial.println("No hay un módulo RTC");
while (1);
}
// Ponemos en hora, solo la primera vez, luego comentar y volver a cargar.
// Ponemos en hora con los valores de la fecha y la hora en que el sketch ha sido compilado.
// rtc.adjust(DateTime(F(DATE), F(TIME)));
}

void loop () {
DateTime now = rtc.now();
DateTime dt2 = new DateTime (now.year(),10,31,0,0,0);
TimeSpan t3 = now - dt2;
Serial.print("dt2:");
// Serial.print(dt2);
Serial.println();
Serial.print("now:");
//Serial.print(now);
Serial.println();
Serial.print(t3.days());
Serial.print(" ");
Serial.print(t3.hours());
Serial.print(":");
Serial.print(t3.minutes());
Serial.print(":");
Serial.print(t3.seconds());
Serial.println();
delay(1000);
}``Preformatted textPreformatted text
Gracias y disculpen, solo quisiera saber que modificar o que esta sumando para que no me de los dias restantes sino ese numero grande

Primero, y me extraña porque ya lo sabes, corrige tu post porque el código quedó mal presentado.

Probá cambiar la línea

DateTime dt2 = new DateTime(now.year(),10,31,0,0,0);

por

DateTime dt2 (now.year(),10,31,0,0,0);

ya que así está definida la asignación en el ejemplo datecalc de la librería.

Saludos

1 Like

Ese era el problema gatul te agradezco, pero me surgio uno similar al agregar el display y un rele, no me reconoce la funcion Set date time y por ende para compilar lo unico que puedo hacer es comentarlo y ahi vuelve a 303 dias en vez de 98 como venia haciendo bien antes de agregar el display
te adjunto el codigo con el display incluido

#include <Wire.h>

#include <Adafruit_GFX.h>  ///display
#include <Adafruit_SSD1306.h> 
  #include <RTClib.h>
   
  #define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
 int rele = 7;
  int led = 8;
RTC_DS3231 rtc;
//////////////////
   
  void setup () {
   Serial.begin(9600);
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
rtc.setDateTime(dt);  //  <---- ESTA ES LA LINEA QUE ME TIRA ERROR DICIENDO'class RTC_DS3231' has no member named 'setDateTime'  pero antes no lo ha cia

 pinMode (rele, OUTPUT);
  pinMode (led, OUTPUT);
   delay(500);
     digitalWrite (rele,HIGH); 
   // Comprobamos si tenemos el RTC conectado
   if (! rtc.begin()) {
   Serial.println("No hay un módulo RTC");
   while (1);
   }
   // Ponemos en hora, solo la primera vez, luego comentar y volver a cargar.
   // Ponemos en hora con los valores de la fecha y la hora en que el sketch ha sido compilado.
   // rtc.adjust(DateTime(F(_DATE), F(TIME_)));
  }
   
  void loop () {
    
    display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(14,18);// set the cursor at x=2, y=1 which is top left corner of display
  display.display();
   display.clearDisplay();
   
   DateTime now = rtc.now();
   DateTime dt2 (now.year(),10,31,0,0,0);   
   TimeSpan t3 = dt2 - now;
   Serial.print("dt2:");
//   Serial.print(dt2);
   Serial.println();
   Serial.print("now:");
   //Serial.print(now);
   Serial.println();
   Serial.print(t3.days());
   Serial.print(" ");
   Serial.print(t3.hours());
   Serial.print(":");
   Serial.print(t3.minutes());
   Serial.print(":");
   Serial.print(t3.seconds());
   Serial.println();
   display.print(t3.days()); 
display.print (" ");//0
display.print(t3.hours());    
display.print (":");//0//10
display.print(t3.minutes());               //0
Serial.print (":");//0
//display.print(t3.seconds()); 
       if ((now.day() == 31)&&(now.month()== 10 ))
 {
      digitalWrite (rele,LOW); 
       digitalWrite (led, HIGH);
       
           }
   else 
 {
      digitalWrite (rele,HIGH); 
       digitalWrite (led, LOW);
           }

   delay(1000);
  }

Tenés que usar .adjust().

Tal como te dice el error .setDateTime() no existe, y antes no te daba error porque no lo usabas.

Saludos

1 Like

me dice no matching function for call to 'RTC_DS3231::adjust()'
si reemplazo set datetime lo curioso es que con el codigo anterior no se pone en hora tampoco
como lo habia modificado al principio que me daba bien 98 dias no se pone ahora en hora y si coloco rtc.adjust en cualquiera de las instancias sale ese comentario

Raro, yo uso la misma librería y funciona perfectamente.
Fijate si tenes instalada la última versión.

No me baje la ultima libreria de rtclib pero sugue apare iendo 303 en vez 97 al dia de hoy no se como puedo volver a ponerlo en hora

Descomentá la línea

// rtc.adjust(DateTime(F(_DATE), F(TIME_)));

del setup(), subís el código y dejas que corra.
Volvés a comentar la línea, subís el código nuevamente y listo.