Module RTC DS3231 sur ESP32

De Wiki de Mémoire Vive
Version datée du 22 août 2025 à 09:01 par Denis (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

Avoir l'heure sur un ESP32, ça peut servir.

En utilisant un module DS3231 ça marche.

Voici le code Arduino correspondant.

/*
  --- Résumé du programme ---

  1. Connexion au réseau WiFi avec les identifiants fournis (SSID + mot de passe).
  2. Initialisation du module RTC DS3231 via le bus I²C (SDA=21, SCL=22 sur ESP32).
  3. Vérification de la présence du DS3231 :
       - Si non détecté → arrêt du programme.
       - Si perte d’alimentation → synchronisation automatique de l’heure via NTP (Internet).
  4. Activation de la LED intégrée (GPIO2) en mode ON.
  5. Boucle principale :
       - Lecture de la date et de l’heure courantes depuis le DS3231.
       - Affichage de l’horodatage complet sur le port série (YYYY/MM/DD HH:MM:SS).
       - Mise à jour toutes les secondes.
*/


#include <WiFi.h>
#include <Wire.h>
#include "RTClib.h"
#include <time.h>

// ----- Réseau -----
const char* ssid = "2.4GHz-MEMOIRE-VIVE";
const char* password = "memoirevive79";
const char* mqtt_server = "192.168.1.249";  // non utilisé pour l'instant

const char* ntpServer = "pool.ntp.org"; // serveur NTP
// France : UTC+1, daylightOffset 3600 si heure d'été
const long  gmtOffset_sec = 3600;      // décalage UTC sans heure d'été
const int   daylightOffset_sec = 3600; // heure d'été (+1h)

RTC_DS3231 rtc;

// ----- Connexion WiFi -----
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("✅ WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void setTimeFromNTP() {
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  Serial.print("⏳ Synchronisation NTP...");
  struct tm timeinfo;
  while (!getLocalTime(&timeinfo)) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("✅ Heure NTP récupérée");

  // Mettre à jour le DS3231
  rtc.adjust(DateTime(timeinfo.tm_year + 1900,
                      timeinfo.tm_mon + 1,
                      timeinfo.tm_mday,
                      timeinfo.tm_hour,
                      timeinfo.tm_min,
                      timeinfo.tm_sec));

  Serial.println("⌚ DS3231 mis à jour depuis NTP");
}


// ----- Setup -----
void setup() {
  pinMode(2, OUTPUT);     
  digitalWrite(2, HIGH); // LED ON

  Serial.begin(115200);
  setup_wifi();

  Wire.begin(21, 22); // SDA=21, SCL=22 pour ESP32

  if (!rtc.begin()) {
    Serial.println("❌ Erreur : DS3231 introuvable !");
    while (1);
  }

  if (rtc.lostPower()) {
    Serial.println("⚠️ Perte d'alimentation, synchronisation via NTP...");
    setTimeFromNTP();
  }

}

// ----- Loop -----
void loop() {
  DateTime now = rtc.now();

  Serial.printf("%04d/%02d/%02d %02d:%02d:%02d\n",
                now.year(), now.month(), now.day(),
                now.hour(), now.minute(), now.second());

  delay(1000);
}