Ouai c est cool de faire tourner une VM 24/24 pour avoir l heure.
Ca serait sûrement plus ecolo de mettre un module rtc (2 Euros) sur un esp32 et transformer cet ESP en serveur NTP en point d accès wifi
Niveau consommation, autonomie et stabilité c est plus performant non ? En plus d’internet tu peux meme couper la box et garder la connexion wifi des appareils domotique : joli petit projet de geek ca non ?
Code :
Voici un code modifié qui :
1. Se connecte temporairement à Internet au démarrage.
2. Récupère l’heure depuis un serveur NTP.
3. Synchronise le module RTC avec cette heure.
4. Configure ensuite l’ESP en point d’accès et commence à fonctionner comme serveur NTP local en utilisant le RTC pour garder l’heure.
Code Exemple pour Synchronisation Initiale via Internet
#include <WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <RTClib.h> // Bibliothèque pour le module RTC DS3231
// Informations du réseau pour la connexion temporaire
const char *ssidInternet = "Votre_SSID";
const char *passwordInternet = "Votre_MotDePasse";
// Informations pour le mode point d'accès local
const char *ssidAP = "ESP_NTP_Server";
const char *passwordAP = "password123";
// Déclaration des objets
WiFiUDP udp;
const int NTP_PORT = 123; // Port UDP pour NTP
RTC_DS3231 rtc; // Initialisation du module RTC
void setup() {
Serial.begin(115200);
// 1. Connexion temporaire au Wi-Fi pour obtenir l'heure NTP depuis Internet
connectToInternet();
// 2. Synchroniser l'heure avec un serveur NTP public et mettre à jour le RTC
syncTimeWithNTP();
// 3. Passer en mode Point d'Accès (AP) pour le serveur NTP local
startAccessPoint();
// 4. Initialiser l'UDP pour écouter les requêtes NTP
udp.begin(NTP_PORT);
Serial.println("Serveur NTP prêt à écouter les requêtes");
}
void loop() {
// Écouter les requêtes NTP
int packetSize = udp.parsePacket();
if (packetSize) {
byte packetBuffer[48];
udp.read(packetBuffer, 48);
// Initialiser la réponse NTP
packetBuffer[0] = 0b00100100; // LI, Version, Mode
packetBuffer[1] = 1; // Stratum, or type of clock
packetBuffer[2] = 0; // Polling Interval
packetBuffer[3] = 0xEC; // Precision
// Obtenir l'heure actuelle à partir du module RTC
DateTime now = rtc.now();
unsigned long epochTime = now.unixtime() + 2208988800UL; // Temps en secondes depuis 1900
// Ajouter l'heure dans le paquet NTP
packetBuffer[40] = epochTime >> 24;
packetBuffer[41] = epochTime >> 16;
packetBuffer[42] = epochTime >> 8;
packetBuffer[43] = epochTime;
// Envoyer la réponse
udp.beginPacket(udp.remoteIP(), udp.remotePort());
udp.write(packetBuffer, 48);
udp.endPacket();
Serial.println("Requête NTP traitée et réponse envoyée");
}
delay(1000);
}
void connectToInternet() {
// Se connecter au Wi-Fi pour obtenir l'heure NTP depuis Internet
WiFi.begin(ssidInternet, passwordInternet);
Serial.print("Connexion au Wi-Fi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnecté à Internet pour la synchronisation initiale");
}
void syncTimeWithNTP() {
// Initialiser le client NTP pour obtenir l'heure depuis Internet
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
timeClient.begin();
// Attendre la synchronisation avec le serveur NTP
while(!timeClient.update()) {
timeClient.forceUpdate();
delay(500);
}
// Récupérer l'heure NTP et mettre à jour le RTC
rtc.adjust(DateTime(timeClient.getEpochTime()));
Serial.println("RTC synchronisé avec l'heure NTP");
// Déconnexion du Wi-Fi après la mise à jour
WiFi.disconnect();
}
void startAccessPoint() {
// Configurer l'ESP en mode Point d'Accès pour le serveur NTP local
WiFi.softAP(ssidAP, passwordAP);
IPAddress IP = WiFi.softAPIP();
Serial.print("Point d'accès IP: ");
Serial.println(IP);
}
Explications du Code
1. Connexion à Internet pour la synchronisation initiale :
• La fonction connectToInternet() connecte l’ESP au Wi-Fi pour accéder au serveur NTP.
2. Synchronisation avec le serveur NTP public :
• syncTimeWithNTP() utilise un client NTP pour obtenir l’heure précise d’un serveur NTP en ligne (comme pool.ntp.org).
• L’heure est ensuite mise à jour dans le module RTC avec rtc.adjust(DateTime(timeClient.getEpochTime()));.
3. Passage en mode Point d’Accès pour le serveur NTP local :
• La fonction startAccessPoint() configure l’ESP en tant que point d’accès Wi-Fi, auquel les clients peuvent se connecter.
4. Serveur NTP :
• Dans la boucle loop(), le serveur NTP répond aux requêtes des clients en utilisant l’heure stockée dans le module RTC.
Conclusion
Ce code initialise l’heure de l’ESP et du module RTC en utilisant Internet, puis l’ESP passe en mode point d’accès et fonctionne comme serveur NTP local. Le RTC conserve l’heure précise et permet au serveur NTP de répondre aux clients même si l’ESP redémarre ou s’il n’a plus accès à Internet.