#include "WiFiEsp.h" // https://github.com/bportaluri/WiFiEsp
#include "WiFiEspUdp.h" // est inclus dan la librairie WiFiEsp
#include <TimeLib.h> // https://github.com/PaulStoffregen/Time
// on défini une 2eme com serie en D2 et D8 pour communiquer avec l'ESP
HardwareSerial ESP(D2, D8); // RX, TX
char ssid[] = "XXXX"; // Votre réseau wifi
char pass[] = "YYYY"; // Votre mdp du réseau wifi
int status = WL_IDLE_STATUS; // l'état du réseau wifi
char timeServer[] = "fr.pool.ntp.org"; // le pool de serveur ntp interrogé
unsigned int localPort = 8888; // port d'écoute des packets UDP
const int NTP_PACKET_SIZE = 48; // L'horodatage NTP se trouve dans les 48 premiers octets du message
const int UDP_TIMEOUT = 2000; // délai d'attente pour l'arrivée d'un paquet UDP
const int timeZone = 1; // la timezone pour UTC vers GMT (+1 paris)
byte packetBuffer[NTP_PACKET_SIZE]; // tampon pour contenir les paquets entrants et sortants
// on instance l'UDP
WiFiEspUDP Udp;
// variable pour stocker l'heure précédente
time_t prevDisplay = 0;
// fonction pour afficher l'heure et la date
void digitalClockDisplay() {
// digital clock display of the time
printDigits(hour());
Serial.print(":");
printDigits(minute());
Serial.print(":");
printDigits(second());
Serial.print(" ");
printDigits(day());
Serial.print("/");
printDigits(month());
Serial.print("/");
Serial.print(year());
Serial.println();
}
// fonction qui met en forme les chiffres de 0 à 9 sur 2 digits
void printDigits(int digits) {
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}
void setup() {
Serial.begin(115200); // On démmarre la com série avec le pc a 115200 baud
ESP.begin(115200); // On démmarre la com série avec l'ESP a 115200 baud
WiFi.init(&ESP); // On initialisle la connection au réseau
// On test si on a le réseau à travers l'esp
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("Je tourve pas l'ESP");
while (true); // On ne continue pas
}
// On essaye de se connécter au réseau wifi
while ( status != WL_CONNECTED) {
Serial.print("J'essaye de me connecter au réseau wifi : ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
}
// On affiche les infos de connexions
Serial.print("Connécté à : ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("Mon ip est : ");
Serial.println(ip);
// On demarre l'udp
Udp.begin(localPort);
// on configure la synchronisation (toutes les 30s on interrogera le serveur NTP)
setSyncProvider(getNtpTime);
setSyncInterval(30); // 30 secondes pour les tests sinon 300 secondes ou plus
}
void loop() {
if (timeStatus() != timeNotSet) { // si le temps est configuré
if (now() != prevDisplay) { // ne met à jour l'affichage que si l'heure a changé
prevDisplay = now(); // l'ancienne heure devient celci
digitalClockDisplay(); // on affiche l'heure dans la com serie avec le pc
}
}
}
time_t getNtpTime() {
// on attend que l'udp reponde
unsigned long startMs = millis();
while (!Udp.available() && (millis() - startMs) < UDP_TIMEOUT) {}
Serial.println(Udp.parsePacket());
while (Udp.parsePacket() > 0) ;
// Envoie de la requète NTP
Serial.println("Envoie de la requète NTP !!!");
sendNTPpacket(timeServer);
// on récupère la réponse (1500 ms pour recevoir)
uint32_t beginWait = millis();
while (millis() - beginWait < 1500) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
Serial.println("Reponse du serveur NTP reçu :");
Udp.read(packetBuffer, NTP_PACKET_SIZE);
// l'horodatage commence à l'octet 40 du paquet reçu et fait quatre octets,
// ou deux mots soit 2 octets par mot. On extraye les deux mots:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// on combine les quatre octets (les deux mots) en un entier long
// c'est l'heure NTP en secondes depuis le 1er janvier 1900
unsigned long secsSince1900 = highWord << 16 | lowWord;
// on affiche cette heure en timstamp dans la comme serie
Serial.print("Temps en secondes depuis le 1er janvier 1900 = ");
Serial.println(secsSince1900);
// on calcule le temps en ajoutant la time zone et le formate pour la librairie timelib (2208988800UL année 2000)
return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
}
}
// si rien n'arrive au bout de 1500ms on sort de la boucle while et on retourne 0
Serial.println("Pas de reponse du serveur NTP !!!");
return 0;
}
// fonction qui envoie une requête NTP au serveur de temps à l'adresse indiquée en argument
void sendNTPpacket(char *ntpSrv) {
// on met tous les octets du tampon à 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// On initialise les valeurs nécessaires pour former la requête NTP (j'ai pas trouver d'infos sur ces valeurs, pourquoi celle-ci, est ce modifiable ?)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes à zero de packetBuffer[4] à packetBuffer[11] puis
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// tous les champs tampon ont reçu les valeurs nécéssaire à la requète de temps sur le serveur NTP
// on ouvre la com au serveur (adresse et port de la requete tj 123)
Udp.beginPacket(ntpSrv, 123);
// on ecrit la demande (le tampon)
Udp.write(packetBuffer, NTP_PACKET_SIZE);
// on ferme la com
Udp.endPacket();
}