microReticulumTbeam/exercises/11_Set_RTC2GPS
John Poole 5f5742f198 Setting RTC to GPS with 1PPS precision working. Here is an example log:
20260217_200901_z	 set RTC to GPS using 1PPS pulse-per-second discipline	rtc-gps drift=-28 s
20260217_201001_z	 set RTC to GPS using 1PPS pulse-per-second discipline	rtc-gps drift=+0 s
20260217_201119_z	 set RTC to GPS using 1PPS pulse-per-second discipline	rtc-gps drift=+0 s
20260217_201219_z	 set RTC to GPS using 1PPS pulse-per-second discipline	rtc-gps drift=+0 s
2026-02-17 12:15:50 -08:00
..
lib/startup_sd Setting RTC to GPS with 1PPS precision working. Here is an example log: 2026-02-17 12:15:50 -08:00
src Setting RTC to GPS with 1PPS precision working. Here is an example log: 2026-02-17 12:15:50 -08:00
platformio.ini Setting RTC to GPS with 1PPS precision working. Here is an example log: 2026-02-17 12:15:50 -08:00
README.md Setting RTC to GPS with 1PPS precision working. Here is an example log: 2026-02-17 12:15:50 -08:00

Exercise 11: Set RTC to GPS (1PPS Discipline)

This exercise extends Exercise 9 behavior (GPS + SD + OLED) and disciplines the onboard RTC from GPS UTC using the GPS 1PPS (pulse-per-second) timing signal.

Implemented behavior:

  1. Boots PMU, OLED, SD watcher, and GPS UART using the same T-Beam Supreme pin mapping from prior exercises.
  2. Parses NMEA (RMC, GGA, GSV) to track UTC validity and satellite counts.
  3. Every 1 minute, attempts to set RTC from GPS:
    • Uses latest valid GPS UTC.
    • Waits for next 1PPS rising edge.
    • Sets RTC to GPS time aligned to that edge (UTC + 1 second).
  4. Appends event records to SD file:
    • Path: /gps/discipline_rtc.log
    • Append-only writes (FILE_APPEND)
    • Format:
      • YYYYMMDD_HH24MISS_z\t set RTC to GPS using 1PPS pulse-per-second discipline\trtc-gps drift=+/-Ns
  5. OLED success message shows RTC disciplined confirmation and timestamp.
  6. If GPS time cannot be determined (or 1PPS edge is not seen in timeout), OLED shows failure status and the loop delays 30 seconds before retry.

Build

source /home/jlpoole/rnsenv/bin/activate
pio run -e node_a

Upload

source /home/jlpoole/rnsenv/bin/activate
pio run -e node_a -t upload --upload-port /dev/ttyACM0