Идея устройства такова: имеется кнопка1, подключенная через триггер Шмитта ко 2му пину ардуино, отвечающая за прерывания, 4 тактовых кнопки, 4 светодиода и пин отвечающий за питание устройства(мп3 плеера). Программа должна выполнять следующий алгоритм: ардуино спит, по первому нажатию кнопки1 - просыпается, 7 секунд ждет повторного нажатия, если оно не поступило засыпает. Если нажатие есть, то 30 сек ждет нажатия одной из 4х тактовых кнопок, если нажатия не происходит - ардуина засыпает, если же нажатие есть, то подает питание на мр3 плеер, через 3 сек мигает одним из светодиодов, ждет 12 сек, выключает питание, засыпает. Программа работает почти правильно, кроме одного момента: при отработке одного полного цикла ардуина засыпает, но уже при однократном нажатии кнопки1 начинает реагировать на тактовые кнопки. Никак не могу понять в чем проблема, подскажите пожалуйста. Код (Text): #include <avr/sleep.h> #include <avr/power.h> int pin = 2;//кнопка пробуждения const int buttonPin1 = 7; //кнопки выбора const int buttonPin2 = 8; const int buttonPin3 = 9; const int buttonPin4 = 10; volatile int sleepState = 0; volatile int glassState = 0; const int ledPin1 = 3; const int ledPin2 = 4; const int ledPin3 = 5; const int ledPin4 = 6; int buttonState1 = 0; int buttonState2 = 0; int buttonState3 = 0; int buttonState4 = 0; int mp3Pin = 12;//выход на включение питания плеера unsigned long time; unsigned long time1; unsigned long delayButt=30000; unsigned long delayMp3 = 3000; unsigned long mp3Time=12000; unsigned long glassTime=7000; void mp3(int num); void wakeUp() { if(sleepState==1) { sleep_disable(); sleepState=0; } else if( glassState ==0) { glassState = 1; } } void EnterSleep() { sleepState=1; glassState=0; attachInterrupt(0, wakeUp, FALLING); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); //Разрешаем спящий режим sleep_mode(); //Спим (Прерывания продолжают работать.) Программа останавливается. } void setup() { attachInterrupt(0, wakeUp, FALLING); pinMode(pin, INPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT); pinMode(buttonPin1, INPUT); pinMode(buttonPin2, INPUT); pinMode(buttonPin3, INPUT); pinMode(buttonPin4, INPUT); pinMode(mp3Pin, OUTPUT); } void loop() { glassState=0; time=millis(); time1=time; while(time<time1+glassTime)//после пробуждения ждем 7 секундповторного нажатия кнопки { if(glassState==1) break; time=millis(); } if(glassState==1)//Если повторное нажатие произошло, то в течении 30 сек ждем сигнала от кнопок управления { time=millis(); time1=time; while(time<time1+delayButt) { buttonState1=0; buttonState2=0; buttonState3=0; buttonState4=0; buttonState1=digitalRead(buttonPin1); buttonState2=digitalRead(buttonPin2); buttonState3=digitalRead(buttonPin3); buttonState4=digitalRead(buttonPin4); if(buttonState1==HIGH) mp3(1); else if(buttonState2==HIGH) mp3(2); else if(buttonState3==HIGH) mp3(3); else if(buttonState4==HIGH) mp3(4); time=millis(); } } EnterSleep(); //В противном случае засыпаем } void mp3(int num) { buttonState1=0; buttonState2=0; buttonState3=0; buttonState4=0; digitalWrite(mp3Pin, HIGH);//подали питание time=millis(); time1=time; while(time<time1+delayMp3) //ждем 3 сек {time=millis();} switch(num)// подаем импульс на выбор трека { case 1: digitalWrite(ledPin1, HIGH); delay(100); digitalWrite(ledPin1, LOW); break; case 2: digitalWrite(ledPin2, HIGH); delay(100); digitalWrite(ledPin2, LOW); break; case 3: digitalWrite(ledPin3, HIGH); delay(100); digitalWrite(ledPin3, LOW); break; case 4: digitalWrite(ledPin4, HIGH); delay(100); digitalWrite(ledPin4, LOW); break; } time=millis(); time1=time; while(time<time1+mp3Time) //ждем пока трек отыграет {time=millis();} digitalWrite(mp3Pin, LOW);//выключаем питание EnterSleep(); //спим }