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.