Привет! Подскажите, в чем может быть проблема. Есть следующий код. Он работает. МК уходит в сон, по датчику просыпается, отрабатывает проверку состояния и снова в сон.
#include <avr/sleep.h> // здесь описаны режимы сна
#include <avr/interrupt.h> // работа с прерываниями
#define LED 4
#define Button 1
ISR(INT0_vect)
{
}
//-------------------------------------------------------------------
void Beep(int16_t on, uint16_t off, byte num) {
for(byte i = 0; i < num; i++) {
digitalWrite(LED, HIGH);
_delay_ms(on);
digitalWrite(LED, LOW);
_delay_ms(off);
}
}
//-------------------------------------------------------------------
void setup() {
pinMode(LED, OUTPUT);
pinMode(Button, INPUT);
pinMode(0, OUTPUT);
digitalWrite(0, LOW);
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
Beep(200, 70, 3);
}
//-------------------------------------------------------------------
void loop() {
// уходим в сон..
GIMSK |= _BV(INT0);
//ADCSRA &= ~_BV(ADEN); // отключить ADC; уменьшает энергопотребление
ADCSRA &= ~(1 << ADEN); // Отключаем АЦП;
ACSR |= (1 << ACD); // Откл. компаратор;
sei(); // Общее разрешение прерываний
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_enable(); // разрешение режима сна
sleep_cpu(); // активация режима сна
cli(); // отключить прерывания; для безопасного отключения PCINT3
GIMSK &= ~_BV(INT0);
sleep_disable(); // запретить режим сна; MCUSR &= ~_BV(SE);
sei(); // Общее разрешение прерываний
_delay_ms(10);
// проснулись..
ControlDoor();
}
//-------------------------------------------------------------------
void ControlDoor() {
uint32_t timer = 0;
bool flag = false;
timer = millis(); // фиксируем начало таймера для открытой двери
while(digitalRead(Button) == 0) {// пока открыта дверь..
if((uint32_t)(millis() - timer) >= 10000) {// прошло ХХ сек, т.е. дверь открыта все это время..
flag = true;
break;
}
}
while(flag) {// дверь открыта, время таймера вышло, сигнализируем..
Beep(1000, 2000, 1);
if(digitalRead(Button) == 1) // дверь закрыта..
break;
}
}
Но есть нюанс) Если закомментировать вызов функции ControlDoor() и оставить все остальное, в активном режиме схема потребляем 1.5mA, во время сна - меньше 1мкА. Вроде так и должно быть. С функцией ControlDoor() в спящем режиме потребление становится примерно 400мкА. Пробовал отключать всю периферию светодиод и геркон, вставлял код частями - так и получилось выяснить что потребление начинается после добавления ControlDoor(). Почему так?