My Custom GPS Clock
By: Bertrand Zauhar, VE2ZAZ
Last updated: 25/07/2011

For many years I had wished to get an accurate clock that I could trust, a clock that would set itself and always be on time. I own an "atomic" clock (WWVH-derived) but in Eastern-Canada we are a bit on the fringe in terms of WWVH radio reception, especially if the clock is located in the basement. I needed a better solution. So I decided to make my own accurate clock based on a plain vanilla GPS unit, which will always provide the right time. Nothing outstanding here, but the end result is quite satisfactory.

The intent I have with this page is to give you ideas on how to make your own accurate GPS clock, as opposed to giving you a spoon-fed recipe. Please contact me if you need more info.


Here is what I used to put it together:

  • A Garmin GPS-35 unit. Any GPS unit that sends NMEA data on its serial port and that provides a 1 PPS pulse will work fine here. I have located the GPS unit at the basement window. This seems good enough for this application.

  • Two Sure Electronics 32x8 3mm-LED displays (model DE-DP13112) mounted side-by-side. These can be bought at Sure Electronics or on eBay. The units can be daisy-chained to facilitate the cabling.


  • A PIC18F1220 micro-controller and MAX232 conversion chip. I mounted/wired both on an existing PCB designed for my "Rechargeable Battery Cycler" project.
  • A 5 Volt, 2 Amp power supply.
  • A rackmount enclosure recovered from an old Grass Valley audio distribution amplifier. I took everything out of the box and cut a rectangular opening with appropriate size to accomodate the displays. The parts are mounted inside using standoffs, angle brackets and tie wraps.
  • Some aluminium strip, nuts and bolts and several layers of red plastic cover film, the one used to cover paper documents... Get your imagination going here.

The following is a block diagram that shows how the devices are interconnected to create the GPS Clock.


Of course, the bulk of the work was to write the PIC firmware to decode the NMEA text strings and update the LED display accordingly. Here is the C source code I wrote:

The firmware triggers its display update with each pulse on the 1 PPS GPS output. Since the NMEA data comes in late compared to the 1PPS (it is sent during the current second), the PIC has to add one second to the previous second's NMEA data in order to display the accurate time as soon as the PPS pulse comes in. The firmware looks for the $GPRMC sentence. This sentence is normally enabled by default on most GPSs. I also disabled other sentences so that only that sentence gets sent; Less junk to filter out!

The display shows the pseudo-Julian date (ordinal date or day-of-year) and UTC time, like the real astronomical clocks. A second hand feature, a small walking dot at the bottom of the display, shows the progress into the current minute by propagating from left to right.


The following short video shows the clock working, with some CHU radio station audio in the background. Any delay seen between the display updates and the time ticks is a video capture artefact. Things line up perferctly in real life! Notice the walking second dot at the bottom of the display.