Examples - HowTo - Decrease Battery Consumption

A simple class in wiring

This tutorial shows an easy possibility on how to save arduino's battery lifetime while using xBee as a transceiver for sleeping mode. If you want to collect sensor data in a certain interval you should try this tutorial. you energy consumption will decrease.

Just take a lookon our real life measurements with a 7.6V battery and Seeeduino/Arduino on 5V:

If Seeeduino board in SLEEP_MODE_PWR_DOWN
Seeeduino board 13mA
Seeeduino board + sleep xbee 33mA
Seeeduino board + extension board 23mA
Seeeduino board + extension board + awake xbee 74 mA
Seeeduino board + extension board + sleep xbee 25mA (both seeeduino and xbee sleep and wake up in loop)


If Seeeduino borad not sleep
Seeeduino board + extension board + awake xbee 102mA (original version)
Seeeduino board + awake xbee 64mA
Seeeduino board + sleep xbee 45mAv

Hardware setup


Software setup


/*******************************************************************************************
* sleep Arduino + XBee example to reduce battery consumption
* 28.04.2010
* Author:       Hua Hao            /  CAAD - ITA - ETH Zürich  /  hhua@student.ethz.ch
* Coordination: Christoph Wartmann /  http://www.embedded.arch.ethz.ch
* based on the codes of Martin Nawrath: http://interface.khm.de/index.php/lab/experiments/sleep_watchdog_battery
*
* the system works as follows:
1.	Arduino wakes up
2.	Arduino wakes XBee up
3.	Arduino collect data, send data via XBee to coordinator
4.	Arduino makes XBee sleep
5.	Arduino sleeps
6.	go to step 1
*******************************************************************************************/

#include <avr/sleep.h>
#include <avr/wdt.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;
int xbeePin=8;//D8
boolean f_wdt=1;

void setup(){
        Serial.begin(9600);
        pinMode(xbeePin,OUTPUT); //set D8 pin for OUTPUT
        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(8);   //every 4 seconds
}

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(xbeePin,LOW);  //awake xbee
                nint++;
                delay(10);
                sendData();
                delay(10);               // wait until the last serial character is send
                digitalWrite(xbeePin,HIGH);  //sleep xbee,5V on D8 pin of Arduino,and provide 3.3V on pin9 of the remote XBee(use resistor).
                //PIN HIBERNATE sleep mode is used(set SM=1 for remote XBee in X-CTU)
                pinMode(xbeePin,INPUT); // set all used port to intput to save power
                system_sleep();
                pinMode(xbeePin,OUTPUT); // set all ports into state before sleep
        }
}
void sendData(){
        //set your own format of data here
        //the data will display on the serial monitor of your computer connecting a coordinator XBee (receiveing data from remote XBee)
        Serial.print(analogRead(1));
        Serial.print(":");
        Serial.print(analogRead(2));
        Serial.print(":");
        Serial.println(analogRead(3));
}

void system_sleep() {// system wakes up when wtchdog is timed out
        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_watchdog(int ii) {
        // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
        // 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
        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);
        WDTCSR |= (1<<WDCE) | (1<<WDE); // start timed sequence
        WDTCSR = bb;// set new watchdog timeout value
        WDTCSR |= _BV(WDIE);
}
ISR(WDT_vect) {// Watchdog Interrupt Service / is executed when  watchdog timed out
        f_wdt=1;  // set global flag
}