Enregistrer et afficher la date et l' heure de démarrage

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 …

vous avez une RTC DS3231?

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.

c’ est une 1307 .

Avec simpleRTC , je suis donc obligé de passé par :

//Méthodes constantes pour consultation de l'horloge
uint8_t annee() const {return this->_annee;}
uint8_t mois() const {return this->_mois;}
uint8_t jour() const {return this->_jour;}
uint8_t jourSemaine() const {return this->_joursem;} //0 dimanche, 1 lundi, 2 mardi, ...
uint8_t heure() const {return this->_heure;}
uint8_t minute() const {return this->_minute;}
uint8_t seconde() const {return this->_seconde;}

?

Et , soit je stocke chacune dans une variable , soit je fais un tableau ?

C’est sur la mega ?

oui .

Vous mettez cela dans une structure et vous utilisez la bibliothèque eeprom pour la sauvegarder

Sinon il n’y a pas un appel pour avoir l’heure unix ? Ça fait sauver juste un unsigned long

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é …

Non je parle bien de la RTC.

La bibliothèque RTCLib par exemple offre cela

Sinon pour stocker une structure en eeprom c’est assez simple

#include <EEPROM.h>

struct Moment {
  uint16_t annee;
  uint8_t mois;
  uint8_t jour;
  uint8_t heure;
  uint8_t minute;
  uint8_t seconde;
};

constexpr uint32_t sentinelle = 0xDEADBEEF;
constexpr int addrSentinelle = 0;
constexpr int addrData = addrSentinelle + sizeof sentinelle ;

void ecrireMoment(const Moment& moment) {
  EEPROM.put(addrSentinelle, sentinelle);
  EEPROM.put(addrData, moment);
}

bool lireMoment(Moment& moment) {
  uint32_t check;
  EEPROM.get(addrSentinelle, check);
  if (check != sentinelle) return false;
  EEPROM.get(addrData, moment);
  return true;
}

void setup() {
  Serial.begin(115200);

  Moment maintenant {2026, 3, 15, 11, 40, 0};
  ecrireMoment(maintenant);

  Moment lu;
  if (lireMoment(lu)) {
    Serial.print("Année: "); Serial.print(lu.annee);
    Serial.print(" Mois: "); Serial.print(lu.mois);
    Serial.print(" Jour: "); Serial.print(lu.jour);
    Serial.print(" Heure: "); Serial.print(lu.heure);
    Serial.print(" Minute: "); Serial.print(lu.minute);
    Serial.print(" Seconde: "); Serial.println(lu.seconde);
  } else {
    Serial.println("Pas de donnée valide dans l'EEPROM");
  }
}

void loop() {}

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

est qu ‘ elle supporte aussi une MAJ via NTP ?

Sinon , pourquoi stocker cette date en EEPROM ?

c’ est pas plus simple en RAM ?

La ram est effacée au reboot - si vous n’en avez besoin que pendant que la mega tourne, oui pas besoin d’eepeom.

Je pensais que vous vouliez voir combien de temps ça tenait sans reboot

oui , c ‘ est bien ça .

je pensais qu ‘ un “ simple “ affichage serait suffisant , si j’ ai une mémoire pas trop mauvaise :stuck_out_tongue: , mais c ‘ est sûr qu ‘ il vaut mieux eviter de compter sur ça :smiley:

sinon , j ‘ ai fait :

struct t_start_RTC {
uint8_t annee=RTC.annee();    //1
uint8_t mois=RTC.mois();      //2
uint8_t jour=RTC.jour();      //3
uint8_t heure=RTC.heure();    //4
uint8_t minute=RTC.minute();  //5
uint8_t seconde=RTC.seconde();//6
};

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 ."));
}
//// 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);

sans trouver ce qui ne va pas .

la ligne 31 de page_web.ino est :

affichageDateHeureSTART_ARDUINO(client, t_start_RTC);

test avec :

Moment maintenant {RTC.annee(), RTC.mois(), RTC.jour(), RTC.heure(), RTC.minute(), RTC.seconde()};

j ‘ obtiens :

18:14:42.697 -> Année: 0 Mois: 0 Jour: 0 Heure: 0 Minute: 0 Seconde: 0

pas d’ errreur à signaler dans le code sinon . Bravo !

dans le setup j ‘ ai mis :

actualiserRTC();
Moment maintenant {RTC.annee(), RTC.mois(), RTC.jour(), RTC.heure(), RTC.minute(), RTC.seconde()};

ce qui donne maintenant :

18:32:33.661 -> Année: 26 Mois: 3 Jour: 15 Heure: 18 Minute: 32 Seconde: 33

Mais , bon , chaque fois que je met le code , ça reinitialise la date + heure .

Ca ne sera pas le cas si le programme est re initialisé , donc un reboot de l ‘ arduino ?

comme je vais trouver la date + heure du reboot de l’ arduino ?

j ‘ avoue que là je suis un peu perdu pour le coup …

t_start_RTC définit un type. Ce n'est pas une variable.

Bonjour et merci pour la remarque @fdufnews .

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 :stuck_out_tongue: , ça n ‘ allait pas non plus.

L'information importante c'est ça

erreur: «start_RTC» n'a pas été déclaré dans cette portée

La variable start_RTC n'est pas visible dans le contexte de son utilisation.
Il faudrait voir tout le code pour comprendre.

voici page_web.ino :

//// 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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")); // 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;
  }
}

et le code au complet :

serveur_machine_etats_7_372_DEV_TEST.zip (25.8 KB)

Est-ce que start_RTC est une variable globale?

Je vois que pour affichageDateHeureSTART_ARDUINO() tu passes start_RTC en argument à la fonction.