Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Routeur esp32 avec horloge temps réel
#8

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.
Répondre


Messages dans ce sujet
RE: Routeur esp32 avec horloge temps réel - par Lolo69 - 08-11-2024, 09:00 AM

Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)