Skip to content

Instantly share code, notes, and snippets.

@zdila
Last active March 31, 2018 09:05
Show Gist options
  • Save zdila/235f954bafa3649afa074545a5fdcac9 to your computer and use it in GitHub Desktop.
Save zdila/235f954bafa3649afa074545a5fdcac9 to your computer and use it in GitHub Desktop.
fridge-alarm.ino
#include <avr/sleep.h>
volatile unsigned long count = 0L;
unsigned long lastClosed = 0L;
int sensorPin = 0;
int buzzPin = 1;
ISR(WDT_vect) {
count++;
}
void setup() {
ADCSRA &= ~(1 << ADEN); // disable ADC, saves ~230uA
setupWatchdog(6);
pinMode(sensorPin, INPUT_PULLUP);
pinMode(buzzPin, OUTPUT);
}
void loop() {
if (!digitalRead(sensorPin)) { // closed
lastClosed = count;
digitalWrite(buzzPin, LOW);
sleep();
} else if (count - lastClosed < 20) {
sleep();
} else {
digitalWrite(buzzPin, millis() % 500 < 100 ? HIGH : LOW);
}
}
void sleep() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // power down everything, wake up from WDT
sleep_enable();
sleep_mode();
sleep_disable();
}
// 16 ms
// 32 ms
// 64 ms
// 0.125 s
// 0.25 s
// 0.5 s
// 1.0 s
// 2.0 s
// 4.0 s
// 8.0 s
void setupWatchdog(int ii) {
byte bb = ii & 7;
if (ii > 7) {
bb |= (1 << 5);
}
bitSet(bb, WDCE);
// reset the watchdog reset flag
bitClear(MCUSR, WDRF);
// start timed sequence
WDTCR |= (1 << WDCE) | (1 << WDE);
// set new watchdog timeout value
WDTCR = bb;
bitSet(WDTCR, WDIE);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment