Bonjour, Existe-t-il une bibliothèque pour arduino comme sunset qui gère le lever et coucher du soleil en france et sa politique d'heure d'hiver et d'été ?
Bonjour,
Regarde la bibliothèque de @bricoleau
Merci du lien, mais le 3ᵉ lien du 1ᵉʳ post qui parle justement de DST est erroné.
Pour ma part j'utilise sun_rise() et sun_set() :
#include <time.h>
time_t sun_rise(const time_t * timer);
time_t sun_set(const time_t * timer);
Ces deux fonctions font partie de la librairie C standard.
Auparavant, la fonction set_position() doit être appelée :
#define LATITUDE 47.25
#define LONGITUDE 6.033
set_position(LATITUDE * ONE_DEGREE, LONGITUDE * ONE_DEGREE);
Une chose à savoir : la valeur retournée est en temps universel GMT.
Exemple :
#include "RTClib.h"
// ...
RTC_DS3231 rtc;
// dans setup()
set_position(LATITUDE * ONE_DEGREE, LONGITUDE * ONE_DEGREE);
// dans loop() :
DateTime utc = rtc.now();
now = utc.unixtime();
time_t sunRise = sun_rise(&now);
time_t sunSet = sun_set(&now);
if (now >= sunRise && now <= sunSet) {
Serial.println("JOUR");
}
else {
Serial.println("NUIT");
}
Bonjour, du coup, j'ai récupéré une formule pour savoir quel est le dernier dimanche du mois :
> dDimancheOctobre = 31 - ((Octobre += 10 < 3 ? y-- : y - 2, 23 * 10 / 9 + Octobre + 4 + y / 4 - y / 100 + y / 400) % 7);
Idem pour le mois de mars, suffit ensuite de déterminé si la date du jour est dans cette période.
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(×tamp);
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(×tamp);
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(×tamp);
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
Oui c'est bien mais comme @d_jo fait un poulailler il ne va peut-être pas le raccorder à internet.
Il y a une librairie ici
https://forum.arduino.cc/t/calcul-ephemeride-precis-lever-et-coucher-de-soleil/266532/45
Bonjour @fdufnews,
C'est vrai mais comme ce n'était pas clairement exprimé dans le sujet, j'ai fait cette proposition ![]()
Il doit y avoir un autre fil de discussion sur le forum où il en parle mais je ne l'ai pas lu !
J'ai cherché un peu mais je ne trouve pas...
Bonne journée
Le lien de cette librairie a déjà été donné par @icare dans le post #2
Ce n'est pas pour un poulailler, et je ne pense pas que les poules se soucient de l'heure d'hiver et d'été....
oui l'installation ne se connectera pas à internet.
et en post #5 j'indique que j'ai trouvé ma formule , merci à vous
C'est bien ce que je pensais
![]()
L'essentiel c'est que vous ayez trouvé ce que vous cherchiez ![]()
Bonne soirée à vous.
PS : Après, je pense qu'il faut fermer la porte du poulailler au coucher du soleil et l'ouvrir au lever.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.