Calcul éphéméride précis : lever et coucher de soleil

Bonjour

Comme déjà évoqué dans d'autres topics, voici en pièce jointe un exemple de code qui donne de manière très précise les heures de lever et coucher du soleil.
Utile pour commander un éclairage depuis un arduino.

J'avais pas mal fouiné sur le net pour trouver quelque chose d'assez précis à mon goût, mais sans succès. Et vu le temps que j'ai passé à mettre au point ces quelques lignes de code, je me dis que cela peut faire économiser un paquet de neurones à d'autres :smiley: à charge de revanche

Sur les quelques milliers de tests que j'ai pu faire, l'écart par rapport à la référence officielle (site imcce) était au maximum de 2 secondes.

Ce n'est pas une librairie toute faite, mais il vous suffit de reprendre les deux fonctions de calcul et de les intégrer dans votre propre code ou librairies. Donc prévoir quand même d'y sacrifier quelques neurones.

Au passage je me suis amusé à construire un exemple en C "de base" qui s'exécute aussi bien sur arduino que sur PC.
Arduino est plus lent : 5 millisecondes par calcul d'éphéméride
Et parfois les résultats ne sont pas strictement identiques : différence d'implémentation des double et/ou fonctions trigonométriques.

Bonne lecture

L'attachement d'une pièce jointe *.c ne semble pas fonctionner.

=> Joie du nouveau forum ? :grin:

Du coup je le remets en .txt

exemple calcul ephemeride precis.txt (9.04 KB)

bien jouer c'est une autre version avec des calcul diferent !

sur quel crepuscule ce base tes calcul nautique civil ou militaire?

Beau travail qui aurait mérité d'être dans tuto et cours, ici il disparaître dans. les profondeurs du forum.

bonjour, merci pour ce travail mais je n'ai pas compris comment tu rentrais la longitude / latitude

void calculerEphemeride(int jour, int mois, int annee, double longitude_ouest, double latitude_nord, double *lever, double *meridien, double *coucher);

//Ephéméride à la tour Eiffel en novembre 2014
testerEphemeride(1, 11, 2014, 30, -2, 17, 40, 48, 51, 28);

par exemple avec comme valeurs :

#define _latD 48
#define _latM 36
#define _lonD 2
#define _lonM 18

merci

Ben _latD + _latM/60.0

y a un minimum de lecture à code à effectuer pour maîtriser le sujet...

Heloderma-kris:
bien jouer c'est une autre version avec des calcul diferent !

sur quel crepuscule ce base tes calcul nautique civil ou militaire?

Ce n'est pas un calcul d'aube/crépuscule qui, par définition, est basé sur une luminosité qui précède/suit le lever/coucher du soleil, avec plusieurs normes (nautique, civil, militaire).

Là c'est juste le calcul de l'instant où le centre du disque solaire passe l'horizon

bricoleau:
Ben _latD + _latM/60.0

y a un minimum de lecture à code à effectuer pour maîtriser le sujet...

Désolé pour ma réponse un peu sèche :blush:

La fonction principale attend une longitude exprimée en degré décimalisé.
La fonction de test prend les degrés minutes secondes séparément.

Entre les deux, il y a justement une fonction

double calculerCoordonneeDecimale(int degre, int minute, int seconde);

Qui montre bien comment passer de l'un à l'autre.

bricoleau:
Ce n'est pas un calcul d'aube/crépuscule qui, par définition, est basé sur une luminosité qui précède/suit le lever/coucher du soleil, avec plusieurs normes (nautique, civil, militaire).

Là c'est juste le calcul de l'instant où le centre du disque solaire passe l'horizon

En fait, y a une idée qui me titille pour aller plus loin dans la simulation d'un éclairage naturel.

Avec l'heure exacte de lever/coucher du soleil, on a déjà une bonne base.
Mais par exemple, pour piloter un éclairage led dimmable, il est vite utile de disposer d'une fonction qui permette de gérer la montée en éclairage à l'aube, et la descente au crépuscule.

Par exemple une fonction qui prendrait en paramètre les coordonnées GPS et l'heure UTC, et qui restituerait l'éclairage en pourcentage :0% nuit noire => 100% plein jour / intensité maximum (=midi solaire au solstice d'été).

Une première approche rudimentaire serait par exemple de prévoir une montée linéaire de 0 à 100%, de 5 minutes avant le lever du soleil à 15 minutes après, et inversement pour le coucher.
Mais c'est très grossier.

J'ai cherché sans succès le modèle mathématique de montée en éclairement naturel en fonction de la hauteur du soleil. Si quelqu'un a des infos là-dessus je suis preneur.

L'étape ultime serait ensuite d'ajouter un algorithme "nuages", pseudo aléatoire mais paramétrable en fonction de la localité. Pas sûr qu'on puisse trouver sur le net une base du nombre de jours d'ensoleillement par mois et par zone géographique, mais c'est l'idée.

Et évidemment, doubler le système avec une reproduction d'éclairage solaire + une reproduction d'éclairage lunaire (incluant les nuages une nuit de pleine lune).

Par exemple en aquariophilie marine, la reproduction du cycle lunaire peut avoir une grande influence sur la reproduction des coraux.

bricoleau:
Désolé pour ma réponse un peu sèche :blush:

La fonction principale attend une longitude exprimée en degré décimalisé.

merci, comme le dit mon profil je suis news sur le forum, tant qu'avec l'arduino et les éphémérides et le codage C que j'ai découvert il y a moins d'une semaine

Je vois en lisant autre post que vous avez tenu compte aussi via une autre librairie des heures d'été et d'hiver.

Bonjour,
Le crépuscule.
C'est la lueur croissante avant le lever du Soleil ou décroissante après son coucher qui provient de l'éclairement des couches supérieures de l'atmosphère par les rayons du Soleil situé sous l'horizon, mais très voisin de celui-ci.
Par exemple, le crépuscule du soir commence au coucher du bord supérieur du Soleil et finit lorsque le centre du Soleil est abaissé de l'angle alpha au-dessous de l'horizon.
Pour le crépuscule civil alpha = 6°
Pour le crépuscule nautique alpha = 12°
Pour le crépuscule astronomique alpha = 18°
@+

desoler je met du temps a repondre mais j'ai toujour pas les notification de reponse au poste ( ça me gonfle)bref

pour repondre a ton interogation consernant les monté en luminosité , il y a quelque temps je me suis amusé a partire sur ce terrain et vraisemblablement la variation lumineuse au cour d'une journée semble s'aproché d'une courbe de gause.

des que je retrouve mon fichier exel je te le joint !

voila le fichier tu verra si cela t'intérése , l'idée tu rentre dans les casse jaune la valeur max du PWM que tu souhaite et la duree du jour , tu visualise ensuite la variation sur le graphe en desous .
je l'ai fait de magniere empirique donc c'est pas forcément ce qu'il y a de mieu mais ça represente un debut de travail.

pour le choix des gausiene j'était tombé sur la these d'un francais qui avais travaillé sur "l'energie/ou luminosité" que recevai la surface de l'ocean au cour de la journée, mais pas moyen de retrouvé le lien

http://christophe.boulic.free.fr/arduino/courbe%20de%20gauss.xlsx

bricoleau:
Bonjour

Comme déjà évoqué dans d'autres topics, voici en pièce jointe un exemple de code qui donne de manière très précise les heures de lever et coucher du soleil.
Utile pour commander un éclairage depuis un arduino.

J'avais pas mal fouiné sur le net pour trouver quelque chose d'assez précis à mon goût, mais sans succès. Et vu le temps que j'ai passé à mettre au point ces quelques lignes de code, je me dis que cela peut faire économiser un paquet de neurones à d'autres :smiley: à charge de revanche

Sur les quelques milliers de tests que j'ai pu faire, l'écart par rapport à la référence officielle (site imcce) était au maximum de 2 secondes.

Ce n'est pas une librairie toute faite, mais il vous suffit de reprendre les deux fonctions de calcul et de les intégrer dans votre propre code ou librairies. Donc prévoir quand même d'y sacrifier quelques neurones.

Au passage je me suis amusé à construire un exemple en C "de base" qui s'exécute aussi bien sur arduino que sur PC.
Arduino est plus lent : 5 millisecondes par calcul d'éphéméride
Et parfois les résultats ne sont pas strictement identiques : différence d'implémentation des double et/ou fonctions trigonométriques.

Bonne lecture

Salut et merci pour ton boulot.

Juste une question, on a le droit de l'utiliser de modifier ton code ? Sous quelles conditions ??

++

Bonjour

Ce bout de code est mis à dispo pour un usage libre et sans engagement de ma part sur le résultat.
Bien sûr tu peux le modifier pour en faire ce que tu veux.

Ma seule demande est de partager ici avec la collectivité toute amélioration ou correction de ce code, mais ce n'est pas une obligation.

La partie calculs purs a été particulièrement étudiée.
Je serais surpris qu'elle puisse être significativement améliorée.
Par contre elle pourrait être étendue :

  • aux calculs des divers aubes / crépuscules
  • au paramétrage de la convention de calcul des levers et couchers du soleil. Là, j'ai suivi la convention française appliquée par l'imcce : les calculs sont basés sur l'instant où le centre du disque solaire franchit l'horizon. Dans la plupart des autres pays, il me semble que la convention est de considérer l'instant où le bord supérieur du disque solaire franchit l'horizon (plus naturel pour les calculs d'éclairement).

De plus, une encapsulation propre au sein d'une librairie ne serait pas du luxe.

a+

J'ai envisagé de faire un tracker solaire basé sur éphéméride. Je me suis donc intéressé à toute cette palanquée d'angles ..
J'ai résumé ce que j'en avais compris sur une feuille OpenOffice.calc.
Au vu de ce que vous avez fait, cette feuille est assez simpliste, mais si elle peut vous être utile.
(En l'ouvrant il faut accepter l'activation des macros)

Tu t'es fait avoir par ce forum --> ils ne connaissent pas les fichiers normalisés ISO ils ne connaissent que les bouses microsofts.

Il faut ruser : tu zippe le fichier calc et il sera accepté.

Oui je sais OpenDocument est déjà zippé et zipper un fichier déjà zippé c'est idiot mais c'est comme cela que fonctionne le forum.
J'ai déjà demandé à ce que ce soit modifié : le webmestre semble être un trou noir.

bricoleau:
Bonjour

Ce bout de code est mis à dispo pour un usage libre et sans engagement de ma part sur le résultat.
Bien sûr tu peux le modifier pour en faire ce que tu veux.

Ma seule demande est de partager ici avec la collectivité toute amélioration ou correction de ce code, mais ce n'est pas une obligation.

La partie calculs purs a été particulièrement étudiée.
Je serais surpris qu'elle puisse être significativement améliorée.
Par contre elle pourrait être étendue :

  • aux calculs des divers aubes / crépuscules
  • au paramétrage de la convention de calcul des levers et couchers du soleil. Là, j'ai suivi la convention française appliquée par l'imcce : les calculs sont basés sur l'instant où le centre du disque solaire franchit l'horizon. Dans la plupart des autres pays, il me semble que la convention est de considérer l'instant où le bord supérieur du disque solaire franchit l'horizon (plus naturel pour les calculs d'éclairement).

De plus, une encapsulation propre au sein d'une librairie ne serait pas du luxe.

a+

Salut et merci,
on peut effectivement faire "mieux" en prennant comme tu dis le haut du disque solaire etc etc ... mais franchement, on en est pas a la "minute" pres ! Le but est de connaitre (a mon avis) le décalage le matin, midi et soir, pour adapter une action/temps.
J'ai commencé a modifier ton code en améliorant deux trois trucs bateau, je vais faire une lib au final pour intégration dans mon projet et je posterai ici mes modifs, merci en tout cas.

Merci Bricoleau pour ce code.

Pourrais-je connaître l'origine de vos formules.

Pour ma part, j'ai récupéré des formules sur ce site et ai créé le code correspondant en C#.
Mon code étant correct (je l'ai simplifié au maximum pour ne m'en tenir qu'aux formules), je constate une erreur de 12 minutes environ sur l'heure de lever du soleil à partir des formules de ce site.

J'ai trouvé d'autres formules, mais aucune ne donne l'heure correcte en mon lieu, sauf la vôtre !
Je vais donc intégrer certaines parties de votre code dans mon programme C#.

Cordialement.

Oups désolé pour cette réponse tardive

L'origine de mes formules, c'est un savant mélange de tout ce que j'ai trouvé sur le net :D, que j'ai (à peu près) compris et réassemblé en gardant ce qui me semblait le plus précis.
Le site de Jean-Paul Cornec que tu indiques était effectivement dans mon périmètre d'analyse.

Enfin compris, c'est assez présomptueux. Quand on descend dans la théorie on se retrouve vite dépassé, sauf à avoir bac + xx (deux chiffres) d'études en astronomie, ce qui n'est pas mon cas.

Les diverses équations trouvées sur le net ne sont que des approximations des modèles théoriques (souvent en séries dérivées).

Par endroits, ma compréhension est venue de l'analyse des écarts entre mes résultats et ceux de l'IMCCE.
La mise au point était aussi très expérimentale. Le site de l'IMCCE m'a été très utile pour mesurer la précision des divers calculs.
Je me souviens avoir buté sur une analyse d'écarts pendant une semaine, jusqu'à réaliser qu'il y avait un bug sur le site de l'IMCCE. Pas dans leurs calculs évidemment, mais dans leur affichage des résultats (glissement de colonne).
J'ai même osé leur écrire pour leur signaler le problème. Ils m'ont répondu de manière très sympa et quelques mois plus tard j'ai pu constater que le bug était corrigé.

Pour finir, j'ai procédé à une optimisation purement informatique des calculs (factorisations + précalcul des constantes par le compilo). Ainsi par exemple l'équation du temps ou autre joyeuseté se trouve mélangée à la soupe, et n'apparaît plus clairement dans le code.

Donc on peut dire que c'est une recette 100% bricoleau.

J'y ai quand même passé quelques dizaines d'heures de boulot, la majeure partie dans Excel :smiley:

a+