J'ai récupéré un code sur un autre forum permettant de définir la position du soleil (entre autre) en fonction du lieu où nous nous trouvons.
Je l'ai modifiée en y intégrant mon lieu de résidence et supprimant les éléments ne me concernant pas.
Jusque là tout va bien.
Mais je ne parviens pas à le développer dans la partie loop pour que la position s'actualise en fonction de l'heure.
Dans l'idéal je voudrai me passer d'un module RTC.
J'ai essayé différentes choses mais pour l'instant je coince !
Est ce que quelqu'un aurait une idée/ conseil ?
Je vous copie le code actuel (la partie Setup,à laquelle je n'ai pas tout compris mais ça fonctionne après plusieurs essais) .
#include <Ephem_Soleil.h>
double ha;
double az;
String lS, mS, cS;
void setup() {
Serial.begin(9600);
Serial.println("BEGLES ; position du soleil le 23/11/2022 à 12 h"); // heure au soleil mettre 2h de moins en heure d'hiver ;
posSoleil("23/11/2022 10:00:00", 0, 44.808908, -0.547458, &ha, &az); // Bègles le 23/11/2022
Serial.println(" hauteur : " + String(ha, 7) + " azimut : " + String(az, 7));
// posSoleil(2022, 11, 23, 10, 0, 0, 0, 44.808908, -0.547458, &ha, &az);
// Serial.println(" hauteur : " + String(ha, 7) + " azimut : " + String(az, 7));
Bonsoir et très bonne idée,
J'ai toujours pensé qu'un asservissement sur le Soleil était inutile puisque le soleil n'est pas près de changer de trajectoire et les calculs se contrefichent de la présence ou pas de nuages ou du brouillard.
J'ai juste eu la flemme d'aller jusqu'à la réalisation physique, la mécanique et moi nous n'avons pas d'atomes crochus.
Néanmoins, j'ai fait une recherche documentaire et le meilleur document que j'ai trouvé est :
Université Paris-Orsay Sud, Vincent Bourdin 2014
Titre :
" Calculs Astronomiques simplifiés"
Si je peux me permettre de te donner un conseil, c'est de passer tout de suite tous les angles en radians.
Dans une fonction trigonométrique en C/C++ les angles sont obligatoirement en radians.
Par contre, les hauteurs du soleil et l'azimut sont "traditionnellement" en degrés dit "classiques".
Le degré n'est pas une unité SI (Sytême d'unité cohérent International), le mix de degré et de radians est source de confusion.
J'ai fais la partie calcul (ne me la demande pas, je ne saurai pas la retrouver) et j'ai orgueilleusement pensé que je pourrai facilement gérer ce qui est en radians et ce qui est en degrés.
J'ai vite déchanté sur mes capacités de gestion quand j'ai trouvé un sinus supérieur à 1.
Une fois tous les angles passés en radians les résultats étaient bons.
À la fin du calcul il faut juste convertir hauteur et azimut en degrés.
La personne qui a crée cette bibliothèque m'a répondu ceci :
"Il faut que dans le "loop", vous fassiez un appel aux fonctions de la bibliothèque en leur transmettant date et heure sous le format voulu ( string ou entier) et ce, tous les dT que vous souhaitez. So vous n'avez pas besoin de précision, vous pouvez utiliser le compteur de l'Arduino."
Je ne parviens pas à réaliser ce travail...
Pouvez vous m'aider ?
#include <SolarPosition.h>
// number of decimal digits to print
const uint8_t digits = 3;
// some test positions:
SolarPosition Ici(23.18, -80.75);// Y fait moins froid ici
int someS = 0; //second
int someM = 38; //minute
int someH = 18; //hour UTC
int someD = 25; //day
int someMo = 11; //month
int someY = 2022; //year
tmElements_t someTime = {someS, someM, someH, 0, someD, someMo, CalendarYrToTm(someY) };
time_t someEpochTime = makeTime(someTime);
void setup()
{
Serial.begin(115200);
}
void loop()
{
Serial.print(F("The sun was at an elevation of "));
Serial.print(Ici.getSolarElevation(someEpochTime), 4);
Serial.print(F(" and an azimuth of "));
Serial.println(Ici.getSolarAzimuth(someEpochTime), 4);
Serial.print(F("in Ici at "));
printTime(someEpochTime);
Serial.print(F("The earth was "));
Serial.print(Ici.getSolarDistance(someEpochTime), 0);
Serial.println(F(" km from the Sun."));
Serial.println();
someEpochTime += 5;
delay (5000);
}
void printTime(time_t t)
{
tmElements_t someTime;
breakTime(t, someTime);
Serial.print(someTime.Hour);
Serial.print(F(":"));
Serial.print(someTime.Minute);
Serial.print(F(":"));
Serial.print(someTime.Second);
Serial.print(F(" UTC on "));
Serial.print(dayStr(someTime.Wday));
Serial.print(F(", "));
Serial.print(monthStr(someTime.Month));
Serial.print(F(" "));
Serial.print(someTime.Day);
Serial.print(F(", "));
Serial.println(tmYearToCalendar(someTime.Year));
}