Sunrise et sunset et dst

Bonjour @d_jo ,

Vous n'êtes pas obligé de passer par une bibliothèque. Vous pouvez par exemple effectuer une requête HTTP pour obtenir gratuitement le fichier json du site openweathermap dans lequel se trouve entre autre sunset et sunrise. Par contre je n'ai pas trouvé le moyen d'obtenir ces variables avec la prise en compte de l'heure d'été et d'hiver. Du coup ces changements doivent être codés.
Pour l'heure il suffit d'aller la chercher sur un serveur NTP et là il est possible d'intégrer le passage automatique à l'heure d'hiver et d'été.
Je vous ai fait un petit programme d'exemple. Vous avez juste à vous inscrire sur openweathermap afin d'obtenir une appid gratuitement et la renseigner dans mon programme ainsi que vos paramètres wifi :

#include <WiFiClientSecure.h> //
#include <WiFi.h> // wifi
#include <HTTPClient.h>  // Navigateur web
#include <ArduinoJson.h>        // Installer la version 6 

byte decalage = 2; //decalage horaire été-hiver pour sunrise et sunset

const char* ssid       = "..........";
const char* password   = "............";

//heure
const int delaiDemande = 30; // nombre de secondes entre deux demandes consécutives au serveur NTP
unsigned long derniereDemande = millis(); // moment de la plus récente demande au serveur NTP
unsigned long derniereMaJ = millis(); // moment de la plus récente mise à jour de l'affichage de l'heure
#define MAX_SIZE 80
const char* ntpServer = "pool.ntp.org";
time_t timestamp;
struct tm *pTime;

//instanse json + requête
StaticJsonDocument<1024> doc;
String appid = "...................."; //id api openweathermap
String lon = "......................";
String lat = "......................";
const String request = "https://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&units=metric&lang=fr&appid=" + appid ; // requête http

//requête HTTP
unsigned long derniereDemandeHttp = millis(); // moment de la plus récente requête HTTP
const int delaiDemandeHttp = 3600; // nombre de secondes entre deux requêtes HTTP consécutives

// déclaration fonctions et procédures
void openweathermap(void);
void afficheHeureDate(void);
void affichageJson (void);
void ephemeride (struct tm * leveCouche);
void setup_wifi(void);

void setup() {
  // Initialise serial + Wifi
  Serial.begin(115200);
  Serial.println();
  setup_wifi(); // Initialise Wifi

  openweathermap();

  // heure serveur NTP
  configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", ntpServer);
  Serial.println("");
  Serial.print("Attente date et heure");
  while (time(nullptr) <= 100000) {
    Serial.print(".");
    delay(1000);
  }
  time(&timestamp);
  Serial.println("");

}

void loop() {
  // est-ce le moment d'effectuer la requête HTTP
  if ((millis() - derniereDemandeHttp) >=  delaiDemandeHttp * 1000 ) {
    openweathermap();
    derniereDemandeHttp = millis();
    Serial.println("requête HTTP");
  }

  // est-ce le moment de raffraichir l'heure NTP ?
  if ((millis() - derniereMaJ) >=   1000 ) {
    time(&timestamp);
    afficheHeureDate();
    derniereMaJ = millis();
    Serial.println("Affichage de l'heure");
  }

}

void setup_wifi(void) { // initialise wifi
  WiFi.begin(ssid, password);
  Serial.print("Connexion au reseau WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println();
}

void afficheHeureDate(void) {
  char buffer[MAX_SIZE];
  pTime  = localtime(&timestamp);
  strftime(buffer, MAX_SIZE, "heure : %H:%M:%S\ndate : %d/%m/%Y", pTime);
  Serial.println(buffer);
}

void openweathermap(void) {
  WiFiClientSecure client;
  client.setInsecure();
  HTTPClient http;
  http.useHTTP10(true);
  http.begin(client, request); // on prépare la requête
  int httpCode = http.GET(); // on lance la requête
  if (httpCode == 200 ) { // le serveur a répondu 200 (connexion réussie)
    String reponse = http.getString();
    Serial.println(reponse);
    deserializeJson(doc, reponse);
    affichageJson() ;
  } else {
    Serial.print("Error - HTTP code : ");
    Serial.println(httpCode);
  }
  http.end();
}

void affichageJson (void) {

  //sunrise
  time_t leveSoleil = doc["sys"]["sunrise"];
  struct tm *leveDuSoleil = localtime(&leveSoleil);
  Serial.print("Lever du soleil : ");
  ephemeride(leveDuSoleil);


  // sunset
  time_t coucheSoleil = doc["sys"]["sunset"];
  struct tm *coucheDuSoleil = localtime(&coucheSoleil);
  Serial.print("Coucher du soleil : ");
  ephemeride(coucheDuSoleil);

}

void ephemeride (struct tm * leveCouche) {
  if ((leveCouche->tm_hour ) < 10) {
    Serial.print("0");
  }
  Serial.print(leveCouche->tm_hour + decalage );  // heure entre 0 et 23
  Serial.print(":");
  if (leveCouche->tm_min < 10) {
    Serial.print("0");
  }
  Serial.print(leveCouche->tm_min);   // timeinfo->tm_min: minutes (0 - 59)
  Serial.print(":");

  if (leveCouche->tm_sec < 10) {
    Serial.print("0");
  }
  Serial.println(leveCouche->tm_sec);   // timeinfo->tm_sec: secondes (0 - 60)
}

Je me suis fait une station météo qui prend en compte toutes les informations obtenues dans le fichier au format json à l'aide d'un écran TFT 3.5.
En espérant que cela puisse vous être utile. Le tout fonctionne sur ESP 32.

Bonne journée.

Edit : il vous faudra également mentionner votre latitude et longitude en degrés décimaux