wakeup sync (experimental)

This commit is contained in:
cyberman54 2023-03-08 15:53:30 +01:00
parent e7a3d24103
commit eaa8bdf47e
3 changed files with 21 additions and 2 deletions

View File

@ -88,6 +88,10 @@ Supported external time sources are GPS, LORAWAN network time and LORAWAN applic
If your LORAWAN network does not support network time, you can run a Node-Red timeserver application using the enclosed [**Timeserver code**](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/Node-RED/Timeserver.json). Configure the MQTT nodes in Node-Red for the LORAWAN application used by your paxocunter device. Time can also be set without precision liability, by simple remote command, see section remote control. If your LORAWAN network does not support network time, you can run a Node-Red timeserver application using the enclosed [**Timeserver code**](https://github.com/cyberman54/ESP32-Paxcounter/blob/master/src/Node-RED/Timeserver.json). Configure the MQTT nodes in Node-Red for the LORAWAN application used by your paxocunter device. Time can also be set without precision liability, by simple remote command, see section remote control.
## Syncing multiple paxcounters
A fleet of paxcounters can be synchronized to keep all devices wake up and start scanning at the same time. Synchronization is based on top-of-hour as common time point of reference. This feature requires time-of-day to be present on each device. Thus, `TIME_SYNC_INTERVAL` option, as explained above, must be enabled. Wake up syncing is enabled by setting `SYNCWAKEUP` in `paxcounter.conf` to a value X, greater than zero, and smaller than `SLEEPCYCLE`. This defines a time window, centered at top-of-hour, sized +/- X seconds. If a device, returning from sleep, would wakeup within this time windows, the wakeup will be adjusted to top-of-hour.
## Wall clock controller ## Wall clock controller
Paxcounter can be used to sync a wall clock which has a DCF77 or IF482 time telegram input. Set `#define HAS_IF482` or `#define HAS_DCF77` in board's hal file to setup clock controller. Use case of this function is to integrate paxcounter and clock. Accurary of the synthetic DCF77 signal depends on accuracy of on board's time base, see above. Paxcounter can be used to sync a wall clock which has a DCF77 or IF482 time telegram input. Set `#define HAS_IF482` or `#define HAS_DCF77` in board's hal file to setup clock controller. Use case of this function is to integrate paxcounter and clock. Accurary of the synthetic DCF77 signal depends on accuracy of on board's time base, see above.

View File

@ -14,7 +14,7 @@
void reset_rtc_vars(void); void reset_rtc_vars(void);
void do_reset(bool warmstart); void do_reset(bool warmstart);
void do_after_reset(void); void do_after_reset(void);
void enter_deepsleep(const uint32_t wakeup_sec, const gpio_num_t wakeup_gpio); void enter_deepsleep(uint32_t wakeup_sec, const gpio_num_t wakeup_gpio);
unsigned long long uptime(void); unsigned long long uptime(void);
enum runmode_t { enum runmode_t {

View File

@ -81,7 +81,7 @@ void do_after_reset(void) {
} }
} }
void enter_deepsleep(const uint32_t wakeup_sec, gpio_num_t wakeup_gpio) { void enter_deepsleep(uint32_t wakeup_sec, gpio_num_t wakeup_gpio) {
ESP_LOGI(TAG, "Preparing to sleep..."); ESP_LOGI(TAG, "Preparing to sleep...");
RTC_runmode = RUNMODE_SLEEP; RTC_runmode = RUNMODE_SLEEP;
@ -146,6 +146,21 @@ void enter_deepsleep(const uint32_t wakeup_sec, gpio_num_t wakeup_gpio) {
// configure wakeup sources // configure wakeup sources
// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/sleep_modes.html // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/sleep_modes.html
#ifdef TIME_SYNC_INTERVAL
#if (SYNCWAKEUP) && (SLEEPCYCLE)
time_t now;
uint16_t shift_sec;
time(&now);
shift_sec = 3600 - (now + wakeup_sec) %
3600; // 1..3600 remaining seconds between planned
// wakeup time and following top-of-hour
if (shift_sec <= SYNCWAKEUP) // delay wakeup to catch top-of-hour
wakeup_sec += shift_sec;
else if (shift_sec >= (3600 - SYNCWAKEUP))
wakeup_sec = 3600 - shift_sec; // shorten wake up to next top-of-hour
#endif
#endif
// set up RTC wakeup timer, if we have // set up RTC wakeup timer, if we have
if (wakeup_sec > 0) { if (wakeup_sec > 0) {
esp_sleep_enable_timer_wakeup(wakeup_sec * uS_TO_S_FACTOR); esp_sleep_enable_timer_wakeup(wakeup_sec * uS_TO_S_FACTOR);