« Module RTC DS3231 sur ESP32 » : différence entre les versions
Aller à la navigation
Aller à la recherche
Page créée avec « Avoir l'heure sur un ESP32, ça peut servir. En utilisant un module DS3231 ça marche. Voici le code Arduino correspondant. <pre> /* --- 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’alimenta... » |
Aucun résumé des modifications |
||
| Ligne 7 : | Ligne 7 : | ||
/* | /* | ||
--- Résumé du programme --- | --- Résumé du programme --- | ||
1. Connexion au réseau WiFi avec les identifiants fournis (SSID + mot de passe). | 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). | 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 : | 3. Vérification de la présence du DS3231 : | ||
- Si non détecté → arrêt du programme. | - Si non détecté → arrêt du programme. | ||
- Si perte d’alimentation → | - Si perte d’alimentation → synchronisation automatique de l’heure via NTP (Internet). | ||
4. Activation de la LED intégrée (GPIO2) en mode ON. | 4. Activation de la LED intégrée (GPIO2) en mode ON. | ||
5. Boucle principale : | 5. Boucle principale : | ||
| Ligne 19 : | Ligne 19 : | ||
- Mise à jour toutes les secondes. | - Mise à jour toutes les secondes. | ||
*/ | */ | ||
#include <WiFi.h> | #include <WiFi.h> | ||
#include <Wire.h> | #include <Wire.h> | ||
#include "RTClib.h" | #include "RTClib.h" | ||
#include <time.h> | |||
// ----- Réseau ----- | // ----- Réseau ----- | ||
| Ligne 28 : | Ligne 30 : | ||
const char* password = "memoirevive79"; | const char* password = "memoirevive79"; | ||
const char* mqtt_server = "192.168.1.249"; // non utilisé pour l'instant | 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; | RTC_DS3231 rtc; | ||
| Ligne 53 : | Ligne 60 : | ||
Serial.println(WiFi.localIP()); | 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 ----- | // ----- Setup ----- | ||
| Ligne 70 : | Ligne 100 : | ||
if (rtc.lostPower()) { | if (rtc.lostPower()) { | ||
Serial.println("⚠️ Perte d'alimentation, | Serial.println("⚠️ Perte d'alimentation, synchronisation via NTP..."); | ||
setTimeFromNTP(); | |||
} | } | ||
} | } | ||
Dernière version du 22 août 2025 à 09:01
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);
}