feat: DS3231 RTC read/set with lost-power detection
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "display_ui.h"
|
#include "display_ui.h"
|
||||||
#include "sensors.h"
|
#include "sensors.h"
|
||||||
|
#include "rtc_time.h"
|
||||||
|
|
||||||
static void i2cScan() {
|
static void i2cScan() {
|
||||||
Serial.println(F("I2C scan:"));
|
Serial.println(F("I2C scan:"));
|
||||||
@@ -28,12 +29,18 @@ void setup() {
|
|||||||
displaySplash("Weather", "Predictor v0.1");
|
displaySplash("Weather", "Predictor v0.1");
|
||||||
|
|
||||||
if (!sensorsBegin()) Serial.println(F("BMP180 not found!"));
|
if (!sensorsBegin()) Serial.println(F("BMP180 not found!"));
|
||||||
|
if (!rtcBegin()) Serial.println(F("DS3231 not found!"));
|
||||||
|
if (rtcLostPower()) {
|
||||||
|
Serial.println(F("RTC lost power -> setting to build time"));
|
||||||
|
rtcSet(RtcTime{2026, 7, 17, 12, 0, 0}); // temporary; NTP will correct later
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
RtcTime t = rtcNow();
|
||||||
float abs_ = readAbsPressureHpa();
|
float abs_ = readAbsPressureHpa();
|
||||||
float msl = toSeaLevelHpa(abs_, DEFAULT_ALTITUDE_M);
|
Serial.printf("%04u-%02u-%02u %02u:%02u:%02u abs=%.1f msl=%.1f t=%.1f\n",
|
||||||
Serial.printf("abs=%.1f hPa msl=%.1f hPa t=%.1f C\n",
|
t.year, t.month, t.day, t.hour, t.minute, t.second,
|
||||||
abs_, msl, readTemperatureC());
|
abs_, toSeaLevelHpa(abs_, DEFAULT_ALTITUDE_M), readTemperatureC());
|
||||||
delay(2000);
|
delay(2000);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#include <RTClib.h>
|
||||||
|
#include "rtc_time.h"
|
||||||
|
|
||||||
|
static RTC_DS3231 rtc;
|
||||||
|
|
||||||
|
bool rtcBegin() { return rtc.begin(); }
|
||||||
|
bool rtcLostPower() { return rtc.lostPower(); }
|
||||||
|
|
||||||
|
RtcTime rtcNow() {
|
||||||
|
DateTime n = rtc.now();
|
||||||
|
return RtcTime{ n.year(), n.month(), n.day(), n.hour(), n.minute(), n.second() };
|
||||||
|
}
|
||||||
|
|
||||||
|
void rtcSet(const RtcTime& t) {
|
||||||
|
rtc.adjust(DateTime(t.year, t.month, t.day, t.hour, t.minute, t.second));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t rtcEpoch() {
|
||||||
|
return rtc.now().unixtime();
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
struct RtcTime {
|
||||||
|
uint16_t year;
|
||||||
|
uint8_t month, day, hour, minute, second;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool rtcBegin();
|
||||||
|
bool rtcLostPower();
|
||||||
|
RtcTime rtcNow();
|
||||||
|
void rtcSet(const RtcTime& t);
|
||||||
|
uint32_t rtcEpoch();
|
||||||
Reference in New Issue
Block a user