Gestion du temps
Pour avoir utiliser une base de temps avec précision, on peut utiliser 2 méthodes :
- Utiliser une horloge temps réel RTC
- Récupérer l’heure sur un serveur NTP
Serveur NTP
La récupération de l’heure sur un serveur nécessite d’avoir une connexion à un réseau connecté à internet. Par exemple une carte ESP8266 et ESP32 (cf. article Wifi sur ESP8266 et ESP32).
La bibliothèque NTPclient permet de récupérer facilement l’heure courante depuis un serveur NTP. Elle s’installe classiquement depuis le gestionnaire de bibliothèque (voir http://arduino.blaisepascal.fr/installer-une-bibliotheque/)
Reste à créer l’objet temps qui contiendra l’heure courante :
WiFiUDP ntpUDP; NTPClient temps(ntpUDP, "fr.pool.ntp.org", 3600, 60000);
- fr.pool.ntp.org : le serveur NTP utilisé.
- 3600 : temps en minutes à ajouter à l’heure UTC
- 60000 : tauxde rafraichissement en millisecondes (ici toutes les 60s l’heure est rafraichie depuis le serveur NTP
D’autres serveurs NTP sont disponibles mais celui-ci donne l’heure du serveur le plus proche). On pourra également utiliser pool.ntp.org.
#include <NTPClient.h> #if defined(ESP8266) #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #elif defined(ESP32) #include <WiFi.h> #include <WiFiMulti.h> #endif #include <WiFiUdp.h> //Paramètres du WIFI const char *ssid = "SSID"; const char *password = "mdp"; #if defined(ESP8266) ESP8266WiFiMulti WiFiMulti; #elif defined(ESP32) WiFiMulti WiFiMulti; #endif WiFiUDP ntpUDP; /* * Choix du serveur NTP pour récupérer l'heure, 3600 =1h est le fuseau horaire et 60000=60s est le * taux de rafraichissement */ NTPClient temps(ntpUDP, "fr.pool.ntp.org", 3600, 60000); void setup() { Serial.begin(115200); //Initialisation du Wifi setup_wifi(); //Intialisation du client NTP temps.begin(); } void loop() { //Update de l'heure temps.update(); //L'heure est envoyée sur le port serie au format 00:00:00 en 1 fois Serial.println(temps.getFormattedTime()); //L'heure est envoyée en 3 fois (heure puis minutes puis secondes) Serial.print(temps.getHours()); Serial.print(":"); Serial.print(temps.getMinutes()); Serial.print(":"); Serial.println(temps.getSeconds()); } void setup_wifi(){ //connexion au wifi WiFiMulti.addAP(ssid, password);//WiFi.begin(ssid, password); while ( WiFiMulti.run() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } Serial.println(""); Serial.println("WiFi connecté"); Serial.print("MAC : "); Serial.println(WiFi.macAddress()); Serial.print("Adresse IP : "); Serial.println(WiFi.localIP()); }
RTC
Un module RTC est comme une horloge, qui conserve l’heure grâce à une pile. Elle communique avec la carte Arduino grâce au protocole I2C. La dérive est classiquement de quelque secondes par an. Nous n’avons donc pas besoin de connexion à internet.
#include <Wire.h> #include "RTClib.h" RTC_DS3231 rtc; char jour_semaine[7][12] = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"}; void setup () { Serial.begin(115200); delay(1000); if (! rtc.begin()) { Serial.println("RTC introuvable !"); while (1); } if (rtc.lostPower()) { Serial.println("Veuillez regler l'heure sur le module RTC!"); // Decommenter les lignes ci-dessous pour régler la date et l'heure. // La ligne ci-dessous regle la date et l'heure du momment de la compilation rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // La ligne ci-dessous regle la date et l'heure avec des valeurs explicites // Par exemplepour le 27 janvier 2017 à 12:56 : // rtc.adjust(DateTime(2017, 1, 27, 12, 56, 0)); } } void loop () { DateTime now = rtc.now(); Serial.println("Date & Heure: "); Serial.print(now.day(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.year(), DEC); Serial.print(" ("); Serial.print(jour_semaine[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); delay(1000); }