// ESP32 NTP OLED affichage date et heure défilant sur une ligne
// PP le 12 mars 2025
//https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/
//
// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi
// simuler le wifi par : wokwigw.exe
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define NTP_SERVER "pool.ntp.org" //serveur de temps
#define UTC_OFFSET 3600 //fuseau horaire UTC+1 en secondes
#define UTC_OFFSET_DST 0 //heure d'été en secondes
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
int x; // position du curseur sur la ligne 1 défilante
int minX; // position minimale du curseur 1,fonction de la longueur du message
// *** fonction printLocalTime ****
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time"); // attente serveur temps
return;
}
Serial.println(&timeinfo, "%A %B %d %Y %H:%M:%S");
Serial.print("Day of week: ");
Serial.println(&timeinfo, "%A");
Serial.print("Month: ");
Serial.println(&timeinfo, "%B");
Serial.print("Day of Month: ");
Serial.println(&timeinfo, "%d");
Serial.print("Year: ");
Serial.println(&timeinfo, "%Y");
Serial.print("Hour: ");
Serial.println(&timeinfo, "%H");
Serial.print("Hour (12 hour format): ");
Serial.println(&timeinfo, "%I");
Serial.print("Minute: ");
Serial.println(&timeinfo, "%M");
Serial.print("Second: ");
Serial.println(&timeinfo, "%S");
Serial.println("Time variables");
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
Serial.println(timeHour);
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &timeinfo);
Serial.println(timeWeekDay);
Serial.println();
//affichage sur OLED
display.setTextSize(2); // taille 2 pour date et heure
display.setCursor(x,0); // curseur a l'origine
display.print(&timeinfo, "%d/%m/%Y"); // jour/mois/annéee
display.print(&timeinfo, " %H:%M:%S"); // heure:minute:seconde
display.display(); // met a jour l'affichage
x=x-8; // vitesse du défilement: 1 lent, 10 rapide etc.. (Valeur initiale=4)
if(x < minX) x= display.width(); // réinitialisation curseur en x a chaque défilement complet
}
// ***** fin fonction ****
void setup() {
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(200);
display.clearDisplay(); // efface l'afficheur
display.setTextColor(WHITE); // texte en blanc sur fond noir
display.setTextWrap(false); // inhibe le retour a la ligne sur OLED
display.display(); // met a jour l'affichage
x = display.width(); // initialise le curseur 1 a longueur OLED en pixel
minX = -12 * 19; // 12 = 6 pixels/character * text size 2
//****************************
// SIMILATION 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);
}
void loop() {
printLocalTime(); //appel fonction printLocalTime
delay(500);
display.clearDisplay(); // efface l'afficheur
}