#include #include #include "config.h" #include "sensors.h" #include "rtc_time.h" #include "display_ui.h" #include "forecast.h" #include "history.h" #include "app_settings.h" #include "state.h" AppState g_state; static unsigned long tSample = 0; static unsigned long tHistory = 0; static void sampleNow() { g_state.now = rtcNow(); g_state.absHpa = readAbsPressureHpa(); g_state.mslHpa = toSeaLevelHpa(g_state.absHpa, settings.altitudeM); g_state.tempC = readTemperatureC(); float d; g_state.haveTrend = historyTrendDelta(d); if (g_state.haveTrend) { g_state.trend = classifyTrend(d); g_state.forecast = computeForecast(g_state.mslHpa, g_state.trend, g_state.now.month); } else { g_state.trend = TREND_STEADY; } } void setup() { Serial.begin(115200); delay(200); Serial.println(F("\n=== Weather Predictor ===")); Wire.begin(I2C_SDA, I2C_SCL); displayBegin(); displaySplash("Weather", "Predictor"); if (!sensorsBegin()) Serial.println(F("BMP180 not found!")); if (!rtcBegin()) Serial.println(F("DS3231 not found!")); if (rtcLostPower()) { Serial.println(F("RTC lost power -> temporary time set")); rtcSet(RtcTime{2026, 7, 17, 12, 0, 0}); } settingsBegin(); historyBegin(); // Seed first sample immediately. sampleNow(); historyAdd(rtcEpoch(), g_state.mslHpa, g_state.tempC); displayRender(g_state); tSample = tHistory = millis(); } void loop() { unsigned long now = millis(); if (now - tSample >= SAMPLE_INTERVAL_MS) { tSample = now; sampleNow(); displayRender(g_state); } if (now - tHistory >= HISTORY_INTERVAL_MS) { tHistory = now; historyAdd(rtcEpoch(), g_state.mslHpa, g_state.tempC); } }