I have an RFM69 connected to an 8Mhz 328 all working fine on 3.3v, RFM69.h library. The RFM69 receives a pulse every 30seconds from a master clock and this pulse is used a reference sync pulse for driving a wall clock.
This is to be a battery application so leaving the RFM69 in Rx mode whilst sleeping is taking too much current.
What I would like to do is turn off the RFM69 for say 28seconds, wake it up and wait for the pulse to come in , then sleep again for the next 28seconds until its time to seek the next pulse. I'm happy sleeping the 328 processor but...
I cant find anything other than sleeping transmitters or sleeping receivers left in Rx mode. Anyideas ?
Basic Rx code below for info:
//RFM69_lopower 328 pulse rcv v0.2
//sleep to be added
// references:
// Uses the RFM69 library by Felix Rusu, LowPowerLab.com
// Original library: https://www.github.com/lowpowerlab/rfm69
// SparkFun repository: https://github.com/sparkfun/RFM69HCW_Breakout
#include <RFM69.h>
#include <SPI.h>
#include <Wire.h>
// Addresses for this node.
#define NETWORKID 0
#define MYNODEID 5 // My node ID
#define TONODEID 1 // Destination node ID (pulse transmitter)
#define FREQUENCY RF69_915MHZ
// AES encryption (or not):
#define ENCRYPT true // Set to "true" to use encryption
#define ENCRYPTKEY "TOPSECRETPASSWRD" // Use the same 16-byte key on all nodes
// Use ACKnowledge when sending messages (or not):
#define USEACK true // Request ACKs or not
// Packet sent/received indicator LED (optional):
#define LED A5 // LED pin
// Create a library object for our RFM69HCW module:
RFM69 radio;
//******************************************
void setup()
{
// Set up the indicator LED
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW); //test it
delay(800);
digitalWrite(LED, HIGH);
// Initialize the RFM69HCW:
radio.initialize(FREQUENCY, MYNODEID, NETWORKID);
// Turn on encryption
if (ENCRYPT)
radio.encrypt(ENCRYPTKEY);
}//*****************************************
void Blink(byte PIN, int DELAY_MS)
//Blink an LED for a given number of ms
{
digitalWrite(PIN, LOW);
delay(DELAY_MS);
digitalWrite(PIN, HIGH);
}
//******************************************
void loop()
{
// see if it has received any packets:
if (radio.receiveDone()) // Got one!
{
if (radio.DATA[1] == 80) //P pulse rec'd
{
Blink(LED, 300);
radio.DATA[0] = 0;// clear out buffer (dunno if needed)
radio.DATA[1] = 0;
radio.DATA[2] = 0;
}
if (radio.ACKRequested())
{
radio.sendACK();
}
//Sleepy(); **put stuff to sleep**
}
}
I think the issue with this is you leave in RX mode , which still takes current, and allows wake up from sleep on receiving a packet ??? Putting completely to sleep ( like you can do in TX mode? ) And waking up again under software control is what I need ( can this be done by say by toggling reset ?) to really get the current consumption really low .
This is the bit I’m unsure about and need some advice
Turning off via a transistor is an option .. anyone done it ?
Well , here is the Code I've tried and it works -no need to wake up the RFM69 seperately with initialize command ... .
when sleeping I have around 12micro amps @3.3v.
it takes current during the while loop each time it wakes, but my meter can't see it.
( havent checked if my RFM69 has flash on it yet)
thx srnet .
might be better with the radio sleep inside the loop
void Sleepy()
{
// here after a pulse has been rec'd and sleep until next is due.
//pulses are every 30sec, sleep for 28sec.
// sleep the 328, the radio , and flash memory on the radio chip (if fitted)
int X=0;
radio.sleep();
// Enter power down state 328 for 8 s with ADC and BOD module disabled
while(X <6)
{
LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF);
X++;
}
}
Edit: spoke to soon - doesn't like that statement Radio stops working after the first run through this loop
void Sleepy()
{
// here after a pulse has been rec'd and sleep until next is due.
//pulses are every 30sec, sleep for 28sec.
// sleep the 328, the radio , and eeprom on the radio chip (if fitted)
int X = 0;
//radio.sleep();
// Enter power down state 328 for 8 s with ADC and BOD module disabled
while (X < 6)
{
radio.sleep();
LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF);
X++;
}
radio.initialize(FREQUENCY, MYNODEID, NETWORKID);
}