#include <avr/sleep.h>
#include <avr/wdt.h>
#define PIEZO_PIN 11
/*
##################################################################
* Es folgen 2 Funktionen für den
Tiefschlaf-Modus.
*
* Quelle: http://gammon.com.au/power (Sketch I)
*/
/*
-------------------------------------------------------------------
* Aufwachen
*/
ISR(WDT_vect) {
wdt_disable(); // disable watchdog
}
/*
-------------------------------------------------------------------
* Schlafen
*
* WDP3 WDP2 WDP1 WDP0
* 0
0 0
0 16 ms
* 0
0 0
1 32 ms
* 0
0 1
0 64 ms
* 0
0 1
1 0.125 s
* 0
1 0
0 0.25 s
* 0
1 0
1 0.5 s
* 0
1 1
0 1.0 s
* 0
1 1
1 2.0 s
* 1
0 0
0 4.0 s
* 1
0 0
1 8.0 s
*/
void sleep_PWR_DOWN(unsigned char dur=0) {
// disable ADC
ADCSRA=0;
// clear various "reset" flags
MCUSR=0;
// allow changes, disable reset
WDTCSR=bit(WDCE) | bit(WDE);
// set interrupt mode and an interval
WDTCSR=bit(WDIE) | dur;
wdt_reset(); // pat the dog
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
noInterrupts();
// timed sequence follows
sleep_enable();
// turn off brown-out enable in software
MCUCR=bit(BODS) | bit(BODSE);
MCUCR=bit(BODS);
interrupts();
// guarantees next instruction executed
sleep_cpu();
// cancel sleep as a precaution
sleep_disable();
}
void setup() {
pinMode(PIEZO_PIN, OUTPUT);
}
void loop() {
sleep_PWR_DOWN(bit(WDP2) | bit(WDP1) |
bit(WDP0)); // 2 s
// die ersten 60 Sekunden
for(int i=0; i<15; i++) {
digitalWrite(PIEZO_PIN, HIGH);
sleep_PWR_DOWN(); // 16 ms
digitalWrite(PIEZO_PIN, LOW);
sleep_PWR_DOWN(bit(WDP3)); // 4
s
}
for(int i=0; i<15; i++) {
digitalWrite(PIEZO_PIN, HIGH);
sleep_PWR_DOWN(bit(WDP2) |
bit(WDP0)); // 0.5 s
digitalWrite(PIEZO_PIN, LOW);
sleep_PWR_DOWN(bit(WDP2) | bit(WDP1)
| bit(WDP0)); // 2 s
}
for(int i=0; i<15; i++) {
digitalWrite(PIEZO_PIN, HIGH);
sleep_PWR_DOWN(bit(WDP2) |
bit(WDP1)); // 1 s
digitalWrite(PIEZO_PIN, LOW);
sleep_PWR_DOWN(bit(WDP2) |
bit(WDP1)); // 1 s
}
while(1) {
digitalWrite(PIEZO_PIN, HIGH);
sleep_PWR_DOWN(0); // 32 ms
digitalWrite(PIEZO_PIN, LOW);
sleep_PWR_DOWN(bit(WDP3) |
bit(WDP0)); // 8 s
}
}
|