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

Table of Contents

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);
}

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *