feat(rtc): add rtcsync.h with PCF8523 detection and time fallback
This commit is contained in:
48
src/rtcsync.h
Normal file
48
src/rtcsync.h
Normal file
@@ -0,0 +1,48 @@
|
||||
// PCF8523-RTC-Modul mit NTP-Sync und Fallback.
|
||||
// Header-only nach Projekt-Pattern: Globale Objekte werden hier definiert.
|
||||
// Dieser Header darf NUR in master.cpp inkludiert werden.
|
||||
#pragma once
|
||||
#include <Arduino.h>
|
||||
#include <RTClib.h>
|
||||
#include <Wire.h>
|
||||
|
||||
// Globale RTC-Instanz und Status-Flags
|
||||
RTC_PCF8523 rtc;
|
||||
bool rtcAvailable = false;
|
||||
bool ntpEverSynced = false;
|
||||
time_t lastNtpSyncEpoch = 0;
|
||||
bool lastStaConnected = false;
|
||||
|
||||
// I2C-Init, PCF8523-Detektion, und Systemzeit-Fallback aus RTC.
|
||||
// Soft-Fail: bei nicht gefundener Hardware bleibt rtcAvailable=false.
|
||||
void setupRTC() {
|
||||
Wire.begin();
|
||||
if (!rtc.begin()) {
|
||||
Serial.println("[RTC] PCF8523 nicht gefunden — RTC-Funktionen deaktiviert");
|
||||
rtcAvailable = false;
|
||||
return;
|
||||
}
|
||||
if (!rtc.initialized() || rtc.lostPower()) {
|
||||
Serial.println("[RTC] PCF8523 erkannt, aber Akku-Backup ungültig (lostPower)");
|
||||
}
|
||||
rtc.start();
|
||||
rtcAvailable = true;
|
||||
Serial.println("[RTC] PCF8523 initialisiert");
|
||||
|
||||
// Systemzeit aus RTC vorbelegen — wird ggf. später durch NTP übersteuert.
|
||||
// RTC speichert UTC, settimeofday erwartet UTC. Kein Offset nötig.
|
||||
DateTime nowRtc = rtc.now();
|
||||
uint32_t rtcEpoch = nowRtc.unixtime();
|
||||
// Plausibilität: RTC sollte mindestens 2025 zeigen, sonst ist sie ungestellt.
|
||||
if (rtcEpoch >= 1735689600UL) {
|
||||
struct timeval tv;
|
||||
tv.tv_sec = (time_t)rtcEpoch;
|
||||
tv.tv_usec = 0;
|
||||
settimeofday(&tv, NULL);
|
||||
Serial.printf("[RTC] Systemzeit aus RTC gesetzt: %lu (UTC)\n",
|
||||
(unsigned long)rtcEpoch);
|
||||
} else {
|
||||
Serial.printf("[RTC] RTC-Zeit unplausibel (%lu) — nicht übernommen\n",
|
||||
(unsigned long)rtcEpoch);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user