Go Down

Topic: Calcul éphéméride précis : lever et coucher de soleil (Read 22709 times) previous topic - next topic

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  :D à 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
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

bricoleau

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

=> Joie du nouveau forum ?  :smiley-mr-green:

Du coup je le remets en .txt
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Heloderma-kris

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

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

68tjs

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

roccesar

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

Quote
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

bricoleau

Ben _latD + _latM/60.0

y a un minimum de lecture à code à effectuer pour maîtriser le sujet...
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

bricoleau

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
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

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  :smiley-red:

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
Code: [Select]

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

Qui montre bien comment passer de l'un à l'autre.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

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.

Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

roccesar

Désolé pour ma réponse un peu sèche  :smiley-red:

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.

icare

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°
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 16.04 LTS

Heloderma-kris

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 !


Heloderma-kris

#12
Oct 31, 2014, 03:30 pm Last Edit: Oct 31, 2014, 03:33 pm by Heloderma-kris
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

manuetnini

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  :D à 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 ??

++

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+
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

Go Up