Page 1 sur 1

Lever - Coucher du Soleil

Publié : mer. 30/janv./2013 14:37
par Mesa
(Dommage que le forum ne prenne pas en charge la mise en page)

Code : Tout sélectionner

;+==========================================================+
;|                                                          |
;| Calcul de l'heure TU du lever et du coucher du Soleil    |
;|                                                          |
;| Précision : La minute de temps                           |
;| Plateforme: Multiplateforme                              |
;| ToDo      : Reste à optimiser le code (réduction du code)|
;| Auteur    : Mesa  30 Janvier 2013                        |
;|                                                          |
;+==========================================================+


;Grenoble  +45° 11' 16" N (Nord = positif, Sud = négatif)
;          -05° 43' 37" E (Est = négatif, Ouest = Positif)
;Altitude 	Min. 204 m   Max. 475 m


; Bureau des longitudes : heure de lever du soleil
; http://www.imcce.fr/fr/ephemerides/phenomenes/rts/rts.php

; Soleil le 01/01/2013
; Lieu : 05°43’37" E / 45°11’16" N
;     Date 	             Lever 	    Passage au méridien 	  Coucher
; Temps Universel 	heure 	azimut 	heure 	hauteur 	   heure 	azimut
; 2013-01-01 	      07:18 	302.90 	11:41 	21.85 	     16:04 	57.14
;     Date 	                 Aube 	                 Crépuscule
;   	               astronom. 	nautique 	civil 	civil 	nautique 	astronom.
; Temps Universel 	 heure 	    heure 	  heure 	heure 	heure 	heure
; 2013-01-01 	       05:29 	    06:05 	  06:42 	16:39 	17:17 	17:52


EnableExplicit

Procedure.d Frac(Xfrac.d)   
  ProcedureReturn Xfrac-Int(Xfrac)    
EndProcedure   
Procedure.d dms(Xdms.d)   
  ;conversion decimales en degres minutes secondes  
  ProcedureReturn Int(Xdms)+Frac(Int(Frac(Xdms)*60)/100)+Frac(Frac(Frac(Xdms)*60)*0.006)   
EndProcedure   
Procedure.d dec(xdec.d)   
  ;conversion degres minutes secondes en decimales  
  ProcedureReturn Int(Xdec)+Int(frac(Xdec)*100)/60+(frac(Xdec)*100-Int(frac(Xdec)*100))*100/3600   
EndProcedure   
Procedure.d jd2(Annee, Mois, jour, Heure, Minute, Seconde); Jour Julien à 0h TU (Temps Universel ) 
  ; --Ne fonctionne pas avant le 15 Octobre 15 1582
  Protected j.d 
  Protected m 
  Protected a 
  Protected jj.d 
  
  a=Annee 
  m=Mois 
  j=jour+(Heure + Minute/60 + Seconde/3600)/24 
  
  jj=367*a -Int(1.75*(Int((m+9)/12)+a)) 
  jj-Int(0.75*(1+Int((Int((m-9)/7)+a)*0.01))) 
  jj+Int((275*m)/9)+j+1721028.5 
  
  ProcedureReturn jj 
EndProcedure 
Procedure.d LeverCoucherSoleil(LongitudeT.d, LatitudeT.d, Jour, Mois, An, Lever=#True, Option.f=-0.61)
  
  ; Option
  ; 	  -18<= Option <-12        : Crépuscule astronomique
  ; 	  -12<= Option <-6         : Crépuscule nautique
  ; 	  -6 <= Option <réfraction : Crépuscule civil
  ; 	  
  ; 	  réfraction = -36.6'= -0.61°           : Ephémérides du Bureau des longitudes
  ; 	             = -34'                     : Ephéméride nautique
  ; 	             = centre du Soleil         : Ephémérides astronomiques
  ; 	             = bord inférieur du Soleil : Ephémérides pour navigateurs
  ; 
  
  ; Lever
  ; Lever=#True  : Calcul du lever du Soleil
  ; Lever=#False : Calcul du coucher du Soleil
  

  
  Protected.d FA, H0, FI, LO, JD, T0, S0, TU, TS, T  
  Protected.d LL, M1, C, TL, EX, AL, X, DE, AH, TM 
  Protected IN0, i 
  
  FA=180/#PI
  H0=0
  
  ; Radian
  FI=dec(LatitudeT)/FA
  LO=dec(LongitudeT)/FA
  
  
  ; Jour julien de la date à 00h:00'00" (ne pas changer l'heure)
  JD=jd2(An,Mois,Jour,0,0,0)
  ;Debug JD
  
  
  ;Temps Sideral à Greenwitch
  T0 = (JD - 2415020.0)/36525
  S0= 6.6460656+2400.051262*T0 + 0.00002591*T0*T0
  S0 = S0 - 24*Int(S0/24)
  TU = 12
  TS = S0 + TU *1.002737908
  ;Debug TS
  
  
  ;Position de la Terre sur son orbite (ou soleil)
  T= T0+TU/24/36525
  LL=279.69668+T*36000.76892+T*T*0.0003025
  LL / FA
  M1 = 358.47583+T*35999.04975-T*T*0.000151-T*T*T*0.0000033
  M1 / FA
  C = (1.91946-0.004789*T-T*T*0.000014)*Sin(M1)+(0.020094-T*0.0001)*Sin(2*M1)+0.000293*Sin(3*M1)
  C / FA
  ;Longitue ecliptique
  TL = LL +C
  ;Coordonnées écliptique
  EX = 23.452294-0.0130125*T-0.00000164*T*T+T*T*T*0.000000503
  EX / FA
  AL = ATan(Cos(EX)*Tan(TL))
  If Cos(TL)<0
    AL + #PI
  EndIf
  X = Sin(EX)*Sin(TL)
  DE= ATan(X/Sqr(-X*X+1))
  ;Angle Horaire
  X=(Sin(H0)-Sin(FI)*Sin(DE))/Cos(FI)/Cos(DE)
  If Abs(X)>1 
    MessageRequester("impossible",StrD(H0*FA))
    End
  EndIf
  AH=-ATan(X/Sqr(-X*X+1))+ #PI/2
    
  TM=TS-(LO+AL)*FA/15
  TM=36-TM
  TM=TM-24*Int(TM/24)
  
  ;Lever
  If Lever=#True
    IN0=-1
  Else
    IN0=1
  EndIf
  
  H0=Option/FA
  
  For i= 1 To 3
    ;Position de la Terre sur son orbite (ou soleil)
    T= T0+TU/24/36525
    LL=279.69668+T*36000.76892+T*T*0.0003025
    LL / FA
    M1 = 358.47583+T*35999.04975-T*T*0.000151-T*T*T*0.0000033
    M1 / FA
    C = (1.91946-0.004789*T-T*T*0.000014)*Sin(M1)+(0.020094-T*0.0001)*Sin(2*M1)+0.000293*Sin(3*M1)
    C / FA
    ;Longitue ecliptique
    TL = LL +C
    ;Coordonnées écliptique
    EX = 23.452294-0.0130125*T-0.00000164*T*T+T*T*T*0.000000503
    EX / FA
    AL = ATan(Cos(ex)*Tan(TL))
    If Cos(TL)<0
      AL + #PI
    EndIf
    X = Sin(EX)*Sin(TL)
    DE= ATan(X/Sqr(-X*X+1))
    ;Angle Horaire
    X=(Sin(H0)-Sin(FI)*Sin(DE))/Cos(FI)/Cos(DE)
    If Abs(X)>1 
      MessageRequester("impossible",StrD(H0*FA))
      End
    EndIf
    AH=-ATan(X/Sqr(-X*X+1))+ #PI/2
     
    TS=(IN0*AH+AL+LO)*FA/15
    While TS<S0
      TS=TS+24
    Wend
    TU=(TS-S0)/1.002737908
    TU=TU-24*Int(TU/24)
  Next i
  ProcedureReturn TU
EndProcedure


;Affichage
Debug "Le 01/01/2013 à Grenoble"
Debug ""
Debug "Lever/Coucher Civil: "
Debug dms(LeverCoucherSoleil(-5.4337,45.1116,1,1,2013))          ;07h17'37" ~ 07h 18'
Debug dms(LeverCoucherSoleil(-5.4337,45.1116,1,1,2013,#False))
Debug ""
Debug "Lever/CoucherNautique: "
Debug dms(LeverCoucherSoleil(-5.4337,45.1116,1,1,2013,#True,-12))
Debug dms(LeverCoucherSoleil(-5.4337,45.1116,1,1,2013,#False,-12))
Debug ""
Debug "Lever/CoucherAstronomique (Nuit noire): "
Debug dms(LeverCoucherSoleil(-5.4337,45.1116,1,1,2013,#True,-18))
Debug dms(LeverCoucherSoleil(-5.4337,45.1116,1,1,2013,#False,-18))


Mesa.

Re: Lever - Coucher du Soleil

Publié : mer. 30/janv./2013 16:33
par GallyHC
Bonjour Mesa,

Oui le forum prend pas en compte la mise en forme et c'est pour cela que j'avais fait cela sur mon site (ex: http://koakdesign.info/?url=4d&val=56 et pour la mise en forme ex: http://koakdesign.info/php/form_sources.php?num=56).

Cordialement,
GallyHC

Re: Lever - Coucher du Soleil

Publié : jeu. 31/janv./2013 15:49
par MLD
@ Mesa

Merci et bravo pour ce code. J'ai testé pour St Malo c'est ok a trés peu de chose prés (problème d'altitude que je n'est pas changé.)
Encore merci pour le partage.

Re: Lever - Coucher du Soleil

Publié : jeu. 31/janv./2013 18:52
par Mesa
:D

Re: Lever - Coucher du Soleil

Publié : jeu. 04/avr./2013 14:59
par Golfy
Merci Mesa !!! :D

c'est exactement ce que je cherchais à faire pour ma domotique !
Je me suis cassé la tête là-dessus pendant 15j avant d'abandonner lâchement... :lol:

Juste pour validation : +2H en été et +1H en hiver ?

Re: Lever - Coucher du Soleil

Publié : ven. 05/avr./2013 9:37
par Mesa
Oui, ça calcul une heure en temps universel (TU) donc il faut tenir compte du fuseau horaire (+1h pour la France) et de l'heure d'été si nécessaire (+1h en été en ce moment soit 2h en tout).

Mesa.

Re: Lever - Coucher du Soleil

Publié : ven. 05/avr./2013 9:55
par Ar-S
Mesa a écrit :(Dommage que le forum ne prenne pas en charge la mise en page)
Merci pour ce code.

Pour la mise en forme sur les forums pb, le plugin firefox d'Erix14 marche toujours aussi bien : http://www.rx14.info/pbforumcode/PureBasicForumCode.xpi

Re: Lever - Coucher du Soleil

Publié : lun. 29/avr./2013 12:25
par morosh
merci pour le code
je cherche ça depuis longtemps