Monday, July 24, 2017
A GPS adjusted clock
We recently got a new cable box. The new box has a clock that is a little smaller than the old one, and my wife has a hard time seeing it. We had an LCD clock with huge letters but there just isn't enough light in the place we want it.
So, NE06 GPS modules are getting pretty cheap. Why not get some huge seven segment LEDs and build up a clock based on a GPS? Turns out large LED displays are fairly hard to come by, and pretty expensive. Plus, all that wiring to all those pins is a pain.
Then it hit me: I have some TFT displays, not huge, but plenty adequate for inch or inch and a half high digits. If I used the TFT, I wouldn't even have to build the board; I could use my serial graphics terminal board.
First step was to see if I could make huge letters without too much hassle (the largest font I have is only about 3/8" high). The first whack isn't too bad. It will work, although I might yet do some prettying up of the font.
So, on to the GPS.
I started with my serial terminal code, which may have added more complexity than I needed, but it works. This code fills a circular buffer with serial interrupts from the GPS and the mainline has to process the contents of the buffer. This makes missing characters less likely but it does mean the mainline is futzing with trying to understand whether there are characters in the buffer and identify the start and end of the GPS data.
Parsing the GPS data is tedious, but not especially difficult. With the PIC32MX150F128B there is plenty of memory, so I can be pretty aggressive with my code. Most of the code is the TFT library so the stuff I'm working on is pretty small anyway.
At this point I can get the time and coordinates (which I don't need). I am displaying all sorts of values which eventually won't be used.
Next up is to get the date, and go through the tedious business of determining whether it is daylight savings or standard time. The correction is trivial but knowing when to apply it is a pain.
Following that I'll get after the PIC's real time clock calendar. Supposedly the PIC can maintain the time to within a third of a second per month. I'm not convinced can actually accomplish that, but adjusting it from time to time through the GPS should keep the time always correct.
Since even in the basement with overcast skies I can still see 8 to 11 satellites that might be overkill. If I have too much trouble with the RTCC I might just skip that, but the next priority is the daylight savings time thing.
The code is currently partial, and pretty rough, but as always I keep everything in git and the current code is in gitlab:
The board hardware is at
And the TFT library code at
They will be updated as time goes on.
OK, so some code cleanup, and slightly larger digits, but still significant work to do:
The digits are actually a tan color, but it doesn't show in the picture.