Go Down

Topic: [Résolu] Fonctions trigonométriques et variables à virgule flottante (Read 7430 times) previous topic - next topic

Heloderma-kris


[
Euh encore un truc : Avec ma Lat et ma Lon j'ai trouvé : durée du jour : 13:-35
Dois-je en conclure que chez moi la durée du jour est de 13h - 35 min c'est à dire 12h25 ?


Code: [Select]
#include <Date_heure.h>
#include <ephemeride.h>

#define _latD 48
#define _latM 47
#define _lonD 2
#define _lonM 26
#define _J 23
#define _M 5
#define _A 2014
#define _fuso 1

void setup(){
Serial.begin(9600);

int  n =rangJour(_J,_M,_A);
float HO=angleHoraireSoeil(n,(_latD+(_latM/60))); //lat D=latitude degree //latM Minute
float ET=equationDuTemps(n);
//heure de lever
Serial.print("heure de lever : \t");
int hOnh=int(12-(HO/15)+((_lonD+(_lonM/60))/15)+(ET/60)+_fuso);
Serial.print(hOnh);
Serial.print(":");
int hOnm=int(((12-(HO/15)+((_lonD+(_lonM/60))/15)+(ET/60)+_fuso)-(hOnh))*60);
Serial.print(hOnm);
Serial.println();

Serial.print("heure de coucher : \t");
int hOffh=int(12+(HO/15)+((_lonD+(_lonM/60))/15)+(ET/60)+_fuso);
Serial.print(hOffh);
Serial.print(":");
int hOffm=int(((12+(HO/15)+((_lonD+(_lonM/60))/15)+(ET/60)+_fuso)-(hOffh))*60);
Serial.print( hOffm);
Serial.println();

Serial.print("duree du jour : \t");

Serial.print(abs(hOffh-hOnh));
Serial.print(":");
Serial.print(abs(hOffm-hOnm));
Serial.println();
}
void loop(){}


il manqué un abs() du coup  si les minute couché sont plus grande que les minute lever alors on a une valeur negative !

Uzuma


roccesar

bonjour,

je me suis permis d'apporter quelques corrections au code de Heloderma-Kris.

J'ai rajouté la possibilité d'appliquer des modificateurs pour l'heure de lever et du coucher car de mon côté j'avais un décalage d'une dizaine de minutes.

Si le résultat donne 4 minutes par exemple on obtenait "7h4" et j'ai fait en sorte que le résultat affiche "7h04".

Pour la durée d'ensoleillement il y a avait un bug, puisque le calcul était en base 10 or nous étions en base 60.

Voilà il semble parfaitement fonctionnel sauf erreur mais c'est la première fois que je code.


Code: [Select]
// D'après Heloderma-kris
// Source : http://forum.arduino.cc/index.php?topic=241799.30

// Appel des librairies
#include <Date_heure.h>
#include <ephemeride.h>

// Definition des variables de localisation latitude et longitude
#define _latD 48
#define _latM 36
#define _lonD 2
#define _lonM 18

// Definition de la date
#define _J 27
#define _M 10
#define _A 2014
#define _fuso 1

// rajout César
// Definition des variables d'ajustement si nécessaire intevalle [-60;60] min
// -7 & -12 site http://www.imcce.fr/fr/ephemerides/phenomenes/rts/rts.php
int AjusteLever = -7;
int AjusteCoucher = -12;

// Affichage des informations sur la console
void setup(){
Serial.begin(9600);

int  n =rangJour(_J,_M,_A);
float HO=angleHoraireSoeil(n,(_latD+(_latM/60))); //lat D=latitude degree //latM Minute
float ET=equationDuTemps(n);

//
// calcul heure du lever du soleil
//

int hOnh=int(12-(HO/15)+((_lonD+(_lonM/60))/15)+(ET/60)+_fuso);
int hOnm=int(((12-(HO/15)+((_lonD+(_lonM/60))/15)+(ET/60)+_fuso)-(hOnh))*60);

// rajout César
// integration ajustement pour le calcul de l'heure du lever do soleil
// risque d'obtenir plus de 60 min si c'est le cas rajouter +1 à l'heure
// et si l'heure avec +1 donne 25h passer à 1h du matin

hOnm=hOnm+AjusteLever;
if (hOnm > 59)
{
  hOnh=hOnh+1;
  hOnm=hOnm-60;
  if (hOnh > 24) { hOnh=1; };
};


// affichage de l'heure du lever du soleil

Serial.print("Heure de lever du soleil : \t");
Serial.print(hOnh);
Serial.print(":");

// rajout César
// Si minutes <10 rajouter un 0 devant pour faire 04 minutes et pas 4 minutes

if (hOnm < 10) { Serial.print("0") + Serial.print(hOnm); }
else {Serial.print(hOnm);};

Serial.println();

//
// calcul heure du coucher du soleil
//

int hOffh=int(12+(HO/15)+((_lonD+(_lonM/60))/15)+(ET/60)+_fuso);
int hOffm=int(((12+(HO/15)+((_lonD+(_lonM/60))/15)+(ET/60)+_fuso)-(hOffh))*60);

// rajout César
// integration ajustement pour le calcul de l'heure du coucher do soleil
// risque d'obtenir plus de 60 min si c'est le cas rajouter +1 à l'heure
// et si l'heure avec +1 donne 25h passer à 1h du matin

hOffm=hOffm+AjusteCoucher;
if (hOffm > 59)
{
    hOffh=hOffh+1;
    hOffm=hOffm-60;
    if (hOffh > 24) { hOffh=1; };
};

Serial.print("Heure de coucher du soleil : \t");
Serial.print(hOffh);
Serial.print(":");

// rajout César
// Si minutes <10 rajouter un 0 devant pour faire
// 04 minutes et pas 4 minutes

if (hOffm < 10)

{ Serial.print("0") + Serial.print(hOffm); }
else {Serial.print(hOffm);};

Serial.println();

//
// calcul durée d'ensoleillement
//

Serial.print("Duree du jour : \t");

// rajout César
// une simple soustraction n'est pas possible il faut tenir compte
// car nous sommes en base 60

int DureeJourMinute = 0;
int DureeJourHeure = 0;

if (hOffm<hOnm)
{
DureeJourMinute = 60-hOnm+hOffm;
DureeJourHeure = hOffh-hOnh-1;
}
else
{
DureeJourMinute = abs(hOffm-hOnm);
DureeJourHeure = abs(hOffh-hOnh);
};

// rajout César
// Affichage de l'heure pour la durée totale

Serial.print(DureeJourHeure);
Serial.print(":");


// rajout César
// Si minutes <10 rajouter un 0 devant pour faire
// 04 minutes et pas 4 minutes

if (DureeJourMinute < 10)

{ Serial.print("0") + Serial.print(DureeJourMinute); }
else {Serial.print(DureeJourMinute);};

Serial.println();

}
void loop(){}

Heloderma-kris

Merci de ta participation qui a le merite de bien éclaircire le code !

je vais de toute façon réécrire une partie de ma  lib date_heure car il y a un bug me semble t'il sur les adition soustraction des heures !

sinon pour le proble d'afichage 4h7 on peut normalement passé par la fonction sprintf() et lui demander d'afiché un 0 devant directement !

je revien vers vous lorsque la lib sera modifier!

bricoleau

Salut

@Heloderma :

De mon côté j'avais mis au point une petite lib arduino qui donne les éphémérides avec une bonne précision : 2 secondes d'écart max sur les levers/couchers de soleil par rapport à la référence donnée sur le site de l'imcce, comparaison effectuée sur tous les jours de 2014 et 2015, et sur une dizaine de localisations différentes, de latitude -60 à +60 (l'imprécision augmente quand on s'approche des pôles).

Le résultat est délivré en heures UTC.

Derrière, j'ai une autre petite lib qui me fait toutes les conversions UTC <-> heure locale, avec évidemment la gestion automatique des heures d'été.

Si ça t'intéresse je te retrouve ça et le mets à disposition.

Nb : dans les codes trouvés sur le net, il y a souvent un écart significatif avec la référence imcce, pour une simple raison : l'imcce considère que l'instant du lever/coucher correspond au moment où le centre du disque solaire passe l'horizon, alors que d'autres méthodes de calcul sont basées sur le bord supérieur du disque solaire. Cela induit une différence horaire croissante avec la latitude.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

icare

Salut Bricolo,
Personnellement je serais intéressé par la librairie en question.
Merci
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

Go Up