perso je code tout sous codeblocks ;D
C'est clair que la gestion d'un programmateur journalier est un cas d'usage fréquent dans les montages arduino.
J'avais d'ailleurs commencé à écrire quelque chose là-dessus, mais pas fini / pas publié.
L'idée était bêtement de transposer les fonctionnalités d'un programmateur horaire classique (ceux électroniques, où on règle les jours de la semaine, l'heure de début et l'heure de fin).
à utiliser en complément du simpleRTC
Le voici "as is", même pas sûr que ça compile
const uint8_t DIMANCHE = 0b0000001;
const uint8_t LUNDI = 0b0000010;
const uint8_t MARDI = 0b0000100;
const uint8_t MERCREDI = 0b0001000;
const uint8_t JEUDI = 0b0010000;
const uint8_t VENDREDI = 0b0100000;
const uint8_t SAMEDI = 0b1000000;
const uint8_t SEMAINE = LUNDI | MARDI | MERCREDI | JEUDI | VENDREDI;
const uint8_t WEEKEND = SAMEDI | DIMANCHE;
const uint8_t TOUSLESJOURS = SEMAINE | WEEKEND;
typedef void (*fonctionVoid)();//correspond à toute fonction du style "void ma_fonction()"
class progJournalier
{
public :
//Constructeur : fournir les fonctions à appeler lors de la mise en marche et lors de l'arret
progJournalier(fonctionVoid marche, fonctionVoid arret);
//Paramètres de programmation journalière
void reglerDebut(uint8_t heure, uint8_t minute);
void reglerFin(uint8_t heure, uint8_t minute);
void reglerJours(uint8_t jours); //utiliser les constantes ci-dessus, par exemple LUNDI | MARDI
//Evaluation incluant l'appel éventuel aux fonctions de mise en marche ou d'arrêt
//Valeurs en entrées fournies par un RTC
//joursem : 0=dim, 1=lun, ... 6=sam
//retourne true si changement d'état
bool actualiser(uint8_t joursem, uint8_t heure, uint8_t minute);
//Méthodes constantes d'accès aux propriétés du programme journalier
bool estActif() const;
void debut(uint8_t *heure, uint8_t *minute) const;
void fin(uint8_t *heure, uint8_t *minute) const;
uint8_t jours() const;
bool estActifLe(uint8_t joursem) const;
private :
fonctionVoid on, off;
uint16_t deb, fin;
uint8_t jrs;
bool actif;
};
progJournalier::progJournalier(fonctionVoid marche, fonctionVoid arret)
{
this->on = marche;
this->off = arret;
this->deb = 0;
this->fin = 0;
this->jrs = TOUSLESJOURS;
this->actif = false;
}
void progJournalier::reglerDebut(uint8_t heure, uint8_t minute)
{
this->deb = heure;
this->deb *= 60;
this->deb += minute;
}
void progJournalier::reglerFin(uint8_t heure, uint8_t minute)
{
this->fin = heure;
this->fin *= 60;
this->fin += minute;
}
void progJournalier::reglerJours(uint8_t jours)
{
this->jrs = jours;
}
bool progJournalier::actualiser(uint8_t joursem, uint8_t heure, uint8_t minute)
{
if (this->jrs & (1 << joursem))
{
uint16_t maintenant = heure;
maintenant *= 60;
maintenant += minute;
if (deb <= maintenant && maintenant <fin)
{
if (!this->actif)
{
this->on();
this->actif = true;
return true;
}
}
else
{
if (this->actif)
{
this->off();
this->actif = false;
return true;
}
}
}
return false;
}
bool progJournalier::estActif() const {return this->actif;}
void progJournalier::debut(uint8_t *heure, uint8_t *minute) const
{
*minute = this->deb % 60;
*heure = this->deb / 60;
}
void progJournalier::fin(uint8_t *heure, uint8_t *minute) const
{
*minute = this->fin % 60;
*heure = this->fin / 60;
}
uint8_t progJournalier::jours() const {return this->jrs;}
bool progJournalier::estActifLe(uint8_t joursem) const {return !!(this->jrs & (1 << joursem));}