(Perhaps this post should be called “Debugging with a scope, revisited” …)
The syncRecv.ino sketch developed over the last few days is shaping up nicely. I’ve been testing it with the homePower transmitter, which periodically sends out electricity measurements over wireless.
Packets are sent out every 3 seconds, except when there have been no new pulses from any of the three 2000 pulse/kWh counters I’m using. So normally, a packet is expected once every second, but at night when power consumption drops to around 100 Watt, only every third or fourth measurement will actually lead to a transmission.
The logic I’m using was specifically chosen to deal with this particular case, and the result is a pretty simple sketch (under 200 LOC) which seems to work out surprisingly well.
How well? Time to fire up that oscilloscope again:
This is a current measurement, collected over about half an hour, i.e. over 500 reception attempts. The screen was set in 10s trace persistence mode (with “false colors” and “background” enabled to highlight the most recent traces and keep showing each one, so all the triggers are superimposed on one another.
These samples were taken with about 300 W consumption (i.e. 600 pulses per hour, one per 6s on average), so the transmitter was indeed skipping packets fairly regularly.
Here’s a typical single trigger, giving a bit more detail for one reception:
Lots of things one can deduce from these images:
- the mid-level current consumption is ≈ 8 mA, that’s the ATmega running
- the high-level current increases by another 11 mA for the RFM12B radio
- almost all receptions are within 8..12 ms
- most missing packets cause the receiver to stay on for up to some 18 ms
- on a few occasions, the reception window is doubled
- when that happens, the receiver can be on, but still no more than 40 ms
- the 5 ms after proper reception are used to send out info over serial
- the ATmega is on for less than 20 ms most of the time (and never over 50 ms)
- it looks like the longer receptions happened no more than 5 times
If you ignore the outliers, you can see that the receiver stays on well under 15 ms on average, and the ATmega well under 20 ms.
This translates to a 0.5% duty cycle with 3s transmissions, or a 200-fold reduction in power over leaving the ATmega and RFM12B on all the time. To put that in perspective: on average, this setup will draw about 0.1 mA (instead of 20 mA), while still receiving those packets coming in every 3 seconds or so. Not bad, eh?
There’s always room for improvement: the ATmega could be put to sleep while the radio is receiving (it’s going to be idling most of that time anyway). And of course the serial port debugging output should be turned off for real use. Such optimisations might halve the remaining power consumption – diminishing returns, clearly!
But hey, enough is enough. I’m going to integrate this mechanism into the homeGraph.ino sketch – and expect to achieve at least 3 months of run time on 3x AA (i.e. an average current consumption of under 1 mA total, including the GLCD).
Plenty for me – better than both my wireless keyboard and mouse, in fact.