Napisz program na arduino GIGA na obliczanie faz księżyca
Fazy Księżyca są wynikiem zmiany oświetlenia Księżyca przez Słońce, widzianego z Ziemi. Obliczenia faz Księżyca opierają się na:
Program oblicza fazę Księżyca na podstawie bieżącej daty, dostarczanej przez moduł RTC (Real-Time Clock). Wynik jest wyświetlany w monitorze szeregowym.
#include <Wire.h>
#include <RTClib.h> // Biblioteka do obsługi RTC
RTC_DS3231 rtc; // Inicjalizacja modułu RTC
// Stałe astronomiczne
const double SYNODIC_MONTH = 29.53058867; // Długość miesiąca synodycznego w dniach
const double NEW_MOON_EPOCH = 2451550.1; // JD dla nowiu 6 stycznia 2000
// Funkcja obliczająca datę juliańską
double calculateJulianDate(int year, int month, int day) {
if (month <= 2) {
year -= 1;
month += 12;
}
int a = year / 100;
int b = 2 - a + (a / 4);
return floor(365.25 * (year + 4716)) + floor(30.6001 * (month + 1)) + day + b - 1524.5;
}
// Funkcja obliczająca wiek Księżyca
double calculateMoonAge(double julianDate) {
double daysSinceNewMoon = fmod((julianDate - NEW_MOON_EPOCH), SYNODIC_MONTH);
if (daysSinceNewMoon < 0) daysSinceNewMoon += SYNODIC_MONTH;
return daysSinceNewMoon;
}
// Funkcja zwracająca nazwę fazy Księżyca
String getMoonPhaseName(double moonAge) {
if (moonAge < 1.84566)
return "Nów";
else if (moonAge < 5.53699)
return "Młody Sierp";
else if (moonAge < 9.22831)
return "Pierwsza Kwadra";
else if (moonAge < 12.91963)
return "Przybywający Garb";
else if (moonAge < 16.61096)
return "Pełnia";
else if (moonAge < 20.30228)
return "Ubywający Garb";
else if (moonAge < 23.99361)
return "Ostatnia Kwadra";
else if (moonAge < 27.68493)
return "Stary Sierp";
else
return "Nów";
}
void setup() {
Serial.begin(115200);
if (!rtc.begin()) {
Serial.println("Błąd: Nie można znaleźć modułu RTC!");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC utracił zasilanie, ustawiam domyślną datę.");
rtc.adjust(DateTime(2023, 1, 1, 0, 0, 0));
}
}
void loop() {
DateTime now = rtc.now();
// Pobranie bieżącej daty
int year = now.year();
int month = now.month();
int day = now.day();
// Obliczenia
double julianDate = calculateJulianDate(year, month, day);
double moonAge = calculateMoonAge(julianDate);
String moonPhase = getMoonPhaseName(moonAge);
// Wyświetlenie wyników
Serial.print("Data: ");
Serial.print(year);
Serial.print("/");
Serial.print(month);
Serial.print("/");
Serial.println(day);
Serial.print("Faza Księżyca: ");
Serial.println(moonPhase);
Serial.print("Wiek Księżyca: ");
Serial.print(moonAge, 2);
Serial.println(" dni");
delay(86400000); // Aktualizacja co 24 godziny
}
RTClib
jest jedną z najpopularniejszych bibliotek do obsługi modułów RTC, takich jak DS3231.Program na Arduino GIGA oblicza fazy Księżyca na podstawie daty, wykorzystując algorytm oparty na dacie juliańskiej i długości miesiąca synodycznego. Wyniki są wyświetlane w monitorze szeregowym. Program można rozszerzyć o bardziej zaawansowane algorytmy i wizualizacje.