- Код
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#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
#define BUZZER_PIN 0
#define REED_SWITCH1_PIN 1
#define REED_SWITCH2_PIN 2
#define alarm_loop_cnt 21 //--- 7*9sec=63sec
volatile boolean f_wdt = 1;
int loop_CNT = 0;
void Alarm()
{
pinMode (BUZZER_PIN, OUTPUT);
for (int i=0; i < 3; i++){
digitalWrite(BUZZER_PIN, HIGH);
_delay_ms(100);
digitalWrite(BUZZER_PIN, LOW);
_delay_ms(100);
}
// Установите любые контакты, используемые для ввода, чтобы снизить потребление энергии.
pinMode(BUZZER_PIN,INPUT);
}
void setup(){
for (byte i = 0; i <= 4; i++)
{
pinMode (i, INPUT);
digitalWrite (i, LOW);
}
setup_watchdog(9);
}
void loop(){
if (f_wdt==1)
{
f_wdt=0;
digitalWrite(REED_SWITCH1_PIN, HIGH);
digitalWrite(REED_SWITCH2_PIN, HIGH);
// _delay_ms(10);
if (digitalRead(REED_SWITCH1_PIN) || digitalRead(REED_SWITCH2_PIN))
loop_CNT++;
else
loop_CNT=0;
digitalWrite(REED_SWITCH1_PIN, LOW);
digitalWrite(REED_SWITCH2_PIN, LOW);
if (loop_CNT>alarm_loop_cnt)
{
Alarm();
system_sleep();
}
}
}
void system_sleep() {
cbi(ADCSRA,ADEN); //переключить аналого-цифровой преобразователь в положение OFF
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // режим сна
sleep_enable();
sleep_mode();
sleep_disable();
sbi(ADCSRA,ADEN); // переключатель Аналого-цифровой преобразователь ВКЛ
}
// 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;
MCUSR &= ~(1<<WDRF);
// start timed sequence
WDTCR |= (1<<WDCE) | (1<<WDE);
// установить значение тайм-аута сторожевого таймера
WDTCR = bb;
WDTCR |= _BV(WDTIE);
}
// Служба прерывания сторожевого таймера / выполняется, когда тайм-аут тайм-аута
ISR(WDT_vect) {
f_wdt=1;
}