#include <WiFi.h>
#include <Wire.h>
#include <RTClib.h>
#include <time.h> // dla configTime() i getLocalTime()
#include "AstroCalc.h"
// =========================
// 📍 Konfiguracja lokalizacji
// =========================
const double LATITUDE = 45.613418; // Verona, Włochy
const double LONGITUDE = 10.312439; // Verona, Włochy
const double TIMEZONE = 1.0; // CET = UTC+1 (bez DST tutaj)
// =========================
// 🌐 Konfiguracja WiFi + NTP
// =========================
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = (long)(TIMEZONE * 3600);
const int daylightOffset_sec = 0; // jak chcesz letni, możesz dać 3600
// =========================
// 🌍 Obiekty
// =========================
RTC_DS3231 rtc;
AstroCalc astro(LATITUDE, LONGITUDE, TIMEZONE);
// =========================
// 🔧 Pomocnicze funkcje
// =========================
// Ustawia czas systemowy z NTP i zapisuje go do RTC
bool syncTimeFromNTP() {
Serial.println(F("\n[SYNC] Konfiguracja NTP..."));
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
struct tm timeinfo;
if (!getLocalTime(&timeinfo, 10000)) { // timeout 10s
Serial.println(F("[SYNC] Błąd: nie udało się pobrać czasu z NTP."));
return false;
}
Serial.println(F("[SYNC] Czas z NTP pobrany:"));
Serial.printf(" %04d-%02d-%02d %02d:%02d:%02d\n",
timeinfo.tm_year + 1900,
timeinfo.tm_mon + 1,
timeinfo.tm_mday,
timeinfo.tm_hour,
timeinfo.tm_min,
timeinfo.tm_sec);
// Zapis do RTC (pracujemy na czasie lokalnym, zgodnym z TIMEZONE)
rtc.adjust(DateTime(
timeinfo.tm_year + 1900,
timeinfo.tm_mon + 1,
timeinfo.tm_mday,
timeinfo.tm_hour,
timeinfo.tm_min,
timeinfo.tm_sec
));
Serial.println(F("[SYNC] RTC zsynchronizowany z NTP.\n"));
return true;
}
// Pobiera aktualny czas z RTC i pakuje do struktury AstroCalc::DateTime
AstroCalc::DateTime getCurrentDateTime() {
DateTime now = rtc.now();
AstroCalc::DateTime dt;
dt.year = now.year();
dt.month = now.month();
dt.day = now.day();
dt.hour = now.hour();
dt.minute = now.minute();
return dt;
}
void printSunData(const AstroCalc::SunData& s) {
Serial.println(F("\n☀️ Dane Słońca:"));
Serial.printf(" RA: %.3f h\n", s.ra);
Serial.printf(" Dec: %.3f°\n", s.dec);
Serial.printf(" Azimuth: %.2f°\n", s.azimuth);
Serial.printf(" Altitude: %.2f°\n", s.altitude);
Serial.printf(" Distance: %.6f AU\n", s.distance);
Serial.printf(" EclLon: %.2f°\n", s.eclLon);
}
void printMoonData(const AstroCalc::MoonData& m) {
Serial.println(F("\n🌙 Dane Księżyca:"));
Serial.printf(" RA: %.3f h\n", m.ra);
Serial.printf(" Dec: %.3f°\n", m.dec);
Serial.printf(" Azimuth: %.2f°\n", m.azimuth);
Serial.printf(" Altitude: %.2f°\n", m.altitude);
Serial.printf(" Distance: %.0f km\n", m.distance);
Serial.printf(" Phase: %.3f (%.2f dni)\n", m.phase, m.age);
Serial.printf(" Illumination: %.1f%%\n", m.illumination * 100.0);
Serial.printf(" Elongation: %.2f°\n", m.elongation);
Serial.printf(" Zodiac: %s\n", m.zodiac.c_str());
Serial.printf(" Phase name: %s\n", m.phaseName.c_str());
}
// =========================
// 🚀 SETUP
// =========================
void setup() {
Serial.begin(115200);
delay(2000);
Serial.println(F("\n===== ASTROCALC DEMO (NTP + RTC, bez WiFiUDP) ====="));
// Start I2C (jak trzeba – zależy od płytki/Wokwi)
Wire.begin();
// Inicjalizacja RTC
if (!rtc.begin()) {
Serial.println(F("Błąd: RTC DS3231 nie wykryty!"));
while (true) delay(100);
}
// Połączenie z WiFi
Serial.print(F("Łączenie z WiFi: "));
Serial.println(ssid);
WiFi.begin(ssid, password);
int retry = 0;
while (WiFi.status() != WL_CONNECTED && retry < 40) {
delay(500);
Serial.print(".");
retry++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println(F("\nWiFi połączone."));
Serial.print(F("IP: "));
Serial.println(WiFi.localIP());
// Sync z NTP tylko jeśli WiFi weszło
if (!syncTimeFromNTP()) {
Serial.println(F("[WARN] Brak sync z NTP, używam czasu z RTC (jeśli poprawny)."));
}
} else {
Serial.println(F("\n[WARN] Nie udało się połączyć z WiFi, używam czasu z RTC."));
}
// Jeśli RTC zgłosi, że stracił zasilanie, ustaw domyślną datę
if (rtc.lostPower()) {
Serial.println(F("[RTC] Utrata zasilania – ustawiam domyślną datę."));
rtc.adjust(DateTime(2025, 12, 3, 22, 0, 0)); // cokolwiek jako start
}
}
// =========================
// 🔄 LOOP
// =========================
void loop() {
AstroCalc::DateTime dt = getCurrentDateTime();
astro.update(dt);
double jd = astro.getJulianDate();
Serial.println(F("\n---------------------------------------------"));
Serial.printf("Czas lokalny: %04d-%02d-%02d %02d:%02d\n",
dt.year, dt.month, dt.day, dt.hour, dt.minute);
Serial.printf("Julian Date: %.5f\n", jd);
printSunData(astro.getSun());
printMoonData(astro.getMoon());
delay(15000); // odświeżanie co 15 s
}
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4