bonjour,
je prévoie de me faire une station météo et je cherche les morceaux de prog pour arriver a quelque chose de complet.
pour les instruments j'ai trouvé a peut près tout ce qu'il me faut, code et modules.
pour les prévisions, ( éphémérides) c'est pas encore ça, mais pour le calcule des phases de lune c'est plutôt difficile et je sèche total malgré pas mal de recherche.
je souhaite pouvoir obtenir la phase de lune selon la date et le lieu. j'ai essayé avec la lib "avr-libc " j'ai pas réussi
si quelqu'un pouvait m'aider ou m’orienter ca serrait cool.
Voir ici : https://github.com/G6EJD/LilyGo-EPD-47-OWM-Weather-Display
Tu trouveras des routines pour calculer les phases de la lune.
en effet il y a plein de code partout, ça a l'air bien beau, mais je ne comprend pas du tout comment s'en servir.
en cherchant bien, j'ai trouver plusieurs choses que j'ai assemblé pour faire un code qui a l'aire de fonctionner.
je ne peux pas citer les sources car je n'ai pas pris soin de noter les divers endroits ou j'ai cherché, mille excuses pour les créateurs.
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
String nfm = ""; // jours avant la prochaine pleine lune
void setup() {
Serial.begin(115200);
rtc.begin();
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// pour changer la date de la RTC
// exemple pour Le 22 janvier 2020 à 6h du matin :
// rtc.adjust(DateTime(2020, 1, 22, 6, 0, 0));
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // la RTC prends l'heur et la date de l'ordinateur
Wire.begin();
}
void loop() {
affichagelune();
delay(1000);
}
void affichagelune(void) {
DateTime now = rtc.now();
int Year = (now.year());
Serial.print(now.day(), DEC);
Serial.print(" / ");
Serial.print(now.month(), DEC);
Serial.print(" / ");
Serial.print(Year, DEC);
Serial.print(" : ");
int mp = lune_phase();
switch (mp) {
case 0:
Serial.println(" Pleine Lune ");
break;
case 1:
Serial.println(" Gibbeuse Décroissante");
break;
case 2:
Serial.println(" Dernier Quartier ");
break;
case 3:
Serial.println(" Dernier Croissant ");
break;
case 4:
Serial.println(" Nouvelle Lune ");
break;
case 5:
Serial.println(" Premier Croissant ");
break;
case 6:
Serial.println(" Premier Quartier");
break;
case 7:
Serial.println(" Gibbeuse Croissante");
break;
}
}
int lune_phase() {
// calcule l'âge de la phase de lune (0 à 7)
// il y a huit étapes, 0 est la pleine lune et 4 est une nouvelle lune
DateTime now = rtc.now();
double jd = 0; //Date julienne
double ed = 0; //jours écoulés depuis le début de la pleine lune
int b = 0;
jd = datejulienne(now.year(), now.month(), now.day());
jd = int(jd - 2244116.75); // reférence au 1 janvier 1972
jd /= 29.53; // diviser par le cycle lunaire
b = jd;
jd -= b; // laisse la partie fractionnaire de jd
ed = jd * 29.53; // jours écoulés ce mois-ci
nfm = String((int(29.53 - ed))); // jours avant la prochaine pleine lune
b = jd * 8 + 0.5;
b = b & 7;
return b;
}
double datejulienne(int y, int m, int d) {
//convertir une date en date julienne}
int mm, yy;
double k1, k2, k3;
double j;
yy = y - int((12 - m) / 10);
mm = m + 9;
if (mm >= 12) {
mm = mm - 12;
}
k1 = 365.25 * (yy + 4172);
k2 = int((30.6001 * mm) + 0.5);
k3 = int((((yy / 100) + 4) * 0.75) - 38);
j = k1 + k2 + d + 59;
j = j - k3; //j est la date julienne à 12h TU (temps universel)
return j;
}
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.