Hi,
We have a project where we want to measure something for a few minutes per day and save as much power as possible. I'm trying to get the 'nightingale' code to work on my Mega2560 and I think it's supposed to execute the main code, then sleep for 7 seconds, then execute the main code, then sleep, etc. It isn't sleeping and some of the output on the console is gibberish. I'm using the default bootloader and I think that now supports the watchdog out of the box, but I've there are a lot of older forum posts and I'm not really sure. I'm very new to Arduino programming, and only kind of know what I'm doing. Here is the code and output.
Thanks!
//****************************************************************
/*
* Watchdog Sleep Example
* Demonstrate the Watchdog and Sleep Functions
* Photoresistor on analog0 Piezo Speaker on pin 10
*
* KHM 2008 / Lab3/ Martin Nawrath nawrath@khm.de
* Kunsthochschule fuer Medien Koeln
* Academy of Media Arts Cologne
*/
//****************************************************************
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <Time.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
int nint;
volatile boolean f_wdt=1;
void setup(){
Serial.begin(9600);
setTime(16, 00, 0, 14, 2, 2012);
Serial.println("nightingale");
pinMode(13, OUTPUT);
// CPU Sleep Modes
// SM2 SM1 SM0 Sleep Mode
// 0 0 0 Idle
// 0 0 1 ADC Noise Reduction
// 0 1 0 Power-down
// 0 1 1 Power-save
// 1 0 0 Reserved
// 1 0 1 Reserved
// 1 1 0 Standby(1)
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(7);
}
byte del;
int cnt;
byte state=0;
int light=0;
//****************************************************************
//****************************************************************
//****************************************************************
void loop(){
if (f_wdt==1) { // wait for timed out watchdog / flag is set when a watchdog timeout occurs
f_wdt=0; // reset flag
digitalWrite(13, HIGH); // set the LED on
delay(2); // wait for a second
digitalWrite(13, LOW); // set the LED off
nint++;
Serial.print("Sleep " );
Serial.println(nint);
digitalClockDisplay();
system_sleep();
}
}
//****************************************************************
// set system into the sleep state
// system wakes up when wtchdog is timed out
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
}
//****************************************************************
// 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;
// Serial.println(ww);
MCUSR &= ~(1<<WDRF);
// start timed sequence
WDTCSR |= (1<<WDCE) | (1<<WDE);
// set new watchdog timeout value
WDTCSR = bb;
WDTCSR |= _BV(WDIE);
}
//****************************************************************
// Watchdog Interrupt Service / is executed when watchdog timed out
ISR(WDT_vect) {
f_wdt=1; // set global flag
}
void digitalClockDisplay() {
// digital clock display of the time
Serial.print(day() );
Serial.print("/");
Serial.print(month() );
Serial.print("/");
Serial.print(year() );
Serial.print(" ");
Serial.print(hour() );
printDigits(minute() );
printDigits(second() );
Serial.print(" ");
}
void printDigits(int digits) {
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
Here is the output:
14/2/2012 16:0