Friday, 22 July 2016

Arduino GPS master clock with 433/315 MHz transmitter

I've got a few clock projects in the back of my mind, and this is a bit of an aside to them all. I also wish to upgrade the Astronomical clock project, as the DS1307 often drifts about, losing and gaining seconds as it feel like it...

The idea is to have a master clock, GPS locked with built in 433 MHz transmitter, which will send an accurate time signal to the other clocks to bring them into sync. The transmitter will be triggered randomly, at least once every 24 hours, or by a push button connected to pin 12.

I'll be re-using the code from the quick and dirty 7-segment GPS clock here, and some of the code for the transmit function from the dehumidifier project.

I've added a 4x20 LCD display, with I2C piggyback interface board, and the u-blox GPS module we've used in the GPS logger.

The GPS module will be configured by the sketch itself, to 200mS refresh rate.

There's two sketches, the GPS clock itself, and a simple test receiver sketch to check everything's working as it should.

The I2C display is a generic display, purchased from eBay, and uses the PCF8574 I2C receiver IC. I tried a couple of different libraries, but eventually settled with the library from which works well with my display.
Well also use the virtual wire library to handle our comms, and the most excellent TinyGPS++

There's an LED connected to pin 9, which blinks on and off every time the seconds are updated.

Here's the schematic...

... and the hardware lashed up for testing.

The second arduino is acting as our test receiver. There's no RF module in there as yet.. It's coupled to the clock arduino, GND is coupled, and pin 10 on the clock is connected to pin 9 on the receiver board. It's also supplying 5V to the other board.

Here's the data being displayed. Date (in UK format DD/MM/YYYY) , UTC time, latitude, longitude, no of satellites in use, horizontal dilution of precision and the number of seconds until the next transmission.

Here's the output from our terminal window, connected to the receiver board, showing the time and date are being correctly received when A3 is pulled to ground.

So, the final build looks like this...

You can see the antenna is simply a straight piece of wire, 173mm long (for 433 MHz modules, other frequencies will need a different length)

And assembled. Managed to cut the right sized hole for the display for once!

Here's the GPS receiver, which I'm going to mount remotely on the roof, so it get's good reception. I've stuck it into of a water-proof IP rated box, and fitted a Buccaneer connector.

OK, so to the code....

This is the transmitter code:

and the test receiver code...

Now all that remains is to box it up, and create some clocks!


  1. I do not understand, are they two codes? I would like the code for the clock; Sorry and thank you

    1. The first code is for the clock. The second code is for the remote receiver. You only need the second if you wish to build a clock project that you need to synchronise with the master clock , such as

    2. Ok Andy! Thank you very much

    3. Hi Andy, if i wanted to transmit the gps longitude and latitude data to the receiver every 1 second, how would i restructure the code?

  2. Hi Andy, If i wanted to transmit the GPS longitude and latitude co-ordinates to the receiver every 1 second, how would i restructure the code?

    1. Add a latitude and longitude variable to the struct, and update those variables from the TinyGPS++ library. I may do this as part of a forthcoming project...