Domotique : obtenir la date et l'heure avec un ESP32

14 mars 2021 rdorigny 0 commentaires

La date et l'heure sont souvent des éléments nécessaires dans les applications domotique. Notamment, pour journaliser un événement ou définir le temps dans une application numérique.

Dans cet article, je vais vous montrer comment les obtenir avec un ESP32, mais cela est reproductible avec un Arduino, Raspberry et autres Systems on Chip.





1)Avec le protocole NTP

Le protocole NTP (Network Time Protocol) fournit l'heure courante (et la date) ce qui permet de synchroniser, via un réseau informatique, les horloges de nos équipements automatiquement. Pour cela, il suffit de se connecter à serveur NTP. Sur Internet, on trouve assez facilement ces serveurs NTP basés sur des horloges très précises.

Avec l'ESP32, on va pouvoir par l'intermédiaire de son contrôleur WIFI, obtenir la date et l'heure :
#include (WiFi.h) //Remplacer () par <>
#include "time.h"

const char* ssid       = "your_ssid";
const char* password   = "your_password";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;

void printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup()
{
  Serial.begin(115200);
  
  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" CONNECTED");
  
  //init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();

  //disconnect WiFi as it's no longer needed
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop()
{
  delay(1000);
  printLocalTime();
}


Attention, il est nécessaire de préciser le décalage UTC de votre fuseau horaire. Reportez-vous à la liste des décalages horaires UTC. Pour la France, on paramètre la constante gmtOffset_sec à 1h (3600s). Et ce n'est pas tout, on peut également préciser si l'on est dans un pays qui applique l'heure d'été avec la constante daylightOffset_sec, soit 3600 en période estivale.

On obtient sur le moniteur série:


Donc avec un SOC qui dispose d'une connexion Internet, on peut obtenir la date et l'heure. L'avantage de cette méthode est la simplicité, un ESP32 suffit. Inconvénient, il est nécessaire de disposer d'une box Wifi avec une connexion au réseau Internet.

2)Avec un GPS

Une autre façon d'obtenir l'heure est d'utiliser un GPS. Et il existe des modules adaptés que l'on trouve sur les sites de vente en ligne. Attention tout de même, j'ai eu une expérience modérée avec ces modules. Evitez le GT-U7 GPS, qui pour moi n'a pas fonctionné convenablement. En revanche, le module GY-NEO6MV2 NEO-6M Module contrôleur de vol GPS 3 V-5 V avec une antenne en céramique, m'a donné des résultats satisfaisants.

Ce GPS est connecté par la liaison série avec votre microcontrôleur (Arduino ou ESP32) et s'alimente de 3V à 5V. Le brochage est des plus simple. Un exemple de câblage ci-dessous, attention les pinout des ESP32 sont assez variés... Faite votre câblage selon votre modèle d'ESP32.



On peut visualiser l'échange protocolaire du GPS avec ce programme :
#include (SoftwareSerial.h)  //Remplacer () par <>

// The serial connection to the GPS module
SoftwareSerial ss(16, 17);

void setup(){
  Serial.begin(115200);
  ss.begin(9600);
}

void loop(){
  while (ss.available() > 0){
    // get the byte data from the GPS
    byte gpsData = ss.read();
    Serial.write(gpsData);
  }
}
Néanmoins, c'est assez difficile de retrouver ses petits! Il existe des librairies pour nous aider, notamment la librairie TinyGPS++ que vous trouverez assez facilement dans l'éditeur Arduino ou VisualCode. Le programme est assez basique, il suffit d'instancier un objet gps et d'utiliser les méthodes getter pour lire puis afficher les différentes coordonnées.
#include (TinyGPS++.h)  //Remplacer () par <>
#include (SoftwareSerial.h)  //Remplacer () par <>

static const int RXPin = 16, TXPin = 17;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

void setup(){
  Serial.begin(115200);
  ss.begin(GPSBaud);
}

void loop(){
  // This sketch displays information every time a new sentence is correctly encoded.
  while (ss.available() > 0){
    gps.encode(ss.read());
    if (gps.location.isUpdated()){
      Serial.print("Latitude="); 
      Serial.print(gps.location.lat(), 6);
      Serial.print(" Longitude="); 
      Serial.print(gps.location.lng(), 6);
      Serial.print(" Date:");
      Serial.print(gps.date.month());
      Serial.print("/");
      Serial.print(gps.date.day());
      Serial.print("/");
      Serial.print(gps.date.year());
      Serial.print(" Heure:");
      Serial.print(gps.time.hour());
      Serial.print(":");
      Serial.print(gps.time.minute());
      Serial.print(":");
      Serial.println(gps.time.second());
    }
  }
}


Le GPS est vraiment une solution intéressante! A noter que ce module dispose d'une antenne céramique qui réceptionne les ondes satellites. Aussi, Il y a un délais de connexion, presque une minute chez moi. Si la pièce est trop fermée, cette solution ne fonctionnera pas.

Si vous tapez dans Google Maps les coordonnées GPS, il le positionnera sur la carte. La précision est impressionnante...

Conclusion

Donc nous avons vu deux méthodes pour obtenir précisément la date et l'heure. Pour résumer, la méthode NTP nécessite un accès à Internet mais à l'avantage d'être très simple. Celle du GPS est plus autonome à condition de disposer d'un module et de ne pas être trop renfermé.

Je pense me faire une horloge pour l'atelier avec un panneau matrice LED, elle sera basée sur un ESP32 en NTP, je pense, car il est semi-enterré. On en recause.









Pseudonyme (obligatoire) :
Adresse mail (obligatoire) :
Site web :




© 2021 www.doritique.fr par Robert DORIGNY