#include /* Sleep During Daylight * --------------------- * * Example code to demonstrate how to put an Arduino to sleep during daylight. * You need to attach a photoresistor to pin 2 and to couple it with a well adjusted * resistor (use a potentiometer to start with, in order to get the right value). * * The Arduino will switch to sleep mode whenever the value on pin 2 becomes HIGH. * * NOTE: when coming back from POWER-DOWN mode, it takes a bit * until the system is functional at 100%!! (typically <1sec) * * Copyright (C) 2006 MacSimski 2006-12-30 * Copyright (C) 2007 D. Cuartielles 2007-07-08 - Mexico DF * Copyright (C) 2008 Sofian Audry 2008-06-17 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #define LED_PIN 13 #define WAKE_PIN 3 void wakeUpNow() // here the interrupt is handled after wakeup { digitalWrite(LED_PIN, HIGH); // execute code here after wake-up before returning to the loop() function // timers and code using timers (serial.print and more...) will not work here. // we don't really need to execute any special functions here, since we // just want the thing to wake up } void setup() { pinMode(WAKE_PIN, INPUT); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); /* Now is time to enable a interrupt. In the function call * attachInterrupt(A, B, C) * A can be either 0 or 1 for interrupts on pin 2 or 3. * * B Name of a function you want to execute while in interrupt A. * * C Trigger mode of the interrupt pin. can be: * LOW a low level trigger * CHANGE a change in level trigger * RISING a rising edge of a level trigger * FALLING a falling edge of a level trigger * * In all but the IDLE sleep modes only LOW can be used. */ attachInterrupt(1, wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function // wakeUpNow when pin 2 gets LOW } void sleepNow() // here we put the arduino to sleep { digitalWrite(LED_PIN, LOW); /* Now is the time to set the sleep mode. In the Atmega8 datasheet * http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf on page 35 * there is a list of sleep modes which explains which clocks and * wake up sources are available in which sleep modus. * * In the avr/sleep.h file, the call names of these sleep modus are to be found: * * The 5 different modes are: * SLEEP_MODE_IDLE -the least power savings * SLEEP_MODE_ADC * SLEEP_MODE_PWR_SAVE * SLEEP_MODE_STANDBY * SLEEP_MODE_PWR_DOWN -the most power savings * * For now, we want as much power savings as possible, so we * choose the according * sleep modus: SLEEP_MODE_PWR_DOWN * */ set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here sleep_enable(); // enables the sleep bit in the mcucr register // so sleep is possible. just a safety pin /* Now is time to enable a interrupt. we do it here so an * accidentally pushed interrupt button doesn't interrupt * our running program. if you want to be able to run * interrupt code besides the sleep function, place it in * setup() for example. * * In the function call attachInterrupt(A, B, C) * A can be either 0 or 1 for interrupts on pin 2 or 3. * * B Name of a function you want to execute at interrupt for A. * * C Trigger mode of the interrupt pin. can be: * LOW a low level triggers * CHANGE a change in level triggers * RISING a rising edge of a level triggers * FALLING a falling edge of a level triggers * * In all but the IDLE sleep modes only LOW can be used. */ attachInterrupt(1, wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function // wakeUpNow when pin 2 gets LOW sleep_mode(); // here the device is actually put to sleep!! // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP sleep_disable(); // first thing after waking from sleep: // disable sleep... detachInterrupt(1); // disables interrupt 0 on pin 2 so the // wakeUpNow code will not be executed // during normal running time. } void loop() { if (digitalRead(WAKE_PIN) == HIGH) { sleepNow(); } }