Feature RTC support added (experimental)

This commit is contained in:
Klaus K Wilting 2019-01-19 17:53:21 +01:00
parent 1efaf9a04e
commit a3414c5622
7 changed files with 159 additions and 2 deletions

View File

@ -11,6 +11,11 @@
#include "bme680mems.h" #include "bme680mems.h"
#endif #endif
// Needed for RTC time sync if RTC present on board
#ifdef HAS_RTC
#include "rtc.h"
#endif
void doHousekeeping(void); void doHousekeeping(void);
void do_timesync(void); void do_timesync(void);
uint64_t uptime(void); uint64_t uptime(void);

View File

@ -17,6 +17,11 @@
#include <Wire.h> #include <Wire.h>
#endif #endif
// Needed for RTC time sync if RTC present on board
#ifdef HAS_RTC
#include "rtc.h"
#endif
extern QueueHandle_t LoraSendQueue; extern QueueHandle_t LoraSendQueue;
void onEvent(ev_t ev); void onEvent(ev_t ev);

16
include/rtc.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef _RTC_H
#define _RTC_H
#include "globals.h"
#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
extern RtcDS3231<TwoWire> Rtc; // Make RTCDS3231 instance globally availabe
int rtc_init(void);
int set_rtc(uint32_t UTCTime);
int set_rtc(RtcDateTime now);
uint32_t get_rtc();
float get_rtc_temp();
#endif

View File

@ -128,6 +128,16 @@ void do_timesync() {
if (gps.time.isValid()) { if (gps.time.isValid()) {
setTime(gps.time.hour(), gps.time.minute(), gps.time.second(), setTime(gps.time.hour(), gps.time.minute(), gps.time.second(),
gps.date.day(), gps.date.month(), gps.date.year()); gps.date.day(), gps.date.month(), gps.date.year());
#ifdef HAS_RTC
RtcDateTime now;
now.year = gps.time.year();
now.month = gps.date.month();
now.dayOfMonth = gps.date.day();
now.hour = gps.time.hour();
now.minute = gps.time.minute();
now.second = gps.time.second();
set_rtc(now);
#endif
ESP_LOGI(TAG, "Time synced by GPS to %02d:%02d:%02d", hour(), minute(), ESP_LOGI(TAG, "Time synced by GPS to %02d:%02d:%02d", hour(), minute(),
second()); second());
return; return;

View File

@ -455,6 +455,9 @@ void user_request_network_time_callback(void *pVoidUserUTCTime,
// Update system time with time read from the network // Update system time with time read from the network
setTime(*pUserUTCTime); setTime(*pUserUTCTime);
ESP_LOGI(TAG, "Time synced by LoRa network to %02d:%02d:%02d", hour(), #ifdef HAS_RTC
minute(), second()); set_rtc(*pUserUTCTime);
#endif
ESP_LOGI(TAG, "Time synced by LoRa network to %02d:%02d:%02d", hour(),
minute(), second());
} }

View File

@ -171,6 +171,12 @@ void setup() {
0); // CPU core 0); // CPU core
#endif #endif
// initialize RTC
#ifdef HAS_RTC
strcat_P(features, " RTC");
assert(rtc_init());
#endif
// initialize wifi antenna // initialize wifi antenna
#ifdef HAS_ANTENNA_SWITCH #ifdef HAS_ANTENNA_SWITCH
strcat_P(features, " ANT"); strcat_P(features, " ANT");

112
src/rtc.cpp Normal file
View File

@ -0,0 +1,112 @@
#ifdef HAS_RTC
#include "rtc.h"
// Local logging tag
static const char TAG[] = "main";
RtcDS3231<TwoWire> Rtc(Wire);
// initialize RTC
int rtc_init() {
// return = 0 -> error / return = 1 -> success
// block i2c bus access
if (xSemaphoreTake(I2Caccess, (2 * DISPLAYREFRESH_MS / portTICK_PERIOD_MS)) ==
pdTRUE) {
Wire.begin(HAS_RTC);
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
if (!Rtc.IsDateTimeValid()) {
ESP_LOGW(TAG, "RTC has no valid RTC date/time, setting to compilation date");
Rtc.SetDateTime(compiled);
}
if (!Rtc.GetIsRunning()) {
ESP_LOGI(TAG, "RTC not running, starting now");
Rtc.SetIsRunning(true);
}
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled) {
ESP_LOGI(TAG, "RTC date/time is older than compilation date, updating)");
Rtc.SetDateTime(compiled);
}
// configure RTC chip
Rtc.Enable32kHzPin(false);
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone);
} else {
ESP_LOGE(TAG, "I2c bus busy - RTC initialization error");
goto error;
}
xSemaphoreGive(I2Caccess); // release i2c bus access
ESP_LOGI(TAG, "RTC initialized");
return 1;
error:
xSemaphoreGive(I2Caccess); // release i2c bus access
return 0;
} // rtc_init()
int set_rtc(uint32_t UTCTime) {
// return = 0 -> error / return = 1 -> success
#ifdef HAS_RTC
// block i2c bus access
while (xSemaphoreTake(I2Caccess, 2 * DISPLAYREFRESH_MS) == pdTRUE) {
Rtc.SetDateTime(RtcDateTime(UTCTime));
xSemaphoreGive(I2Caccess); // release i2c bus access
return 1;
} // while
return 0;
#endif
} // set_rtc()
int set_rtc(RtcDateTime now) {
// return = 0 -> error / return = 1 -> success
#ifdef HAS_RTC
// block i2c bus access
while (xSemaphoreTake(I2Caccess, 2 * DISPLAYREFRESH_MS) == pdTRUE) {
Rtc.SetDateTime(now);
xSemaphoreGive(I2Caccess); // release i2c bus access
return 1;
} // while
return 0;
#endif
} // set_rtc()
uint32_t get_rtc() {
#ifdef HAS_RTC
// block i2c bus access
while (xSemaphoreTake(I2Caccess, 2 * DISPLAYREFRESH_MS) == pdTRUE) {
if (!Rtc.IsDateTimeValid()) {
ESP_LOGW(TAG, "RTC lost confidence in the DateTime");
return 0;
}
xSemaphoreGive(I2Caccess); // release i2c bus access
return Rtc.GetDateTime();
} // while
return 0;
#endif
} // get_rtc()
float get_rtc_temp() {
#ifdef HAS_RTC
// block i2c bus access
while (xSemaphoreTake(I2Caccess, 2 * DISPLAYREFRESH_MS) == pdTRUE) {
RtcTemperature temp = Rtc.GetTemperature();
xSemaphoreGive(I2Caccess); // release i2c bus access
return temp.AsFloatDegC();
} // while
return 0;
#endif
} // get_rtc()
#endif // HAS_RTC