/*
MoonPhase Calendar
Description:
Author: Axel "Okura" MONTZAMIR
Date: 26/01/2024
*/
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup() {
Serial.begin(9600);
RTC.begin();
if (!RTC.isrunning()) {
Serial.println("RTC is NOT running!");
}
}
void loop() {
displayMoonPhaseCalendar();
delay(1000); // Delay for better readability in the serial monitor
}
void displayMoonPhaseCalendar() {
DateTime now = RTC.now();
int daysInMonth = 30;
Serial.println("\nMoon Phase Calendar for the Current Month:");
Serial.println("=======================================");
for (int day = 1; day <= daysInMonth; day++) {
int mp = moon_phase(now.year(), now.month(), day);
Serial.print("Day ");
Serial.print(day);
Serial.print(": ");
switch (mp) {
case 0:
Serial.println("Full Moon");
break;
case 1:
Serial.println("Waning Gibbous");
break;
case 2:
Serial.println("Last Quarter");
break;
case 3:
Serial.println("Old Crescent");
break;
case 4:
Serial.println("New Moon");
break;
case 5:
Serial.println("New Crescent");
break;
case 6:
Serial.println("First Quarter");
break;
case 7:
Serial.println("Waxing Gibbous");
break;
}
}
}
int moon_phase(int year, int month, int day) {
double jd = julianDate(year, month, day);
jd = int(jd - 2244116.75);
jd /= 29.53;
int b = jd;
jd -= b;
b = jd * 8 + 0.5;
b = b & 7;
return b;
}
int daysInMonth(int month, int year) {
switch (month) {
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 29; // Leap year
} else {
return 28;
}
default:
return 31;
}
}
double julianDate(int year, int month, int day) {
int mm, yy;
double k1, k2, k3, j;
yy = year - int((12 - month) / 10);
mm = month + 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 + day + 59;
j = j - k3;
return j;
}