RESUELTO: Orientacion sobre codigo de fechas

Partiendo de este codigo que encontre en el foro, he intentado pasar todos los dias, horas a minutos para sumarlos.
Tengo 72 años y solo es un reto personal como muchos codigos que a partir del foro he ido desarrollando.

Para enpezar en esta parte:

 Serial.print(String(((month(H) - 1) * 30) * 1440)  + " minutos en los 2 meses, "); //86400 minutos

no me da los minutos reales que tendrian que ser, da mucos menos.

En esta otra parte tampoco da los dias totales reales, puesto que el mes de febrero trae 28 dias y 29 si es bisiesto.

Serial.print( String(month(H) - 1 ) + " meses,");
  Serial.println(String(day(H) - 1) + " dias," + String(hour(H)) + " horas, " + String(minute(H)) + " minutos");

Este es codigo que he usado:

#include <Time.h>
#include <TimeLib.h>
time_t  T0, T1 ;         // Contenedores de fechas


void setup()
{
  Serial.begin(115200);
}//fin setup

void loop()    {

  T0 = SetFecha(2020,  12,   18,  9,  30,  0);  //18/12/2020 09:30:00
  printFecha(T0) ;
  T1 = SetFecha(2021,  03,  01, 07,  0,  0);  // 1/03/2021 7:00:00
  printFecha(T1) ;
  printFecha(T1 - T0);

  Serial.println("--------------------------------------------------");
  time_t H =  T1 - T0 ;

  Serial.print( String(month(H) - 1 ) + " meses,");
  Serial.println(String(day(H) - 1) + " dias," + String(hour(H)) + " horas, " + String(minute(H)) + " minutos");

  Serial.println("*************************************************");
  Serial.println( String((month(H) - 1) * 30 ) + " dias en los meses, ");
  Serial.print(String(((month(H) - 1) * 30) * 1440)  + " minutos en los 2 meses, "); //86400 minutos

  Serial.println(String((day(H) - 1) * 1440) + " minutos en los dias," + String((hour(H) * 60)) + " minutos en las horas, " + String(minute(H)) + " minutos");
  Serial.println("---------------------------------------------------");

  Serial.println( String((((month(H) - 1) * 30) * 1440 ) + ((day(H) - 1) * 1440)  + (hour(H) * 60) +  minute(H)));// no coincide
}//fin lood

void printFecha(time_t  t)
{
  Serial.print(day(t)) ;    Serial.print(+ "/") ;   Serial.print(month(t));   Serial.print(+ "/") ;
  Serial.print(year(t));    Serial.print( " ") ;
  Serial.print(hour(t));   Serial.print(+ ":") ;   Serial.print(minute(t));   Serial.print(":") ;
  Serial.println(second(t));
  delay(1000);
}//fin printfecha

time_t SetFecha(int y, int m, int d, int h, int mi, int s  )
{ tmElements_t Fecha ;
  Fecha.Second = s;
  Fecha.Minute = mi;
  Fecha.Hour = h;
  Fecha.Day = d ;
  Fecha.Month = m ;
  Fecha.Year = y - 1970 ;

  return makeTime(Fecha);
}//fin setfecha


Podeis orientarme para poder pasar los dias reales, horas a minutos y poderlos sumar. Seguramente halla una manera mas simple de hacerlo.
Un saludo y perdon si pongo algo mal escrito o fuera de lugar.

Hola @santillana te respondo paso a paso.
La diferencia T1-T0 funciona perfectamente, cambié tu código con T1 a 1 dia, 1 mes 6 meses y luego con horas y dias y siempre dió la respuesta correcta.
Tu error al ver valores negativos debe tener que ver con el tipo de variable elegida.
Ahora miro y te lo indico.

Yo elegí 1 mes y mira la respuesta que da
18/12/2020 9:30:0
18/1/2021 9:30:0
1/2/1970 0:0:0

1 meses,0 dias,0 horas, 0 minutos


30 dias en los meses,
-22336 minutos en los 2 meses, 0 minutos en los dias,0 minutos en las horas, 0 minutos

Vamos bien hasta los minutos, porque claro, son muchos minutos en 1 mes y el tipo de variable que has usado queda rebasado.
Los enteros sin signo toleras 2^16 bits => de 0 a 65535 números
si eso no alcanza entonces usar unsigned long 2^32 calculadora y te da algo como 4mil millones de números.
En donde empiezan los problemas es en los minutos
Esto debería funcionar mejor
Acá mi programa con 1 mes, 1 dia, 1 hora, 1 min y 1 segundo mas

#include <TimeLib.h>
time_t  T0, T1 ;         // Contenedores de fechas


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


  T0 = SetFecha(2020, 12, 18, 9, 30, 0);  //18/12/2020 09:30:00
  printFecha(T0) ;
  T1 = SetFecha(2021, 01, 19, 10, 31, 1);  //18/12/2020 09:30:00
  //SetFecha(2021,  03,  01, 07,  0,  0);  // 1/03/2021 7:00:00
  printFecha(T1) ;
  printFecha(T1 - T0);

  Serial.println("--------------------------------------------------");
  time_t H =  T1 - T0 ;

  int meses = month(H) - 1;
  Serial.print( String(meses ) + " meses,");
  int dias = day(H) - 1;
  int horas = hour(H);
  int minutos = minute(H);
  Serial.println(String(dias) + " dias," + String(horas) + " horas, " + String(minutos) + " minutos");

  Serial.println("*************************************************");
  if (meses == 1) 
      Serial.println( "30 dias en 1 mes, ");
  else 
      Serial.println( String(meses * 30 ) + " dias en los " + String(meses) +" meses, ");
  unsigned long minxmes = (month(H) - 1) * 86400;
  if (meses == 1) 
      Serial.print(String(minxmes)  + " minutos en 1 mes, "); //86400 minutos
  else
      Serial.print(String(minxmes)  + " minutos en los " + String(meses)+" meses, "); //86400 minutos
  unsigned long minxdia = (day(H) - 1) * 1440;
  Serial.println(String(minxdia) + " minutos en los dias," + String((hour(H) * 60)) + " minutos en las horas, " + String(minute(H)) + " minutos");
  Serial.println("---------------------------------------------------");
  unsigned long verifico = meses * 86400 + dias * 1440  + horas +  minutos; 
  Serial.println( String(verifico));// no coincide
}

void loop()    {

}//fin lood

void printFecha(time_t  t)
{
  Serial.print(day(t)) ;    Serial.print(+ "/") ;   Serial.print(month(t));   Serial.print(+ "/") ;
  Serial.print(year(t));    Serial.print( " ") ;
  Serial.print(hour(t));   Serial.print(+ ":") ;   Serial.print(minute(t));   Serial.print(":") ;
  Serial.println(second(t));
  delay(1000);
}//fin printfecha

time_t SetFecha(int y, int m, int d, int h, int mi, int s  )
{ tmElements_t Fecha ;
  Fecha.Second = s;
  Fecha.Minute = mi;
  Fecha.Hour = h;
  Fecha.Day = d ;
  Fecha.Month = m ;
  Fecha.Year = y - 1970 ;

  return makeTime(Fecha);
}//fin setfecha

El inconveniente estaba acá, al final

unsigned long verifico = meses * 86400 + dias * 1440  + horas +  minutos; 
  Serial.println( String(verifico));// no coincide

al usar un tipo de variable que simplemente contiene como corresponde la cuenta, no hay problema de overflow o rebasamiento porque multiplicar algo por 86400 saca a los enteros de su máximo posible representable que es 65535
1x86400 > 65535 y eso da overflow que se representa con un valor negativo.
Al usar long o unsigned long se supera el problema
Podria tambien haberse resuelto asi

Serial.println( String((long) (((month(H) - 1) * 86400 ) + ((day(H) - 1) * 1440)  + (hour(H) * 60) +  minute(H))));// no coincide

Muchas gracias Surbyte, lo probare e intentare seguir disfrutando del codigo. saludos

@Surbyte he probado el codigo y da muchos mas minutos de los reales, despues de darle vueltas y tener la calculadora al lado, descubri una web: Calcul De Durée Entre Deux Dates - horlogeparlante.com.
En ella salen los resultados reales de fecha a fecha:
Del : 15/12/2020 09:30:00
Al : 15/02/2021 12:31:00
62 días , 3 horas y 1 minuto
O :
62 días
o 1 491 horas
o 89 461 minutos
o 5 367 660 segundos

creo que es porque no se ha tenido en cuenta que febrero son 28 dias (29 bisiesto) y que hay meses de 30 dias tanbien.
Voy a intentar sacar lo del bisiesto y ya comentare.

Pero @santillana, yo seguí tu código y resolví el problema no pla precisión. Para mi el programa es una versión muy simple de lo que quieres hacer pero hay librerías que lo hacen y yo soy muy partidario de usarlas y no reinventar la rueda (será porque no tengo tiempo). Cierto es que 28 tiene febrero pero tambien como decía el viejo cantito de la primaria " 30 días trae noviembre, con Abril, Junio y Setiembre, de 28 solo hay uno y los demás de 31".
Asi que tu problema no es solo Febrero sino que no todos son de 30.
Asi que debes crear un Array con los meses, ver cuales estan involugrados y hacer la suma de días que corresponde, tmb verificar el año por si es divisible por 4 y en ese caso sumar uno mas.
No es dificil, como ejercicio de programación es bueno e interesante, involucra array de 1 dimensión o mas si quieres o deseas usarlos que es lo que te aconsejo aunque te genere dolor de cabeza.
Recuerda, usa Google Arduino LoQueNoSeYQuieroBuscar
LoQueNoSeYQuieroBuscar esto que és, lo que yo llamo mi variable a buscar
Ejemplo
si quiero buscar array pongo en Google: Arduino Array

yo seguí tu código y resolví el problema no pla precisión, esto que dices no es cierto del todo, porque yo pregunte los dias reales.
Al final resulto ser mas facil de lo que pensaba sin usar arrays ni nada parecido, solo con otro codigo aun mas simple.

#include <Wire.h>
#include <RTClib.h>
//#include <TimeLib.h>
void fecha(const char* txt, const DateTime& f) {
  Serial.print(txt);
  Serial.print(" = ");
  Serial.print(f.year());
  Serial.print('/');
  if (f.month() < 10) {
    Serial.print('0');
  }
  Serial.print(f.month());
  Serial.print('/');
  if (f.day() < 10) {
    Serial.print('0');
  }
  Serial.print(f.day());
  Serial.print(' ');
  if (f.hour() < 10) {
    Serial.print('0');
  }

  Serial.print(f.hour());
  Serial.print(':');
  if (f.minute() < 10) {
    Serial.print('0');
  }
  Serial.println(f.minute());
 
}


void setup() {
  Serial.begin(9600);
DateTime fechaI (2020, 12, 15, 9, 30 );  //
  fecha("fechaInicio", fechaI);
  DateTime fechaF (2021, 2, 15, 12,31 );   //
  fecha("fechaFinal", fechaF);

  //Calcular diferencia
  TimeSpan dif = fechaF - fechaI;
  diferencia("fechaFinal-fechaInicio", dif);
 

}//setup fin

void loop (){

  
}

void diferencia(const char* txt, const TimeSpan& d) {
  Serial.print(txt);
  Serial.print(" = ");
 Serial.print(d.days());
  Serial.print(" dias ");
  Serial.print(d.hours());
  Serial.print(" horas ");
  Serial.print(d.minutes());
  Serial.println(" minutos ");

  unsigned long verifico =(d.days() * 1440L + d.hours() * 60 +  d.minutes());
  Serial.println( String(verifico) + "  minutos totales");// coincide
   
}

Hola @santillana, no entiendo a qué te refieres con que no es cierto del todo. Me das un ejemplo?

@Surbyte pregunte por ayuda con los dias reales, no con los dias que salieran por salir. De todas formas ya esta resuelto de otra manera.

Okay.

@santillana Por favor comparte la solución, puede serle útil a muchos usuarios.

Recuerda que esto es ida y vuelta, así como pides una ayuda es bueno que compartas lo que puede ayudar a otros.

Saludos

Bueno llegue tarde, pero una forma fácil de trabajar con fecha es el tiempo unix y la misma librería da las herramientas .Por ejemplo si quisieras sumar 4 años de 365 a una fecha y obtener la fecha (inclusive los bisiestos) con formato "humano"

#include <Wire.h>
#include "RTClib.h"

void showDate(const char* txt, const DateTime& dt) {
    Serial.print(txt);
    Serial.print(' ');
    Serial.print(dt.year(), DEC);
    Serial.print('/');
    Serial.print(dt.month(), DEC);
    Serial.print('/');
    Serial.print(dt.day(), DEC);
    Serial.print(' ');
    Serial.print(dt.hour(), DEC);
    Serial.print(':');
    Serial.print(dt.minute(), DEC);
    Serial.print(':');
    Serial.print(dt.second(), DEC);
    Serial.print(" = ");
    Serial.print(dt.unixtime());
    Serial.print("s / ");
    Serial.println();
}

void setup () {
Serial.begin(57600);
    DateTime Hora1 (2021, 12, 27, 0, 0, 0);
    showDate("hora",Hora1);
    uint32_t b= 3600UL*24UL*1460UL;//4 años de 365 dias
    uint32_t a =Hora1.unixtime()+ b;//
    DateTime dias_despues ( a); // Fecha 3000 dias despues
    showDate("1460 Dias despues", dias_despues);
}
void loop () { }

Esta puesto en el post numero 6.

Ah, Ok.
Interpreté que lo habías resuelto de otra manera no expuesta aquí. :man_facepalming:t2:

Saludos