From a1a66ebf8e83d2930c861a2493e390388369bf3b Mon Sep 17 00:00:00 2001 From: Emanuele Trabattoni Date: Sun, 3 Aug 2025 11:27:07 +0200 Subject: [PATCH] RTC fix time lag correction --- docs/ESP32_clock_adjust.xlsx | Bin 9698 -> 9644 bytes lib/RTC/PCF85063_Driver.cpp | 19 ++++++++++++++++++- lib/RTC/PCF85063_Driver.h | 5 ++++- src/main.cpp | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/ESP32_clock_adjust.xlsx b/docs/ESP32_clock_adjust.xlsx index 95f0f0c88aa2b8f5010b6dd47e685c545bb1a49e..fcd260ced44e2363a81b89688c0b39aa707271b5 100644 GIT binary patch delta 3739 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 Kk<;G#7x^DD==oFt diff --git a/lib/RTC/PCF85063_Driver.cpp b/lib/RTC/PCF85063_Driver.cpp index 36422c3..9d2b9d7 100644 --- a/lib/RTC/PCF85063_Driver.cpp +++ b/lib/RTC/PCF85063_Driver.cpp @@ -1,5 +1,6 @@ #include "PCF85063_Driver.h" #include +#include namespace drivers { @@ -18,7 +19,7 @@ namespace drivers success &= m_i2c.write(m_address, RTC_CTRL_2_ADDR, {def_conf2}); } // set clock correction pulses - const uint8_t correction = 0b10000011; // fast mode +3 correction pulses, because clock is beyond + const uint8_t correction = 0xE7; // fast mode -25 correction pulses, because clock is beyond success &= m_i2c.write(m_address, RTC_OFFSET_ADDR, {correction}); if (!success) LOG_ERROR("RTC Init Failure"); @@ -160,6 +161,22 @@ namespace drivers return false; } + const bool PCF85063::setOffset(const uint8_t ofst) + { + LOG_INFO("RTC set offset [", printHex(ofst).c_str(), "]"); + return m_i2c.write(m_address, RTC_OFFSET_ADDR, {ofst}); + } + + const uint8_t PCF85063::getOffset() + { + std::vector buf; + if (m_i2c.read(m_address, RTC_OFFSET_ADDR, 1, buf)) { + LOG_INFO("RTC get offset [", printHex(buf.front()).c_str(), "]"); + return buf.front(); + } + return {}; + } + const std::string PCF85063::getTimeStr() { datetime_t dt; diff --git a/lib/RTC/PCF85063_Driver.h b/lib/RTC/PCF85063_Driver.h index c166e05..d6dd88e 100644 --- a/lib/RTC/PCF85063_Driver.h +++ b/lib/RTC/PCF85063_Driver.h @@ -83,7 +83,7 @@ namespace drivers } datetime_t; public: - PCF85063(I2C &i2c, const uint8_t address, const uint8_t ctrl1 = RTC_CTRL_1_DEFAULT, const uint8_t ctrl2 = RTC_CTRL_2_DEFAULT); + PCF85063(I2C &i2c, const uint8_t address = PCF85063_ADDRESS, const uint8_t ctrl1 = RTC_CTRL_1_DEFAULT, const uint8_t ctrl2 = RTC_CTRL_2_DEFAULT); const bool reset(void); @@ -100,6 +100,9 @@ namespace drivers const bool readAlarm(datetime_t &time); const bool getAlarmFlag(uint8_t &flags); + const bool setOffset(const uint8_t ofst); + const uint8_t getOffset(); + const std::string getTimeStr(); static const std::string datetime2str(const datetime_t &datetime); diff --git a/src/main.cpp b/src/main.cpp index edb4d2e..7797318 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,7 +34,7 @@ void loop() // Declared here to keep devices local to the main loop otherwise the kernel crashes // auto i2c = drivers::I2C(); auto bus = drivers::MODBUS(9600, SERIAL_8N1); - auto rtc = drivers::PCF85063(i2c, PCF85063_ADDRESS); + auto rtc = drivers::PCF85063(i2c); auto eth = drivers::Ethernet(conf.m_ethHostname); auto tmp = drivers::R4DCB08(bus, conf.m_modbusTemperatureAddr); auto seneca = drivers::S50140(bus, conf.m_modbusSenecaAddr);