Nueva libreria Temporizador (modificada)

Bueno, tras "estudiar" a fondo tu libreria, y a riesgo de ser el "malo" porque los demas comentarios son de elogio, te voy a dar mi opinion.

Antes de seguir quiero recalcar que lo que trato es de que veas que hay un camino a seguir para el desarrollo del software que deba servir para otros (es fundamental que funcione bien).
Intento explicarte las cosas para que puedas, de verdad, ahondar en el camino que has inicado y que me parece el correcto (programar, programar y programar).

Empecemos.

La libreria así como está NO funciona.

  • Las variables donde se guarda dd, hh, mm, ss deben declararse en la seccion <.H>, darles
    rango de para evitar accesos indeseados, y declararlas como
  • Sobra el constructor (no hace nada), además el compilador de C++ ya incluye uno por defecto.
  • La funcion de inicializacion no inicializa nada por lo que la ejecucion del programa es errónea ya
    que no inicializa diaAnt, horaAnt, minutoAnt ni segundoAnt.
  • Al llamar a la funcion <encender()> se asume que segundo=millis()/100, pero el valor devuelto
    por millis() puede ser de hasta 4.294.967.295 milisegundos, por lo que la toma de datos que
    hacemos puede arrojar directamente un valor de unos 50 dias !!!
  • Para que la libreria funcione adecuadamente hay que estar llamando a <temporizar()> constantemente
    durante el loop. Si aumentamos el número de temporizadores activos, el programa no es manejable.
    Lejos del proposito utópico de ".. temporizadores ilimitados,..."
  • Y además despilfarramos recursos preciosos (no todo el mundo usa el ATmega2560).

Para que veas a que me estoy refiriendo ahí va una versión simplificada pero operativa de lo que seria una libreria como esa:

Esta es la libreria en sí (Temporizador.h)

// ---------
// Codigo .H
// ---------
#include "Arduino.h"

class Temporizador
{
public:
        // ------------------------------------------------
        // Inicializa el temporizador con los valores dados
        // ------------------------------------------------
        void iniciar(int dia, int hora, int minuto, int segundo)
        {
    _tiempo=(((dia*24+hora)*60+minuto)*60+segundo)*1000;
            if(_tiempo==0) _tiempo=1000;   // Un segundo minimo
    _tiempo=_tiempo+millis();
        }
        // ----------------------------------
        // Chequea si el T/O se ha completado
        // ----------------------------------
        boolean completado()
        {
    if(millis()>=_tiempo) return(true);
    else return(false);
        }
private:
 volatile unsigned long _tiempo;
};

Y este un pequeño ejemplo ilustrativo:

//*************************
// Ejemplo
//*************************
#include "Temporizador.h"
#define pinLed  13

// Instanciamos la clase
Temporizador timer;

void setup()
{
 // Definimos pin 13 como salida
 pinMode(pinLed,OUTPUT);
 // Lo inicializamos a una condicion conocida
 digitalWrite(pinLed,LOW);
        // Instanciamos la clase
 // --------------------------------------
 // Ponemos un T/O = 15 min, 27 seg
 // Tambien podemos ponerlo en el <loop()>
 // --------------------------------------
 timer.iniciar(0,0,15,27);
}

void loop()
{
 if(timer.completado())
 {
 // Si queremos invertir la salida ...
 digitalWrite(pinLed,!digitalRead(pinLed));
 // Si queremos fijarla ...
 //digitalWrite(pinLed,HIGH);
 
 // Ejemplo de repeticion del timer con otro intervalo
 timer.iniciar(0,1,10,0);
 }
 // ... resto del programa ...
}

Y como colofon, podriamos poner en marcha cuantos temporizadores quisieramos sin mas que hacer nuevas instancias de la clase:

#include "Temporizador.h"

#define pinLed  13

// Instanciamos la clase
Temporizador timer;
Temporizador timer1;
Temporizador timer2;
Temporizador timer3;

//... y en el loop() ...
if(timer.completado()) { }
if(timer1.completado()) {}
if(timer2.completado()) {}
if(timer3.completado()) {}

Espero que mi comentario te ayude.