/*
Claude EMERY 25/03/2025
Heure Ete - Hiver
Affichage durant 05 secondes
Puis Oled eteint au bout de 05 secondes
ré-allumage de l'Oled apres pression sur bouton poussoir
ESP32 + Oled 0.96 + dht22
DHT22 SDA en D5
Oled 0.96 SSD1306 SDA en D21 / SCL en D22
Bouton poussoir en D2 + resistance 10K
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h> //#include <NTPClient.h>
#include <WiFiUdp.h>
#include <TimeLib.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//const char* ssid = "Votre_SSID";
//const char* password = "Votre_Mot_de_Passe";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 0, 60000); // UTC sans décalage initial
// Détermine automatiquement si l'heure d'été est appliquée
bool isDaylightSavingTime(int day, int month, int weekday) {
// Règle pour l'Europe : dernier dimanche de mars à 1h -> dernier dimanche d'octobre à 1h
if (month < 3 || month > 10) return false; // Hiver
if (month > 3 && month < 10) return true; // Été
// Trouver le dernier dimanche de mars ou octobre
int lastSunday = day - ((weekday == 0) ? 0 : weekday);
if (month == 3) return (lastSunday >= 25); // Passer à l'heure d'été
if (month == 10) return (lastSunday < 25); // Rester en heure d'été
return false;
}
void setup() {
Serial.begin(115200);
//****************************
// SIMULATION DU WIFI
//****************************
WiFi.begin("Wokwi-GUEST", "", 6); // simule le wifi
while (WiFi.status() != WL_CONNECTED) { // attente connexion wifi
delay(250);
Serial.println("WiFi non connecté");
}
Serial.println(""); // connexion réalisé
Serial.println("WiFi connecté");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
//****************************
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
/*
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connexion WiFi...");
}
Serial.println("Connecté au WiFi");
timeClient.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Échec de l'initialisation OLED");
while (1);
}
display.clearDisplay();
}
*/
void loop() {
timeClient.update();
unsigned long rawTime = timeClient.getEpochTime();
int hours = hour(rawTime);
int minutes = minute(rawTime);
int seconds = second(rawTime);
int day = day(rawTime);
int month = month(rawTime);
int year = year(rawTime);
int weekday = weekday(rawTime) - 1; // 0=Dimanche, 6=Samedi
// Vérifier l'heure d'été
bool dst = isDaylightSavingTime(day, month, weekday);
int timezoneOffset = 1 + (dst ? 1 : 0); // UTC+1 standard, +1 en été
hours = (hours + timezoneOffset) % 24;
// Affichage OLED
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 10);
display.printf("%02d:%02d:%02d", hours, minutes, seconds);
display.setTextSize(1);
display.setCursor(10, 40);
display.printf("Date: %02d/%02d/%04d", day, month, year);
display.setCursor(10, 50);
display.printf("Heure: UTC+%d (%s)", timezoneOffset, dst ? "Été" : "Hiver");
display.display();
delay(1000);
}