I am having trouble getting this to work, while it sleeps for the watchdog time of 8s, it doesn't stay asleep. If anyone can help I would be very grateful.
Here is my simplified code:
#include "SD.h"
#include <Wire.h>
#include "RTClib.h"
#include "DHT.h"
#include <avr/sleep.h>
#include <avr/wdt.h>
const int StepTime = 60000;
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
RTC_DS1307 RTC;
DateTime now;
uint32_t NextTime;
uint32_t NowTime;
uint32_t RemainingTime;
int SleepTimeIndex;
float SleepTime;
volatile boolean f_wdt=1;
// Watchdog Interrupt Service / is executed when watchdog timed out
ISR(WDT_vect) {
f_wdt=1; // set global flag
}
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) {
byte bb;
int ww;
if (ii > 9 ) ii=9;
bb=ii & 7;
if (ii > 7) bb|= (1<<5);
bb|= (1<<WDCE);
ww=bb;
MCUSR &= ~(1<<WDRF);
// start timed sequence
WDTCSR |= (1<<WDCE) | (1<<WDE);
// set new watchdog timeout value
WDTCSR = bb;
WDTCSR |= _BV(WDIE);
}
void system_sleep() {
cbi(ADCSRA,ADEN); // switch Analog to Digitalconverter OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable();
sleep_mode(); // System sleeps here
sleep_disable(); // System continues execution here when watchdog timed out
sbi(ADCSRA,ADEN); // switch Analog to Digitalconverter ON
}
void setup(void)
{
Serial.begin(9600);
Serial.println();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
now = RTC.now();
NowTime = now.unixtime();
NextTime = NowTime + StepTime;
cbi( SMCR,SE ); // sleep enable, power down mode
cbi( SMCR,SM0 ); // power down mode
sbi( SMCR,SM1 ); // power down mode
cbi( SMCR,SM2 ); // power down mode
setup_watchdog(9);
\\other setup omitted
}
void loop(){
now = RTC.now();
NowTime = now.unixtime();
if (NextTime > NowTime)
{
system_sleep();
}
else
{
if (f_wdt==1) // wait for timed out watchdog
f_wdt=0;
\\sensing /logging code here
logfile.flush();
NextTime = NowTime + StepTime;
delay (1000);
system_sleep();
}
}