20 meters, 200mW & 12,000 miles: WSPR magic!

Weak Signal Propagation Reporter is a global radio propagation monitoring and reporting network comprised of thousands of low power beacons operating on the amateur radio bands. WSPR beacons can be detected from the lowest of Medium Wave frequencies (137kHz) all the way through the HF spectrum (all the bands from 160m to 10m are popular) to the VHF bands, 50 and 144MHz. WSPR receivers decode the tiny beacon packets and upload them to a central database, at WSPRNet.org, where anyone can literally ‘see’ the propagation paths that are currently open.

Equally, you can go back and revisit the radio frequency propagation conditions during any previous time window. Running a WSPR beacon from your home allows you to ‘watch’ the propagation paths open, peak, and close each day under the influences of solar radiation, sunspots, and other ionospheric conditions. Arduinos and a few common accessory boards that can be had for tens of dollars make a beacon accessible to just about any experimenter (with an amateur radio license).

WSPR beacon in an Arduino Uno prototype case.

I’m late to the WSPR party. I’ve wanted to try a beacon project for a few years. A while back, I took a copy of the ZachTeck script and experimented with it and a Ublox GPS, but after getting the NMEA strings decoded from the GPS unit at roughly one second intervals, the rest of my code was over-engineered and bloated, and did not fit into the small memory constraints of the Arduino Nano. I put is aside.

Recently, I did a much needed upgrade to my Arduino IDE and libraries. The thought occurred to me that improvements to both IDE and libraries may give me a fighting chance of getting that old WSPR script fitting. When I opened it up, and started to work through it, I saw some obvious ways of reducing memory usage. I had too many String objects (memory-hungry). And my code was writrten to parse each NMEA message string and tokenise it. This allowed me to get to discrete data fields a long way down the messages, like the number of detected satellites. In a simple WSPR beacon, all you really need is the UTC timestamp at the very start of a number of the NMEA messages. I ditched the superfluous stuff and got it uploading, and more to the point, not hanging!

WSPR dataset applications

WSPR is brilliant for teaching you about rare and exotic places that you feel compelled to Google when they turn up on your map in the morning, places like Orlygshafnarvegur (TF4AH, Iceland) or Fuerteventura (EA8BFK on the Canary Islands).

The database of historical propagation across the HF spectrum is widely used by amateur researchers to learn about propagation and has some more serious applications as well. Experimenters have used the data to support ideas or research questions about how symmetrical propagation is at opposite sides of the globe in the same period, and to test antennas. More seriously, a theory was proposed that impressions in the WSPR dataset may indicate the path of the lost flight, Malaysian Airlines flight MH370.


The script is here: https://github.com/prt459/WSPR_GPS_Beacon


The schematic is so simple it really doesn’t need a kicad. The Ublox 6M GPS connects to Arduino D2 and D3 for serial data transfer. It also needs GND and +5V. The si5351 breakout board uses I2C and so goes to Arduino A4 (SDA) and A5 (SCK). Connect the si5351’s CLK0 to whatever low power HF amp you like. Mine is from Experimental Methods in RF Design (EMRFD), Fig 12.32, but I could have chosen any number of similar two-transistor stages.

WSPR works on truly tiny power levels. If you connect the bare si5351 clock output to an antenna, you will get decodes! (You should add a Low Pass Filter if this is anything more than a quick test). So use a single 2N3904, or anything with gain, up to a full 5 watt QRP PA with an IRF510 or Mitsubishi RF FET, which is a ‘big gun’ in the WSPR world. Mine uses a 2N3904 and 2N4427 in common emitter feedback configuration, delivering around 10 volts peak to peak into 50 ohms, followed by a W3NQN Low Pass Filter for the band of interest.

200mW QRP PA.


20 meter European WSPR decodes from the beacon in Melbourne Australia. 12,000 miles on 200milliWatts!
More European decodes, and a spot from Auld Blighty!
And a decode in the USA in the same timeslot, about an hour before sunset.


Thanks to Harry from ZachTek for making his code open source. And to Jason Milldrum NT7s for his si5351 and JTEncode libraries.

Tagged , , , , , , ,

18 thoughts on “20 meters, 200mW & 12,000 miles: WSPR magic!

  1. Andrew VK1DA says:

    Great job with the WSPR tx. I’ve used WSPR a few times, usually at about 1w or 2.5w from the 817. But I prefer to use my antenna for making other types of contacts. I am very dubious about the proposal that a tiny plane at 12 km above ground level will make any detectable dent in the signal strength of a dx WSPR signal on HF, that is mainly reflected by a relatively huge ionospheric layer at 120-150km agl. In addition to the level of reflection or interruption of an HF signal, there is the problem that WSPR logs signals over a 110 second integration time, recording only one signal level for the entire reception period. Studying WSPR logs from a typical HF transmission shows signal levels varying over sometimes more than 10 db in successive time periods, so to my mind it is not even valid to use WSPR signal levels over dx paths to make antenna comparisons, unless simultaneous transmissions and common receiving sites were used. Successive transmissions within 2 to 10 minutes vary so much on a single antenna that any meaning attributed to signal differences is unfortunately, illusory, IMO. 73 Andrew vk1da


    • Paul Taylor says:

      G’day Andrew. Thanks for commenting. I think I read somewhere the same scepticism re use of WSPR data to track an aircraft. Just way too many unrelated variables. We can dig into the analysis piece on the linked site if we wish, I note the WSPR data is correlated with other data to some claimed utility.
      The spots I’ve been getting on 0.2W 20m WSPR hint at improving propagation. It bodes well for /P CW DX on 20m!
      Cheers Paul VK3HN.


  2. Andrew VK1AD says:

    I’m operating WSPR on 30m @200mW. Getting EU decodes during the last 90 min before VK east coast sunset. Good sign for late afternoon SOTA activations during grey line propagation.

    Liked by 1 person

    • Paul Taylor says:

      Gday Andrew, thanks for that report. Similar to my experience on 20m over the past week for the same power level, 5.30pm DST for about an hour for EU. Its impressive the way they just suddenly appear within minutes. USA west coast around sunset to 8pm. As you say, a good sign!


  3. Loren Moline says:

    Paul, I can not get your sketch to compile.


  4. Steve Kaatz says:

    Hi Paul, thanks for posting this and the video. Great work. I’ve been tiptoeing up to building a WSPR beacon and have been looking at the project in the Jan 2022 QST, or duplicating the project by Harry from Zachtech. Your simplification is exactly what I want to do with it!. So far I’ve played around quite a bit with a 5351 breakout board and am bedeviled by a problem with mains frequency and 1st harmonic on the SI 5351 output. But I have a question which is how do you tune or correct inaccuracies in the Si5351? I have 2 units and they’re both slightly off frequency. I suppose any offset could be hard coded in each band frequency setting, but I’m wondering if there is a way to set it universally? Thanks again & best 73’s. Steve K8SDK


    • Paul Taylor says:

      Hi Steve, thanks for your comment.
      A WSPR beacon can be quite simple. You don’t even need the GPS unit, you can manually synchronise a software clock, but I want to just turn it on and let it work. The uBlox GPS receiver is cheap, connects with 4 wires and automates the transmission timing.
      I have never had si5351 problems related to mains frequency. However, every one of these si5351 breakout boards comes up on a slightly different frequency. You need to do a one-time calibration, which will deliver you the calibration offset to be passed into:

      si5351.set_correction(19100, SI5351_PLL_INPUT_XO);

      In this case, the 19100 is a fixed offset that you determine by running a calibration script, which you should find in the src/ dir of your installed si5351 library. Load this script and run it, it will generate 10MHz. Measure this on a reliable oscilloscope or frequency counter. Then use the console to key in menu options to shift the offset, which will shift the 10MHz clock#0 output. Keep doing this until you get as close as you can to spot on 10MHz. You should then be able to read off the numeric offset number. It will most likely be in the 15000 to 30000 range. Put this value into the si5351.set_correction(,offset>, SI5351_PLL_INPUT_XO) call. This will usnure your si5351 clocks are all on the mark. Read up on the calibration approach for your particular library. I use the one by Jason NT7S.
      Good luck with your beacon project, let me know here if you get it working, or, have problems with my script.
      73 Paul VK3HN.

      Liked by 1 person

      • Anonymous says:

        Hi Paul, I had to set the project aside for a while but your script works really well now. I’m using a very simple PA with 3 MOSFETs, getting about a watt out on 20M. I added a line to your script to increase the Si5351 output level, which helps drive my amp. Thanks again and best 73’s Steve

        Liked by 1 person

      • Steve says:

        Hi Paul, I had to set the project aside for a while but your script works really well now. I’m using a very simple PA with 3 MOSFETs, getting about a watt out on 20M. I added a line to your script to increase the Si5351 output level, which helps drive my amp. Thanks again and best 73’s Steve

        Liked by 1 person

  5. Ian McCrum says:

    Hi Paul, I just put your circuit through LTSpice, I wonder if there should be a 2k2 resistor across the capacitor that goes from the stage 1’s transformer and the base of the second transistor. Wes has one in EMRFD, Fig 12.32. I get more output with it in.

    I just read your article in SPRAT, inspiring, thank you.
    Best regards, Ian MI5AFL.


    • Paul Taylor says:

      Hi Ian, thanks for your comments. That’s interesting, I’m on my way to work now but will check EMRFD when I can. I don’t normally parallel inter-stage coupling capacitors with a resistor, and I did not notice it on the original schematic. But if Wes did it, it must be right! The capacitive reactance of the coupling capacitor at HF is small, so the resistor must be contributing to the second stage’s DC base biasing. I wonder if Wes mentions it in the text.
      How much power change do you see in your LTSpice model with it in? Might be time to build it and see 🤔?
      73 Paul VK3HN.


      • Ian McCrum says:

        I get 360mW across a 50 Ohm load on the output with a 2k2 across the inter-stage cap and almost nothing without it – using a 224mV square wave input with a series resistance of 50 Ohms (1mW). The standing current is 30+mA and the standing dissipation in Q2 about a third of a watt. I initially put a 1k2 from the second base to its collector (across the AC feedback RC) which also gave an output but I then checked EMRFD and removed it and used the 2k2. Now, I know little about designing Class-C amplifiers and I am in a little doubt as to an Si5351’s output impedance. Since you are driving the amp with a single frequency (albeit a squarewave) I suppose the filter removes all distortion and you can overdrive the second stage. I have used LTSpice a lot but you’re right, I should build it. The map is not the territory.


  6. Anonymous says:

    I just read your article on SPRAT thanks.


  7. Ian says:

    As regards LTspice simulations and whether or not a 2k2 resistor is needed across the interstage capacitor (as per Wes’s original fig 12.32 in EMRFD). You do NOT need the resistor if the input is above half a volt. This is enough to have the output stage conduct and generate power. At 300mV pk input you get 375mW output with the 2k2 and less than 200mW without it. If the input is strong enough then the output is high and the overall DC power consumption is lower. I must learn more about class C, or at least non class A amplifiers…


    • Paul Taylor says:

      Thanks for your detailed analysis Ian. My amplifier is driven directly from an si5351 clock. I have observed the amplitude of such clocks to vary quite a bit, with load, and frequency. Without scoping it, which i will do when I can, I suspect my clock’ s drive is 3 to 500mV peak, as I excluded the 2k2 resistor, and measured around 200mW at the dummy load and antenna. I’ll add in the 2k2 and report the improvement. Best regards, Paul VK3HN.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Shack of VK2KMI

Ham Radio Blog of VK2KMI

Ham Historian

A passionate amateur looks at Melbourne history


My journey of repairing and recycling anything I put my hands on that I believe is still useful. Not just hardware, but including software with relevant content and issues in the field of Cyber Security, Vulnerability Scanning and Penetration Testing.

G4YDM Ham-Radio and SWL news

Radio craft, homebrew, QRP/SOTA, AM


Amateur radio experiences with VK1DA

Tj Lab


The Microscopic New Yankee Make Shop

Bits of technology and illogic by WA2MZE

Paul Gacek


NewURL: https://dk7ih.de

This blog is no longer in use!

%d bloggers like this: