Good, but not perfect… I was curious about the actual current consumption of this latest version of the homeGraph.ino sketch. So here’s another timing snapshot:
This has trace persistence turned on, collecting multiple samples in one screen shot.
As you can see, the radio is turned on for ≈ 75 ms in this case (different JeeNode, slightly different watchdog timer period). Then after 30..35 ms the sketch goes to sleep again.
The second case is when nothing has been received after 150 ms: the “radioTimer” fires, and in this case the sketch turns off the radio as well, assuming there will be no packet coming in anymore.
But the interesting bit starts on the next packet coming in after one has been omitted. The logic in the code is such that the radio will be left on indefinitely in this case. As you can see, every late arrival then comes 100 ms later than expected: same radio-off + power down signature on the right-hand side of the screen capture, just much later.
Here is the code again:
And the main loop which calls this code:
That “if (!timingWasGood) …” code is probably wrong.
But it’s not so easy to fix, I’m afraid. Because the timing gets even more tricky if two or more packets are omitted, not just occasionally a single one. Sometimes, the radio doesn’t get switched off quickly – as you can see in this 30-minute capture at the end of the day, when power levels are starting to drop:
Maybe I need to try out a software PLL implementation after all. The other reason is that there seems to be a fair amount of variation in watchdog clock timing between different ATmega’s. For one, I had to use 2800 as value for recvOffTime, with another 3000 worked a lot better. A self-locking algorithm would solve this, and would let us predict the next packet time with even more accuracy.
But this is still good enough for now. Normally the radio will only be on for about 100 ms every 3s, so that’s a 30-fold power reduction, or about 0.6 mA on average for the radio.
This still ought to run for a month or two on a 3x AA battery pack, at least for daytime use. Which brings up another idea: turn the whole thing off when it’s dark – the display is not readable without light anyway.
Oh well. Perfection is the enemy of done.
Would it be easier try to improve the time source then (like RTC)? If the clocks are in sync, you do not need to wait that long (150ms)
I really like the self-synchronisation idea using such simple means.
PS: Question about more precise RTC (DS3231) in comment over: https://jeelabs.org/2012/10/28/its-all-about-timing-part-2/
Idea of calibration procedure: http://forum.jeelabs.net/node/1475
What about having a transaction identification. The receiver tells the sender the last id received and the sender keeps sending all transactions from the last id confirmation onwards.
Then you’ll “pollute” all bandwidth… And while keeping rx on for a shorter time, you’ll have to enable tx (considering collisions & so on in an environment where the transmitter could not be able to receive the same data the receiver is receiving –what a mess– is not so easy, and ould require using much more power than just listening for more time). The beautiful thing about the current design is its broadcast nature: having a single display, or none, or one every room doesn’t make a difference for the sender. Multicast vs unicast.