Bonjour , j ‘ aimerais faire quelquechose de simple qui permette , d ‘ enregistrer une constante au démarrage de l’ arduino ( donc certainement dans le setup je pense ? ) , qui stockerait une valeur permettant ensuite d ‘ afficher la date et l ‘ heure a laquelle l ‘ arduino a démarrer .
j ‘ utilise la “ simpleRTC “ de @Bricoleau , mais je ne sais pas trop comment m ‘ y prendre pour cette operation , je n’ ai rien vu dans les fichiers simpleRTC.h/.cpp qui peremette de faire ça en une seule variable . il n ‘ y a pas de RTC.now disponible par exemple …
Apres , je pourrais passer par internet pour récuper un timestamp , mais si pas d’ internet , pas de date ni heure dispo …
Au boot (donc oui, dans le setup) vous pouvez lire la date et la sauver en EEPROM, soit sur votre Arduino, soit directement dans l'EEPROM de la DS3231 aussi.
il me semble que si , mais ça passe par internet non ? :
void reglerHeureByNTP(t_commandID identifier) {
if (internetAccessible()) {
bool requeteNTP_OK = false;
while (Udp.parsePacket() > 0) {
; // discard any previously received packets
}
sendNTPpacket(timeServer);
uint32_t beginWait = millis();
while (millis() - beginWait < timeOut) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
unsigned long secsSince1900 = highWord << 16 | lowWord;
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800 : subtract seventy years:
unsigned long epoch = secsSince1900 - 2208988800UL;
if (epoch > 1586699669UL) {
if (RTC.reglerNTP(epoch)) { // met a jour la RTC par le serveur NTP
DEBUG_PRINTLN(F("reglerHeureByNTP => RTC mise a jour ! "));
requeteNTP_OK = true;
break; // on sort du while, on a eu la réponse
}
}
}
} // fin attente réponse requête NTP
// tâche #99, tourne en boucle
requeteNTP_OK ? gestionnaireDeTache.registerAsyncCommand(identifier, 12 * TIMER_A, reglerHeureByNTP) : gestionnaireDeTache.registerAsyncCommand(identifier, TIMER_V, reglerHeureByNTP);
}
else { // internet inaccessible , on re essaie dans une heure
gestionnaireDeTache.registerAsyncCommand(identifier, TIMER_A / 2, reglerHeureByNTP);
DEBUG_PRINTLN("reglerHeureByNTP => Pas d ' acces internet !!!");
}
}
je vais essayer , pour mettre ça dans une structure , ça devrait aller .
Pour faire appel à la biliotheque EEPROM et stocker ça dedans , ça va etre plutôt corsé …
La sentinelle est utilisée pour valider les données avant lecture car à la première utilisation potentiellement vous n’aurez pas une heure correcte en eeprom.
Je tape ça ici depuis mon iPhone donc il se peut qu’il y ait des typos / bugs
je pensais qu ‘ un “ simple “ affichage serait suffisant , si j’ ai une mémoire pas trop mauvaise , mais c ‘ est sûr qu ‘ il vaut mieux eviter de compter sur ça
//// Fonctions de la page WEB : ////
void sendHTTPResponse(EthernetClient& client) {
...
affichageDateHeureSTART_ARDUINO(client, t_start_RTC);
…
}
Mais j ‘ obtiens :
/home/iznobe/Scripts/Arduino/SKETCH/TEST/serveur_machine_etats_7_372_DEV_TEST/page_web.ino: Dans la fonction «void sendHTTPResponse(EthernetClient&)»:
/home/iznobe/Scripts/Arduino/SKETCH/TEST/serveur_machine_etats_7_372_DEV_TEST/page_web.ino:31:54: erreur: expected primary-expression before «)» token
affichageDateHeureSTART_ARDUINO(client, t_start_RTC);
j ‘ ai mis ça parceque en mettant une variable “ start_RTC “ , le compilateur me renvoyait :
/home/iznobe/Scripts/Arduino/SKETCH/TEST/serveur_machine_etats_7_372_DEV_TEST/page_web.ino: Dans la fonction «void sendHTTPResponse(EthernetClient&)»:
/home/iznobe/Scripts/Arduino/SKETCH/TEST/serveur_machine_etats_7_372_DEV_TEST/page_web.ino:32:43: erreur: «start_RTC» n'a pas été déclaré dans cette portée
affichageDateHeureSTART_ARDUINO(client, start_RTC);
^~~~~~~~~
/home/iznobe/Scripts/Arduino/SKETCH/TEST/serveur_machine_etats_7_372_DEV_TEST/page_web.ino:32:43: note: suggested alternative: «t_start_RTC»
affichageDateHeureSTART_ARDUINO(client, start_RTC);
^~~~~~~~~
t_start_RTC
Utilisation de la bibliothèque SPI version 1.0 dans le dossier: /usr/share/arduino/hardware/arduino/avr/libraries/SPI
Utilisation de la bibliothèque Wire version 1.0 dans le dossier: /usr/share/arduino/hardware/arduino/avr/libraries/Wire
Utilisation de la bibliothèque Ethernet version 2.0.2 dans le dossier: /home/iznobe/Arduino/libraries/Ethernet
Utilisation de la bibliothèque EEPROM version 2.0 dans le dossier: /usr/share/arduino/hardware/arduino/avr/libraries/EEPROM
exit status 1
Erreur de compilation pour la carte Arduino Mega or Mega 2560
bêtement , je l’ ai ecouté . mais non , ça n ‘ allait pas non plus.
//// Fonctions de la page WEB : ////
void sendHTTPResponse(EthernetClient& client) {
DEBUG_PRINTLN(F("* sendHTTPResponse"));
//infos pour le navigateur
client.println(F("HTTP/1.1 200 OK")); // type du HTML
client.println(F("Content-Type: text/html; charset=UTF8")); //type de fichier et encodage des caractères
client.println(F("Connection: close")); // fermeture de la connexion quand toute la réponse sera envoyée
client.println();
//balises d'entête
client.println(F("<!DOCTYPE HTML>"));
//client.print(F("<html><head><meta http-equiv='Refresh' content='31'; URL='http://"));
//client.print (ip);
//client.print(F("/'>"));
client.print(F("<html><head>"));
client.print(F("<style>body {text-align:center;}</style></head>"));
client.println(F("<body bgcolor='#00979C'>")); // page background color
//client.println (F("<body bgcolor='#41B3A4'>")); // page background color
//**********************************************************//
// Print Welcome IP ADRESS
if (Ethernet.localIP() != IPAddress(0, 0, 0, 0)) {
client.print(F("Bienvenue , l ' adresse IP de votre arduino est : "));
if (SERVER_PORT != 80) { // 80 is the default port so not needed in the URL
client.print(Ethernet.localIP());
client.print(F(" : "));
client.println(SERVER_PORT);
}
else client.print(Ethernet.localIP());
}
//affichageDateHeureSTART_ARDUINO(client, start_RTC);
Moment lu;
if (lireMoment(lu)) {
client.print(F(". Démarrage arduino le "));
print2Digits(client, lu.jour);
client.print(F(" / "));
print2Digits(client, lu.mois);
client.print(F(" / "));
client.print(F("20"));
client.print(lu.annee);
client.print(F(" à : "));
client.print(lu.heure);
client.print(F(" H "));
client.print(lu.minute);
client.print(F(" min "));
client.print(lu.seconde);
client.print(F(" sec"));
}
else {
client.print(F("Pas de donnée valide dans l'EEPROM"));
}
client.print(F(" , vesrion en cours d ' utilisation : "));
client.println(NUMERO_VERSION);
client.println(F("</br></br>"));
//**********************************************************//
// Print Welcome time ephemeride
affichageDateHeure(client);
affichageSaison(client);
client.print(pluie ? F(" il pleut ! ") : F(" il ne pleut pas . "));
client.print(F("Le sol est "));
client.print( humidity ? F("sec .") : F("humide ."));
client.print(F(" %age humidité : "));
client.print(humidityPercent);
client.println(F("% </br>"));
//client.println(F("% </br></br>"));
// Actualise button
client.print(F("<a><button onclick=\"location.href='Z'\" type='button'>Actualiser</button></a>"));
//client.println(F("</br></br>"));
client.println(F("</br>"));
if (DEBUG && TEST) client.println(F("MODE TEST ET DEBUG ACTIFS !!!"));
else if (DEBUG) client.println(F("MODE DEBUG ACTIF !!!"));
else if (TEST) client.println(F("MODE TEST ACTIF !!!"));
//**********************************************************//
// Relais volets
// en tete du tableau
client.print(F("<TABLE width=90% border=1 align='center'><TR><TD colspan="));
client.print(NOMBREDEVOLETS);
client.println(F("><b>VOLETS ROULANTS</b></TD></TR>"));
// debut de la 1ere ligne du tableau : // affichage des noms seulements
client.println(F("<TR>"));
for (uint8_t i = 0; i < NOMBREDEVOLETS; i++) {
client.print(F("<TD width=10%>"));
client.print(lesVolets[i].nom);
client.println(F("</TD>"));
} // fin de boucle
client.println(F("</TR>"));
// fin de la 1ere ligne du tableau
// debut de la 2eme ligne du tableau : boutons ouvertures
client.println(F("<TR>"));
//t_etatVolet : uint8_t { OUVERT, FERME, EN_FERMETURE, EN_OUVERTURE, ENTROUVERT};
for (uint8_t i = 0; i < NOMBREDEVOLETS; i++) { // ligne ouverture des relais
if (lesVolets[i].etat == EN_OUVERTURE) {
client.print(F("<TD width=10%><a><button onclick=\"location.href='VA="));
client.print(i);
client.println(F("'\" type='button'> Stop</button></a></TD>"));
} else if (lesVolets[i].etat == OUVERT) client.println(F("<TD width=10%></TD>"));
else {
client.print(F("<TD width=10%><a><button onclick=\"location.href='VO="));
client.print(i);
client.println(F("'\" type='button'>Ouvrir</button></a></TD>"));
}
} // fin de boucle
client.println(F("</TR>"));
// fin de la 2eme ligne du tableau
// debut de la 3eme ligne du tableau : boutons fermers
client.println(F("<TR>")); // boutons fermeture volets
for (uint8_t i = 0; i < NOMBREDEVOLETS; i++) {
if (lesVolets[i].etat == EN_FERMETURE) {
client.print(F("<TD width=10%><a><button onclick=\"location.href='VA="));
client.print(i);
client.println(F("'\" type='button'> Stop</button></a></TD>"));
} else if (lesVolets[i].etat == FERME) client.println(F("<TD width=10%></TD>"));
else {
client.print(F("<TD width=10%><a><button onclick=\"location.href='VF="));
client.print(i);
client.println(F("'\" type='button'>Fermer</button></a></TD>"));
}
} // fin de boucle
client.println(F("</TR>"));
// fin de la 3eme ligne du tableau
// debut de la 4eme ligne du tableau : boutons groupes
client.println(F("<TR>"));
// bouton tout ouvrir
client.println(F("<TD width=10%><a><button onclick=\"location.href='VG=-3'\" type='button'>Ouvrir</br>les volets</button></a></TD>"));
// bouton tout stopper
client.println(F("<TD width=10%><a><button onclick=\"location.href='VG=-2'\" type='button'>Stopper</br>les volets</button></a></TD>"));
// bouton tout fermer
client.println(F("<TD width=10%><a><button onclick=\"location.href='VG=-4'\" type='button'>Fermer</br>les volets</button></a></TD>"));
// case vide
client.println(F("<TD width=10%></TD>"));
// bouton ouvrir groupe jour
client.println(F("<TD width=10%><a><button onclick=\"location.href='VG=-5'\" type='button'>Ouvrir groupe jour</button></a></TD>"));
// bouton ouvrir groupe nuit
client.println(F("<TD width=10%><a><button onclick=\"location.href='VG=-6'\" type='button'>Ouvrir groupe nuit</button></a></TD>"));
// bouton fermer groupe jour
client.println(F("<TD width=10%><a><button onclick=\"location.href='VG=-7'\" type='button'>Fermer groupe jour</button></a></TD>"));
// bouton fermer groupe nuit
client.println(F("<TD width=10%><a><button onclick=\"location.href='VG=-8'\" type='button'>Fermer groupe nuit</button></a></TD>"));
client.println(F("</TR>"));
// fin de la 4eme ligne du tableau
client.println(F("</TABLE>")); // fin du tableau volets
//**********************************************************//
// Relais arrosage
// en tete du tableau
client.println(F("</br>"));
client.print(F("<TABLE width=90% border=1 align='center'><TR><TD colspan="));
client.print(NOMBREDARROSAGE + 3); // +3 pour arrosage mode global et mode auto
client.print(F("><b>ARROSAGE</b>"));
client.println(F("</TD></TR>")); // en tete du tableau
// debut de la 1ere ligne du tableau : affichage des noms seulement
client.print(F("<TR>"));
for (uint8_t i = 0; i < NOMBREDARROSAGE; i++) {
client.print(F("<TD width=10%>"));
client.print(lesArrosages[i].nom);
client.println(F("</TD>"));
} // fin de boucle
client.println(F("<TD colspan=4 width=30%>Global</TD>"));
client.println(F("</TR>"));
// fin de la 1ere ligne du tableau
// debut de la 2eme ligne du tableau : boutons
client.println(F("<TR>"));
for (uint8_t i = 0; i < NOMBREDARROSAGE; i++) { // ligne ouverture des relais
client.print(lesArrosages[i].etat != ACTIF ? F("<TD width=10%><a><button onclick=\"location.href='AM=") : F("<TD width=10%><a><button onclick=\"location.href='AA="));
client.print(i);
client.print(F("'\" type='button'>"));
client.print(lesArrosages[i].etat != ACTIF ? F("OFF") : F("ON"));
client.println(F("</button></a></TD>")); // fin du lien
} // fin de boucle
client.println(F("<TD width=10%><a><button onclick=\"location.href='AG=-3'\" type='button'>Marche</button></a></TD>")); // MARCHE_TOUT
client.println(F("<TD width=10%><a><button onclick=\"location.href='AG=-4'\" type='button'>Arret</button></a></TD>")); // ARRET_TOUT
client.print(F("<TD width=10%><a><button onclick=\"location.href='AO=-1'\" type='button'>")); // arrosageAutoON = !arrosageAutoON;
client.println(arrosageAutoON == true ? F("Auto ON </button></a></TD>") : F("Auto OFF </button></a></TD>")); // fin du lien
client.println(F("</TR>"));
// fin de la 2eme ligne du tableau
client.println(F("</TABLE>"));
//**********************************************************//
// Relais autres
// en tete du tableau
client.println(F("</br>"));
client.print(F("<TABLE width=90% border=1 align='center'><TR><TD colspan="));
client.print(NOMBREDERELAIS);
client.print(F("><b>RELAIS AUTRE</b>"));
client.println(F("</TD></TR>"));
// fin en tete du tableau
// debut de la 1ere ligne du tableau : affichage des noms seulements
client.println(F("<TR>"));
for (uint8_t i = 0; i < NOMBREDERELAIS; i++) {
client.print(F("<TD width=10%>"));
client.print(lesRelais[i].nomRelais);
client.println(F("</TD>"));
} // fin de boucle
client.println(F("</TR>"));
// fin de la 1ere ligne du tableau.
// debut de la 2eme ligne du tableau :
client.println(F("<TR>"));
for (uint8_t i = 0; i < NOMBREDERELAIS; ++i) {
if (strcmp(lesRelais[i].nomRelais, "Portail") == 0) {
client.print((lesRelais[i].etat == INACTIF) ? F("<TD width=10%><a><button onclick=\"location.href='PO=") : F("<TD width=10%><a><button onclick=\"location.href='PF="));
client.print(i);
client.print(F("'\" type='button'>"));
client.print((lesRelais[i].etat == INACTIF) ? F("Ouvrir") : F("Fermer"));
client.print(F("</button></a> ")); // fin du lien
// mode ouverture / attente / fermeture auto :
client.print(F("<a><button onclick=\"location.href='PA="));
client.print(i);
client.println(F("'\" type='button'>mode auto</button></a></TD>")); // fin du lien
}
if (strcmp(lesRelais[i].nomRelais, "Heures creuses") == 0) {
client.print(F("<TD width=10%>"));
client.print((lesRelais[i].etat == INACTIF) ? F("Desactivé") : F("Activé"));
client.println(F("</TD>")); // Pas de lien
}
} // fin de boucle
client.println(F("</TR>"));
// fin de la 2eme ligne du tableau
client.println(F("</TABLE>"));
//**********************************************************//
// fin de page
client.println(F("</body></html>"));
}
//// Fonctions speciales affichage de la page WEB ////
const char* afficherJourSemaine(uint8_t joursem) {
const char* jours[]{ "Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi" };
return jours[joursem]; // de 0 à 6
}
void print2Digits(EthernetClient& client, uint8_t nombre) {
if (nombre < 10) client.write('0');
client.print(nombre);
}
void affichageDateHeureSTART_ARDUINO(EthernetClient& client, t_start_RTC& start_RTC) {
client.print(F("Démarrage arduino le "));
print2Digits(client, start_RTC.jour);
client.print(F(" / "));
print2Digits(client, start_RTC.mois);
client.print(F(" / "));
client.print(F("20"));
client.print(start_RTC.annee);
client.print(F(" à : "));
client.print(start_RTC.heure);
client.print(F(" H "));
client.print(start_RTC.minute);
client.print(F(" min "));
client.print(start_RTC.seconde);
client.print(F(" sec ."));
}
void affichageDateHeure(EthernetClient& client) {
client.print(F("Aujourd ' hui nous sommes "));
client.print(afficherJourSemaine(RTC.jourSemaine()));
client.print(F(" "));
print2Digits(client, RTC.jour());
client.print(F(" / "));
print2Digits(client, RTC.mois());
client.print(F(" / "));
client.print(F("20"));
client.print(RTC.annee());
client.print(F(" , il est : "));
client.print(RTC.heure());
client.print(F(" H "));
client.print(RTC.minute());
client.print(F(" min "));
client.print(RTC.seconde());
client.print(F(" sec ."));
}
void affichageSaison(EthernetClient& client) {
switch (saison) {
case PRINTEMPS:
client.print(F(" C ' est le Printemps !"));
break;
case ETE:
client.print(F(" C ' est l ' Ete !"));
break;
case AUTOMNE:
client.print(F(" C ' est l ' Automne !"));
break;
case HIVER:
client.print(F(" C ' est l ' Hiver !"));
break;
default:
client.print(F(" "));
break;
}
}