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.