Bonjour oasixm
J’ai intégré la possibilité de faire des tâches périodiques, pour le moment, uniquement basé sur les minutes. Ainsi tu pourras avoir un enregistrement des mesures tous les xx :00 :xx et xx :30 ;xx.
Par manque d’imagination, j’ai appelé ça des alarmes.
Les minutes des alarmes se mettent dans ce tableau :
alarmesDef alarmes[]=
{
{0, 00, 0}, //Toutes les xx:00:xx
{0, 30, 0}, //Toutes les xx:30:xx
};
Si tu veux toutes les 15 minutes :
alarmesDef alarmes[]=
{
{0, 00, 0}, //Toutes les xx:00:xx
{0, 15, 0}, //Toutes les xx:15:xx
{0, 30, 0}, //Toutes les xx:30:xx
{0, 45, 0}, //Toutes les xx:45:xx
};
Ou n’importe quand :
alarmesDef alarmes[]=
{
{0, 07, 0},
{0, 23, 0},
{0, 12, 0},
{0, 55, 0},
};
Les alarmes sont traitées dans l’ordre chronologique des minutes et non pas dans l’ordre de leur place dans le tableau.
Comme je n’ai pas de sonde BME280 (c’est en commande), je ne l’ai pas intégrée dans cette version, je te laisse le faire.
Pour ajouter ces alarmes, je suis parti de la version corrigée du post #51.
La nouvelle version (cherches alarme dans le programme pour voire les ajouts)
/*
Name: ARDFR_oasixm10derniers.ino
Created: 08.07.2021
Author: jpbbricole
*/
#include "RTClib.h"
RTC_DS1307 rtc;
const char daysOfTheWeek[7][12] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
//------------------------------------- Alarmes
struct alarmesDef
{int heure; int minute; boolean executed;};
alarmesDef alarmes[]=
{
{0, 0, 0}, //Toutes les xx:00:xx
{0, 30, 0}, //Toutes les xx:30:xx
};
const int almNombre = sizeof(alarmes)/sizeof(alarmes[0]); // Nombre d'alarmes
//------------------------------------- Journal des mesures
const int mesuresNombre = 10;
struct mesuresJournalDef
{DateTime now; float pression;};
mesuresJournalDef mesuresJournal[mesuresNombre];
int journalIndex = 0;
int journalIndexListe[mesuresNombre];
#define btnJournal 12 // Bouton pour déclencher l'affichage du journal
void setup()
{
Serial.begin(115200);
pinMode(btnJournal, INPUT_PULLUP);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
for (int a = 0; a < almNombre; a ++)
{
alarmes[a].executed = false; // Pour débloquer l'alarme
}
for (int i = 0; i < mesuresNombre; i ++)
{
journalIndexListe[i] = -1; // Index inutilisé
}
journalIndex = -1;
Serial.print(F("Demarrage a ")); Serial.println(dateHeure());
if (almNombre > 0)
{
Serial.print(F("\nAlarmes(s) ")); Serial.println(almNombre);
for (int a = 0; a < almNombre; a ++)
{
Serial.print(alarmes[a].heure); Serial.print(":");
Serial.print(alarmes[a].minute); Serial.print(":");
Serial.println("00");
}
}
}
void loop()
{
//--------------------------------- Alarmes
for (int a = 0; a < almNombre; a ++)
{
if (alarmeCheck(a)) // S'il y a alarme
{
mesureDansJournal();
journalListeOne(journalIndexListe[journalIndex]);
}
}
if (digitalRead(btnJournal) == LOW)
{
journalListe();
while(digitalRead(btnJournal) == LOW){}
Serial.println("");
}
}
void mesureDansJournal()
{
journalIndex += 1;
journalIndex = journalIndex >= mesuresNombre ? 0 : journalIndex;
mesuresJournal[journalIndex].now = rtc.now();
mesuresJournal[journalIndex].pression = pressionMesure();
//--------------------------------- Décalage de l'index du journal vers "le bas"
for (int i = mesuresNombre-2; i >= 0; i --)
{
journalIndexListe[i+1] =journalIndexListe[i];
}
journalIndexListe[0] = journalIndex;
}
/*-------------------------------------------------------------------
Affichage du journal des mesures
Le journal est décalé de telle façon que la dernière mesure
se trouve en tete
'*-------------------------------------------------------------------
*/
void journalListe()
{
Serial.println("\n\tJournal des mesures");
for (int i = 0; i < mesuresNombre; i ++)
{
if (journalIndexListe[i] != -1) // Si index utilisé
{
journalListeOne(i);
}
}
}
void journalListeOne(int journalIndex)
{
Serial.print(mesuresJournal[journalIndexListe[journalIndex]].now.timestamp(DateTime::TIMESTAMP_DATE) +"/");
Serial.print(mesuresJournal[journalIndexListe[journalIndex]].now.timestamp(DateTime::TIMESTAMP_TIME) +"\t p:");
Serial.println(mesuresJournal[journalIndexListe[journalIndex]].pression);
}
String dateHeure()
{
String retVal = "";
DateTime now = rtc.now();
retVal = (String)daysOfTheWeek[now.dayOfTheWeek()];
retVal += ", ";
retVal += now.timestamp(DateTime::TIMESTAMP_DATE); // Date
retVal += "/";
retVal += now.timestamp(DateTime::TIMESTAMP_TIME); // Heure
return retVal;
}
float pressionMesure()
{
static float pression = 12.124;
pression += 0.13;
if (pression > 22.0)
{
pression = 12.1;
}
return pression;
}
//--------------------------------- Alarmes
boolean alarmeCheck(int almIndex)
{
boolean almOk = false;
DateTime almTime = rtc.now();
if (alarmes[almIndex].minute == almTime.minute() ) // Si alarme libre
{
if (alarmes[almIndex].executed == false) // Si l'alarme n'est pas en exécution
{
alarmes[almIndex].executed = true;
almOk = true;
}
}
else
{
alarmes[almIndex].executed = false; // Libérer l'alarme
}
return almOk;
}
A ta disposition
Cordialement
Jpbbricole