Monday, September 25, 2023

Solar shack battery monitor mark 2 - simpler is better

After the failure of my ESP32 web server to monitor battery voltage I reverted back to a simple system with an Arduino Nano reading analog voltage from a 5k-1k resistor divider to bring 15V down to 3V. Every second it takes a reading and sends on serial over USB to a Linux computer.

I love these little nano boards - very cheap and easy to use. The code is very simple, here's a screen shot from my favourite Arduino environment PlatformIO.

The battery (a 105Ah flooded lead acid battery charged from a 100W panel), is charged for some of the day and over night runs the computer and any radios I have on for WSPR. Here's a plot from 5pm until the next 5pm.

It's a deep cycle battery so I think there's a fair bit of voltage drop to go if required.

At the moment I'm taking a sample every second which is clearly way too much and rather hammers the spreadsheet. I'll back it off to every 10 minutes.

I mentioned that I like PlatformIO and one reason is that it's so fast compared to the Arduino IDEs. Here is a screen recording of building and uploading that little sketch above.

This is not sped up! The Arduino IDE v2 is better than v1 but still not a patch on Visual Studio Code with PlatformIO. There's more to set up and learn but it's worth it.

There is one complexity that needs to be solved. Reading ASCII voltage readings from the serial port and writing them to a file is more complex than it should be. I think the problem is that I'm using python 3 which defaults to unicode. I've got it working but it's more complex than it should be.

Writing serial data from Arduino to a file

I ran into a few puzzling issues getting this simple thing to work. Firstly, writing to the file is buffered quite a bit so nothing appears for some time. I thought it wasn't working. In the end I use this command to write the lines written by the voltage logger (now only once a minute) to a file with a prepended timestamp.

nohup tail -f /dev/ttyUSB0 | gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' > voltMinutes.txt&

The file looks like this:

2023-09-26 11:29:07 14.46

2023-09-26 11:29:57 14.40

2023-09-26 11:30:57 14.37

2023-09-26 11:31:57 14.51

2023-09-26 11:32:57 14.46

2023-09-26 11:33:57 14.54

2023-09-26 11:34:57 14.49

2023-09-26 11:35:56 14.46

2023-09-26 11:36:56 14.46

2023-09-26 11:37:56 14.49

2023-09-26 11:38:56 14.46

2023-09-26 11:39:56 14.29

2023-09-26 11:40:56 14.49

The nohup and ampersand mean that I can kick it off and disconnect from the terminal and it keeps going.

A problem with this simple approach is that Linux buffers the writes to the file so tailing the output file shows results from hours before. A possible solution I found is to install the expect package and then use the unbuffer command like this:

nohup tail -f /dev/ttyUSB0 | unbuffer -p gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' >> voltMinutes.txt &

This isn't quite working as I expect so I'll continue to search for the simplest and working solution.


Here's a neater solution. There's a ts (timestamp) command in the moreutils package. Install that and then:

ts </dev/ttyUSB0 >>received.log &

produces a file like this:

Sep 27 07:49:48 12.26

Sep 27 07:51:48 12.23

Sep 27 07:52:48 12.23

(There are time stamp format options).

Here's a Gnuplot showing several days. The last day has been very dark with lots of rain.


set terminal png size 800, 600
set title "Solar Battery Voltage"
set output "Volts.png"
set xlabel "DATE"
set ylabel "Volts"
set xdata time
# Sep 28 09:19:21
set timefmt "%b %d %H:%M:%S"
set xtics format "%d/%m %H"
set datafile separator ","
plot "volts.log" using 1:2 title 'Volts' with points smooth bezier

Here's the Arduino Nano code. (Note that I use PlatformIO these days). I found that if I sent serial with println() I get an extra timestamp line from ts so I manually add the \n.

#include <Arduino.h>

// divide the ADC by this to get volts (with my divider)
const float kVoltageFactor = 35.0;

void setup() {
// put your setup code here, to run once:
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
// analogReadResolution(10);

void loop() {
// put your main code here, to run repeatedly:
int pin = 0;
int voltageRaw = analogRead(pin);
float voltage = voltageRaw / kVoltageFactor;
String voltageString = String(",") + String(voltage) + String("\n");
// briefly flash the LED at each read
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(50); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(950); // wait for a second
//delay(1000UL * 59UL); // wait for a minute

Sunday, September 24, 2023

Solar shack battery monitor mark 1 - failed project

The radios in my shack are now powered by a 12V flooded deep cycle lead acid battery with 105Ah capacity charged from a 100W solar panel. So far all seems well. I'd like to know how low the voltage drops in the early morning so my project is a voltage monitor that can be logged to disk.

An ESP32 board with Wifi and an OLED screen was used. The analog input has a resolution of 12 bits. I grabbed bits of sample code from the ESP32 Arduino examples and created a tiny web server that registers itself on the network using multicast DNS so that a web browser can simply poll the ADC value.

The maximum that the analog input can take is 3.3V so I used a resistor divider with 5k and 1k to divide down up to 15V to something the input can handle.

A 7805 regulator was used to give 5V to power the board. All seemed well.

Unfortunately the Wifi is not strong in the shack and the ESP32, while it could see the network on a scan, could not connect.

As you can see from the photo above, I tried cutting the on-board antenna and attaching a wire antenna. I'm not sure that this improved things but in any case it didn't fix my problem.

Of course doing all this over Wifi with a web server is a rather complex arrangement so I have another, simpler plan under way. I'll post when it's been running long enough to draw a graph.

Wednesday, September 20, 2023

WSPR Watch version 4 is out

Timed to coincide with the release of iOS 17, WSPR Watch version 4 is now in the iOS App Store. It's a long overdue re-write of the app in the modern SwiftUI framework. The biggest change is on iPad which (I humbly think) looks great, particularly in dark mode:

There has been a bit of feedback about the changes and I'm working on a 4.1 release in the weeks ahead. My thanks, as always, to the dedicated testers and those that write in with suggestions and feedback.

Low cost Intel PC that runs on 12V battery

As part of my project to convert the shack to off-grid power I thought it might be good to replace the shack laptop (with its mains charger) with a low cost PC that Lindsay, VK3GX, brought to my attention.

The Beelink PC was on special on Amazon so I purchased one for AU$224.25

Others report that the discount varies. I did not choose to pay $30 more to get 16G RAM and 512G SSD.

The machine comes with Windows 11 and it was interesting to go through the Windows setup. They are up to their old tricks. A screen popped up saying that I would get Office 365 free for a year, but would need to give them my credit card. I declined. (Presumably they'll quietly bill people a year later when they've forgotten).

The first thing I did was go to install the Chrome browser. As soon as I went to the download page they tried to talk me out of that.

I'm not sure that my level of trust in Microsoft is a positive factor in choosing a browser.

Windows 11 looks beautiful, it's getting similar to macOS in many ways. I was struck that the application dock is now centred like on the Mac. The login screen on Windows looks like this:

macOS Sonoma looks very similar:

I tried to install Linux Mint Cinnamon in a dual boot configuration but for some reason this didn't work - perhaps some sort of secure boot restriction. In the end I gave up on Windows and wiped the disk to install Linux.

The machine is now running on the shack 12V battery and the x11vnc server means that I can control it remotely. Currently it's connected to a QDX for WSPR and makes a very small dent on the workbench.

There is no noticeable noise from this computer running on 12V DC.

I control the machine using the built-in VNC from macOS.

Works very well over the wifi network.

Sunday, September 17, 2023

Amazingly decodable spots from a QDX transmitter, displayed in WSPR Watch

During the beta phase of iOS 17, which will be released in a day or two, I've been working on a re-write of my iOS app "WSPR Watch" using Apple's fantastic SwiftUI framework. While the re-written app loses a few features of the old version, one big improvement is to how it appears on an iPad.

Highly successful WSPR receiver, Phil, VK7JJ now looks like this on the iPad:

(Click the image for an enlarged version). Now that my radio shack is battery powered (with solar charging), I thought it wise to run something that draws less current than an IC-7300 for full time WSPR operation so I set up the QDX. I think it's not quite as good a receiver as the Icom but there's no doubt that the clean signal it transmits is superior, at least in terms of the number of stations that decode my WSPR signals.

Operating on 20m, just now at dusk, my 4.7W transmission was reported by 168 stations which is pretty good given that I'm in country Victoria and not in the middle or Europe or whatever.

The new version of WSPR Watch is scheduled for release on 18 September, just after iOS 17. It is compatible with iOS 16 but I know there are some users who won't be able to update as they run older devices. They can keep running the old version but I must move on and adopt new technology.

Wednesday, September 13, 2023

Shack is off-grid again

Visiting the emergency communications exercise a few weeks ago inspired me to make sure my radio shack can operate without mains power if required. This could be important if this summer is a fire season as seems possible.

I had a folding solar panel claimed to generate 100W from the old days of my camper van.

For now it's on the ground but I may put it on the roof at a later date for more sun during the day.

I purchased a 105Ah flooded lead acid deep cycle battery for $249. As it's just sitting on the floor weight isn't a problem. 

A cheap Chinese PWM charger got me started and worked fine but I ordered a more efficient MPPT charger made by Renogy. It seemed to work well...

Unfortunately it generates a lot of radio noise. Even up on 20m it leaves bands of noise all over the dial.

The cheap Chinese PWM charger doesn't produce any noticeable noise. (You can see it mounted on the wall with the blue face plate above).

To be fair, my noise floor here is very low and I haven't tried to suppress the noise from the Renogy unit at all so far. It is disappointing though.

I powered my IC-7300 all night receiving WSPR last night and the battery was down to 12.3V in the morning. It is good to know that I can make radio contact after a long term power outage if required. It is a very useful feature of an Amateur radio station.

Monday, September 11, 2023

Shepparton HamFest was excellent

On Sunday I drove two hours to get to the Shepparton Hamfest. A little tiring but an excellent show that was both well attended and had lots to see and possibly buy.

VK3ZYZ had a display of his Arduino based VFOs which he sells as kits but also has built into radios including Codans and even an IC-22 (that brought back fond memories).

There's information and source code available via the SADARC website projects page. The club also has excellent forums with more discussion and information.

I came away with just a few parts including these nice honeycomb trimmer capacitors. 

It was great to catch up with radio friends including VK3EB, VK3ASE, VK3NE and VK3CCR (the last two from the Macedon Ranges Amateur Radio Club). Warm congratulations to the Shepparton organisers for a fantastic day.