Decoding time

     Faux WWVB
: The waterfall image was captured around mid-morning of the summer solstice, at a distance of more than 1500 miles from WWVB. Not a bad signal! The reason is that the signal is not WWVB. It is Faux WWVB, a milliwatt transmitter that encodes GPS time to simulate WWVB.1 The transmitter has no antenna, so Faux WWVB cannot be heard in the next room. However, when a receive antenna wire from the SDR is draped over or alongside the transmitter, the signal is strong enough to decode time
and other data by eye, as annotated above.

Pictorial diagram

The thought that led to this project was a question. I had wondered whether the tone() function, which is part of Arduino core, could produce frequencies above the human hearing range—up to about 20 KHz for young people. The answer is that it can. The transmitter consists of a single program command: tone(TONE_PIN, FREQ_HZ). As the pictorial diagram shows, the microcontroller is a Teensy 3.5. However, I believe that an Arduino Uno would work the same. Replace hardware serial with software serial for connection to the GPS, and modify the sketch accordingly.

Filter components calculation    The microcontroller PWM pin output is a square-wave. To obtain a sine wave I added a filter. The calculator at was used to compute and select RC values. Except for these component values the circuit is the same as this one. The filter also attenuates the wave, reducing the 5 volt P-P input to a few hundred millivolts. Filtered output makes a nice display on the oscilloscope screen, but may or may not affect the circuit’s functioning in the application context.
Amplifier breadboard
     For the image at the top of this page, the SDR’s antenna wire (short length of insulated hookup wire) was draped over the filter. In tests of setting a radio clock, the clock’s ferrite loop antenna was placed on the filter side of the transmitter at no more than about 10 cm. distance. Neither antenna would pick up the signal if moved one meter away from the source. Out of curiosity I coupled the output of the filter to an LM386N-4 and with that boost (approximately 15 mW) the signal could be received a few meters away. For this test the amplifier (photo right) had no antenna, just a 20 ohm resistor (dummy load).

Transmitter and Radio Clock

    A couple of years ago I described a WWVB radio clock based on this receiver module and an Arduino Nano. Since then I have experimented with variants of the original project including integration with a DS3231 real time clock, substituting an Arduino Uno for the Nano, using a different WWVB receiver,  and adding an LCD or OLED display. The OLED screen in the photo above records a sync with the Faux WWVB transmitter signal at 9:23 AM EDT on Jun 23, 2020. (From then to the displayed time the Arduino was disconnected from the receiver.) The clock program has been modified so that these faux syncs are not saved to EEPROM. On recycling power, the OLED displays the last real WWVB sync, but that is unimportant. The fact is that GPS time is indistinguishable to casual observation from WWVB time or NTP (computer) time. Various official time sources are within a second of one-another.  All data displayed on the OLED screen
are computed in the transmitter sketch (day of week, day number, DST, etc.) except UT1, which was entered as a constant. As far as I know the only way to obtain the current UT1 value is from WWVB. If there is a service for this datum I’d like to know about it.

Time Code Format

     Gating the carrier: WWVB distinguishes so-called ‘weighted’ and ‘unweighted’ code digits (1’s and 0’s) by reducing the carrier to 20% of full value and restoring it to full strength after a code-specific interval, 0.5 second for weighted and 0.2 second for unweighted.2 Instead of reducing the carrier, the faux transmitter keys the carrier either completely on or completely off, i.e. tone or no tone. —I did also experiment with leaving it on continuously and gating it. Doing that produces bright blips on a dimmer line in the SDR waterfall. This dim line must represent the ungated square wave, which is still generated, but not passed through to the filter. The salience of blips (or signal-to-noise ratio) depends somewhat on antenna placement when gating the carrier. A Boolean constant PTT_MODE near the top of the sketch enables or disables the gating experiment. However, this method did not work as well as the carrier on-off method (fewer syncs or longer time to sync).

MFJ watch time and NTP

     Success and failure: The WWVB radio clock syncs to the Faux WWVB transmitter within a couple of minutes. I have tested two receiver chips, the SYM-RFT-60 and the Canaduino module from Universal Solder. Both work. However, I have not been able to set my MFJ watch with the simulator. At first I thought the watch was 5 seconds slow, as is shown in the comparison above. However, the problem was not that the watch was slow, rather the second hand was misaligned. I should have read the instruction leaflet!

MFJ watch status check

    On carrying out the status check procedure described above, the second hand always pauses at 11 o’clock, not 12 o’clock, and never at 6 o’clock. My interpretation is that reception was successful (whatever that means) but the second hand is not aligned properly. That is where I hit an impasse. Another instruction explains how to re-align a misaligned second hand. I carried out the ‘Synchronize Watch Hands’ procedure several times, but no matter what, the second hand always went back to 11 o
’clock. Either the instructions are wrong or I am wrong—or the watch is broken. Annoying though it is I will have to be content with mentally adding 5 seconds to MFJ watch time.

Demo video: Faux WWVB


Projects Home

1. The idea of using a very low-powered transmitter to simulate WWVB and set a radio clock or watch is not new. See, for example, this attractive project: or this ATTiny85 project that is similar to mine:

2. The 'WWVB Time Code Format' illlustration is reproduced from NIST Special Publication 432, 2002 Edition (page 19).

Project descriptions on this page are intended for entertainment only. The author makes no claim as to the accuracy or completeness of the information presented. In no event will the author be liable for any damages, lost effort, inability to carry out a similar project, or to reproduce a claimed result, or anything else relating to a decision to use the information on this page.