Работа с IR и Btn (кнопками) одновременно
- Войдите на сайт для отправки комментариев
Здратси форумчане и форумчанки. Подскажите по сабжу мысли. Делал тут проброс кодов Ir (подмена пультика :) ) http://arduino.ru/forum/obshchii/perenapravlenie-ir-kodov-podmena-pultika и вот счас надумал допилить устройство помимо Ir-упраления - кнопочным вКлючением.
на сейчас вкл\вЫкл устрйсвто исключительно с пульта, можно просто повесить кнопку и отслеживая её включать или выключать нужный out реле включения\выключения. Но так какаккустика не просто тупо включается а после включения ещё и посылает коды нужные и также перед отключением поступает (совсем кошерно и бесшумно в итоге происходит это) нужно выполнять тот же кусочек кода но уже по механической кнопке.
В итоге ежели в коде при работе с кнопками есть delay сами понимаете все на них и затупляется и работа пульта уже невыносимо-невозможна, плюс вообще при этом Ir неподнимается в коде, все на кнопках и остается. Вот общий код (совсем небольшой и с комментами по возможности)
#include <IRremote.h> //Подключаем библиотеку для Ir-сенсора
//=====IR_Sensor*
#define recvPin 11 //Вход Ir-приемника и кнопки пульта
IRrecv irrecv(recvPin);
IRsend irsend;
decode_results results;
uint32_t val;
#define key0 0xFFE21D //power
#define key1 0x40BEE21D //mute
#define key2 0x832206F9 //menu/back
#define key3 0x83220EF1 //up
#define key4 0x832212ED //down
#define key5 0x83228E71 //return
//=====Button*
int valbtn1;
int valbtn2;
int btnState;
int lightMode=0;
//=====Other_Relay*
#define Out0 53 //Используем цифровой Порт 53 для реле отключения питания
#define OutPwrLed 5 //Используем цифровой Порт 5 для (визуализации включения питания по кнопке)
#define In1 4 //Используем цифровой Порт 4 для кнопки Вкл/Откл питания
byte pwrOn=0; //Флаг Включения реле (по Ir-сигналу)
//=====Menu*
byte pos=0; //Позиция эквалайзера
void setup(){
Serial.begin(9600);
irrecv.enableIRIn(); //Включаем Ir-приёмник
pinMode(In1,INPUT); //Определяем вход кнопки ручного включения
pinMode(Out0,OUTPUT); //Определяем инверсный выход реле питания
digitalWrite(Out0,HIGH); //Определяем выход реле как вЫключенный
pinMode(OutPwrLed,OUTPUT); //Определяем инверсные выход реле (визуализации)
digitalWrite(OutPwrLed,LOW); //Определяем выход реле как вЫключенный
btnState=digitalRead(In1);
}
//=====Включение при помощи нажатия кнопки*
void button(){
valbtn1=digitalRead(In1);
valbtn2=digitalRead(In1);
if (valbtn1==valbtn2) {
if (valbtn1!=btnState) {
if (valbtn1==LOW) {
if (lightMode==0) {
lightMode=1;
} else {
lightMode=0;
}
}
}
btnState=valbtn1;
}
if (lightMode==1) {
digitalWrite(OutPwrLed,HIGH), digitalWrite(Out0,LOW);
pwrOn=1;
delay(4000); //Ожидаем когда общая громкость поднимется до "нужного"
irsend.sendNEC(0x40BE28D7,32);
}
if (lightMode==0) {
digitalWrite(OutPwrLed,LOW);
irsend.sendNEC(0x40BEE21D,32); //Посылаем нужный код с Ir-передатчика *mute (чтобы неБОМБило)
delay(4000); //Ожидаем когда общая громкость упадет до "0"
digitalWrite(Out0,HIGH),pwrOn=0;
}
Serial.print("LightMode ");
Serial.println(digitalRead(lightMode));
Serial.print("pwrOn ");
Serial.println(digitalRead(pwrOn));
Serial.println(" *** ");
delay(500);
}
void ir(){
if (irrecv.decode(&results)){
if (results.value != 0xFFFFFFFF){ //Если прищёл пакет и этот пакет не FF
val=results.value;}
//=====Для начала проверим включено или вЫключено реле питания системы*
if (val==key0){ //Принимаемы код с "левого" пульта *power
if (digitalRead(Out0)){ //Проверяем состояние реле
digitalWrite(Out0,LOW), pwrOn=1;} //Включаем реле
else{ //Или....
delay(300); //Чутку ждём после приёма
irsend.sendNEC(0x40BEE21D,32); //Посылаем нужный код с Ir-передатчика *mute (чтобы неБОМБило)
delay(4000); //Ожидаем когда общая громкость упадет до "0"
digitalWrite(Out0,HIGH),pwrOn=0;} //Выключаем реле
pos=0; //Устанавливаем позицию меню эквалайзера в начало (громкость)
if (pwrOn==1){ //Когда включилось питание (реле)
delay(4000); //Ожидаем когда общая громкость поднимется до "нужного"
irsend.sendNEC(0x40BE28D7,32);} //Посылаем *user (чтобы звук как надо был сразу)
}
}
irrecv.enableIRIn(); //Снова Включаем Ir-приёмник
irrecv.resume(); //Receive the next value
delay(100);
}
void loop(){
button();
ir();
}
по отдельности каждый loop работает (Ir - шикарно и без нареканий а вот btn (кнопочный пока delay висит то тупняк ....)
можно ли ... :) выполнить код обработки по кнопке ОДИН раз при первом нажатии и ОДИН раз про повторном (меняется отслеживаемая переменная lightMode и по ней уже определяется вКлючено или вЫключено реле питания и что делать далее Ir передатчику. счас я как понял по монитору Serial,print выполнение идет непрерывно :(
Надеюсь правильно выразился.
Держите. http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykhoda?page=1#comment-192620
На прошлой неделе как раз писал для 3-х кнопок. Если надо одновременное нажатие - пишите, выложу.
Там обявления переменных докинете, да Time=millis(); в начале лопа.
Решил всеже своими кнопками добиться нужного. Для начала что с Ir-работает на отлично delay при приёме\отправке сигнала, как раз ардуинка простаивала в ожиданнии и "лишнего" нажатия по кнопкам уже непринимала в это время) то работа с кнопками и delay это ceoot зло для меня оказалосью В итоге пошёл по старинке и сравнивал начало отсчета с millis и нужным количеством. После вход и выход в процедуру выполнения ОТПРАВКИ Ir-сигнала и работы реле по while; return; :) и всё даже получилось... Но почему то только с кнопкаи... Ir практически никак нереагирует или реагирует спонтанно (такое ощущение что как попадеш :)...
Все перепробовал, и принудительно включать Ir-приёмник - безрезультатно... Помогите пожалста...
#include <IRremote.h> //Подключаем библиотеку для Ir-сенсора //=====IR_Sensor* #define recvPin 11 //Определяем вход Ir-приемника и кнопки пульта IRrecv irrecv(recvPin); IRsend irsend; decode_results results; uint32_t val; #define key0 0xFFE21D //power #define key1 0x40BEE21D //mute #define key2 0x832206F9 //menu/back #define key3 0x83220EF1 //up #define key4 0x832212ED //down #define key5 0x83228E71 //return //=====Button* int valbtn1; //Переменные для хранения значения До нажатия int valbtn2; //Переменные для хранения значения После нажатия int btnState; //Переменные состояния кнопки int lightMode=0; //Переменные состояния визуализации кнопки //=====Other_Relay* #define Out0 53 //Используем цифровой Порт 4 для реле отключения питания #define OutPwrLed 5 //Используем цифровой Порт 4 для реле отключения питания #define In1 4 //Используем цифровой Порт 5 для кнопки Вкл/Откл питания byte pwrOn=0; //Флаг Включения реле //=====Menu* byte pos=0; //Позиция эквалайзера //=====Delays* unsigned long prvMlsTimeM=0; //Предыдущее показание обновления таймера нахождения в *Menu unsigned long prvMlsTime=0; //Предыдущее показание обновления таймера для отправки Ir unsigned long tzad=millis(); //Переменная задержки (пока для ds18b20, ds.write) unsigned long zadM[4]; //Массив для задержек const long zadTime[]={100,300,400,1000,4000}; void setup(){ Serial.begin(9600); irrecv.enableIRIn(); //Включаем Ir-приёмник pinMode(In1,INPUT); //Определяем вход кнопки ручного включения pinMode(Out0,OUTPUT); //Определяем инверсный выход реле питания digitalWrite(Out0,HIGH); //Определяем выход реле как вЫключенный pinMode(OutPwrLed,OUTPUT); //Определяем инверсные выход реле (визуализации) digitalWrite(OutPwrLed,LOW); //Определяем выход реле как вЫключенный btnState=digitalRead(In1); } //=====Запуск таймера при нахождении в меню эквалайзера* void timer(){ if (pos!=0){ //Если находимся в любой позиции меню эквалайзера if (millis()-prvMlsTimeM>20000){ //Проверяем интервал для обновления prvMlsTimeM=millis(); pos=0;} //Если времы вЫшло возвращаемся в регулировку громкости } } //=====Включение при помощи нажатия кнопки* void button(){ valbtn1=digitalRead(In1); valbtn2=digitalRead(In1); if (valbtn1==valbtn2) { if (valbtn1!=btnState) { if (valbtn1==LOW) { if (lightMode==0) { lightMode=1; } else { lightMode=0; } } } btnState=valbtn1; } while(1){ if (lightMode==1){ digitalWrite(OutPwrLed,HIGH); digitalWrite(Out0,LOW); pwrOn=1; if (millis()-prvMlsTime>zadTime[4]){ //Проверяем интервал для обновления prvMlsTime=millis(); irsend.sendNEC(0x40BE28D7,32);} //Ожидаем когда общая громкость поднимется до "нужного" }else{ digitalWrite(OutPwrLed,LOW); irsend.sendNEC(0x40BEE21D,32); //Посылаем нужный код с Ir-передатчика *mute (чтобы неБОМБило) if (millis()-prvMlsTime>zadTime[4]){ //Ожидаем когда общая громкость упадет до "0" prvMlsTime=millis(); pwrOn=0; digitalWrite(Out0,HIGH);} } return; } } void ir(){ if (irrecv.decode(&results)){ if (results.value != 0xFFFFFFFF){ //Если прищёл пакет и этот пакет не FF val=results.value;} //=====Для начала проверим включено или вЫключено реле питания системы* if (val==key0){ //Принимаемы код с "левого" пульта *power if (digitalRead(Out0)){ //Проверяем состояние реле digitalWrite(Out0,LOW), pwrOn=1;} //Включаем реле else{ //Или.... delay(300); //Чутку ждём после приёма irsend.sendNEC(0x40BEE21D,32); //Посылаем нужный код с Ir-передатчика *mute (чтобы неБОМБило) delay(4000); //Ожидаем когда общая громкость упадет до "0" digitalWrite(Out0,HIGH),pwrOn=0;} //Выключаем реле pos=0; //Устанавливаем позицию меню эквалайзера в начало (громкость) if (pwrOn==1){ //Когда включилось питание (реле) delay(4000); //Ожидаем когда общая громкость поднимется до "нужного" irsend.sendNEC(0x40BE28D7,32);} //Посылаем *user (чтобы звук как надо был сразу) } if (pwrOn==1){ //Если питание включено можно "подменивать" команды timer(); //Запускаем таймер, чтобы случайно не управлять эквалайзером //=====Приглушение общей громкости* // if (val==key1){ //Принимаемы код с "левого" пульта, если нажато *mute // delay(300); //Чутку ждём после приёма // irsend.sendNEC(0x40BEE21D,32);} //Посылаем нужный код с Ir-передатчика *mute //=====Вход в меню эквалайзера* if (val==key2){ //Принимаемы код с "левого" пульта, если нажато *menu/back delay(300); //Чутку ждём после приёма irsend.sendNEC(0x40BED02F,32);} //Посылаем нужный код с Ir-передатчика *func //=====Перемещение по меню эквалайзера* if (val==key2 && pos<3){delay(500); pos++;} //Увеличить позицию меню else if (pos==3 && val==key2){delay(500);pos=0;} //=====Изменение общей громкости* if (val==key3 && pos==0){ //Если нажато на "левом" пульте *up delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEF00F,32);} //Посылаем нужный код с Ir-передатчика *vol up+ else if (val==key4 && pos==0){ //Если нажато на "левом" пульте *down delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEE01F,32);} //Посылаем нужный код с Ir-передатчика *vol down- //=====Изменение низких частот* if (val==key3 && pos==1){ //Если нажато на "левом" пульте *up delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEDA25,32);} //Посылаем нужный код с Ir-передатчика *bass+ else if (val==key4 && pos==1){ //Если нажато на "левом" пульте *down delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEEA15,32);} //Посылаем нужный код с Ir-передатчика *bass- //=====Изменение средних частот* if (val==key3 && pos==2){ //Если нажато на "левом" пульте *up delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BE7A85,32);} //Посылаем нужный код с Ir-передатчика *middle+ else if (val==key4 && pos==2){ //Если нажато на "левом" пульте *down delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BE42BD,32);} //Посылаем нужный код с Ir-передатчика *middle- //=====Изменение высоких частот* if (val==key3 && pos==3){ //Если нажато на "левом" пульте *up delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEFA05,32);} //Посылаем нужный код с Ir-передатчика *treb+ else if (val==key4 && pos==3){ //Если нажато на "левом" пульте *down delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEC23D,32);} //Посылаем нужный код с Ir-передатчика *treb- //=====Выход из настроек эквалайзера* if (val==key5){ //Принимаемы код с "левого" пульта, если нажато *return pos=0;} //Просто переходим в начальную позицию эквалайзера (громкость) } irrecv.enableIRIn(); //Снова Включаем Ir-приёмник irrecv.resume(); //Receive the next value delay(100); } } void loop(){ button(); ir(); }Кстати с "коротким" вариантом Ir куска кода
void ir(){ if (irrecv.decode(&results)){ if (results.value != 0xFFFFFFFF){ //Если прищёл пакет и этот пакет не FF val=results.value;} //=====Для начала проверим включено или вЫключено реле питания системы* if (val==key0){ //Принимаемы код с "левого" пульта *power if (digitalRead(Out0)){ //Проверяем состояние реле digitalWrite(Out0,LOW), pwrOn=1, lightMode=1;} //Включаем реле else{ //Или.... delay(300); //Чутку ждём после приёма irsend.sendNEC(0x40BEE21D,32); //Посылаем нужный код с Ir-передатчика *mute (чтобы неБОМБило) delay(4000); //Ожидаем когда общая громкость упадет до "0" digitalWrite(Out0,HIGH),pwrOn=0, lightMode=0;} //Выключаем реле pos=0; //Устанавливаем позицию меню эквалайзера в начало (громкость) if (pwrOn==1){ //Когда включилось питание (реле) delay(4000); //Ожидаем когда общая громкость поднимется до "нужного" irsend.sendNEC(0x40BE28D7,32);} //Посылаем *user (чтобы звук как надо был сразу) } } irrecv.enableIRIn(); //Снова Включаем Ir-приёмник irrecv.resume(); //Receive the next value delay(100); }срабатывания по кнопке пульта происходит НАМНОГО чащще.
Добавил "визуализацию" на предмет ПЕРЕДАЧИ Ir простым способом
в setup pinMode(13,OUTPUT); digitalWrite(13,LOW);
и в код после каждой отправки по кнопке это или по Ir-пульту
if (millis()-prvMlsIrrig>zadTime[4]){ //Проверяем интервал для обновления prvMlsIrrig=millis(); irsend.sendNEC(0x40BE28D7,32);digitalWrite( 13, !digitalRead(13) );} //Ожидаем когда общая громкость поднимется до "нужного" }else{ digitalWrite(OutPwrLed,LOW); irsend.sendNEC(0x40BEE21D,32);digitalWrite( 13, !digitalRead(13) ); //Посылаем нужный код с Ir-передатчика *mute (чтобы неБОМБило) if (millis()-prvMlsIrrig>zadTime[6]){ //Ожидаем когда общая громкость упадет до "0" prvMlsIrrig=millis();и чт оя увидел... Т очто отпрака хреначит и ДО нажатия кнопки и после постоянно - поэтому при ДЛИННОМ коде для работы с IR-пробросом пульт вообще невоспринимался, значит я всеже НЕПРАВИЛЬНО описал выполнение кода с механической кнопкой. Уже думаю оставить это дело пока ума нехватает и выполнять простой вкл\вЫкл - без дополнительной отправки Ir-кода передатчиком :(
Вобщем додвёл до Ума код :). Дело было не в бобине... Возможно и сейчас несильно идеальный код (особенно при работе с обычной кнопкой) но работает как часики прям приятно.
Оказывается при работе с кнопкой мне нужно было нетолько знать какое значение она присвоила переменной необходимости включить реле (вслед за этим отправить Ir-код при включении и ровно наоборот при вЫключении с паузами между посылкой и включением\отключением) но и как её сравнить с мгновеноым нажатием.
Ведь раньше я почему такой злой был... имеется ввиду почему при нажатии у меня бесконенчо отправлялся код и тп потмоу что несравнивался нисчем :)
Вот что вышло, цикл общий как всегда развбил на два чтобы легче искать ошибки, всяки визуализации работы отправки Ir-кодой удалил и прочее. Выкладываю мало ли кому пригодится, так как готовго ненашёл (плохо искал может).
#include <IRremote.h> //Подключаем библиотеку для Ir-сенсора //=====IR_Sensor* #define recvPin 2 //Вход Ir-приемника и кнопки пульта IRrecv irrecv(recvPin); IRsend irsend; decode_results results; uint32_t val; #define key0 0x832201FE //power #define key1 0x40BEE21D //mute #define key2 0x832206F9 //menu/back #define key3 0x83220EF1 //up #define key4 0x832212ED //down #define key5 0x83228E71 //return //=====Button* #define In1 5 //Используем цифровой Порт 4 для кнопки Вкл/Откл питания int valbtn1; int valbtn2; int btnState; //Определения последнего состояние кнопки int lightMode=0; //Переменная включения\выключения состояния реле //=====Other_Relay* #define Out0 4 //Используем цифровой Порт 4 для реле отключения питания byte pwrOn=0; //Флаг Включения реле //=====Menu* byte pos=0; //Позиция эквалайзера //=====Delays* unsigned long prvMlstimeM=0; //Предыдущее показание обновления таймера меню эквалайзера void setup(){ irrecv.enableIRIn(); //Включаем Ir-приёмник pinMode(In1,INPUT); //Определяем кнопкe ручного включения как вход pinMode(Out0,OUTPUT); //Определяем инверсные выход реле digitalWrite(Out0,HIGH); //Определяем выход реле как вЫключенный btnState=digitalRead(In1); //Чтение состояния кнопки при включении } //=====Включение при помощи нажатия кнопки* void button(){ valbtn1=digitalRead(In1); valbtn2=digitalRead(In1); if (valbtn1==valbtn2){ if (valbtn1!=btnState){ if (valbtn1==LOW){ if (lightMode==0){ lightMode=1; } else { lightMode=0; } } } btnState=valbtn1; } if (btnState==HIGH){ pwrOn=0; }else{ pwrOn=1;} if (lightMode==0&&btnState==LOW&&pwrOn==1){ //Если реле включено и нажата кнопка irsend.sendNEC(0x40BEE21D,32); irrecv.enableIRIn(); //Посылаем нужный код с Ir-передатчика *mute (чтобы неБОМБило) delay(2000); //Ожидаем когда общая громкость упадет до "0" digitalWrite(Out0,HIGH);} //Выключаем реле if (lightMode==1&&btnState==LOW&&pwrOn==1){ //Если реле вЫключено и нажата кнопка digitalWrite(Out0,LOW); //Включаем реле delay(2000); //Ожидаем когда общая громкость поднимется до "нужного" irsend.sendNEC(0x40BE28D7,32); irrecv.enableIRIn();} //Посылаем *user (чтобы звук как надо был сразу) и разрешаем ПРИЁМ Ir-сигнала } void ir(){ if (irrecv.decode(&results)){ if (results.value != 0xFFFFFFFF){ //Если прищёл пакет и этот пакет не FF val=results.value;} //=====Для начала проверим включено или вЫключено реле питания системы* if (val==key0){ //Принимаемы код с "левого" пульта *power if (digitalRead(Out0)){ //Проверяем состояние реле digitalWrite(Out0,LOW), pwrOn=1;} //Включаем реле else{ //Или.... delay(300); //Чутку ждём после приёма irsend.sendNEC(0x40BEE21D,32); //Посылаем нужный код с Ir-передатчика *mute (чтобы неБОМБило) delay(4000); //Ожидаем когда общая громкость упадет до "0" digitalWrite(Out0,HIGH),pwrOn=0;} //Выключаем реле pos=0; //Устанавливаем позицию меню эквалайзера в начало (громкость) if (pwrOn==1){ //Когда включилось питание (реле) delay(4000); //Ожидаем когда общая громкость поднимется до "нужного" irsend.sendNEC(0x40BE28D7,32);} //Посылаем *user (чтобы звук как надо был сразу) } if (pwrOn==1){ //Если питание включено можно "подменивать" команды timer(); //Запускаем таймер, чтобы случайно не управлять эквалайзером //=====Приглушение общей громкости* // if (val==key1){ //Принимаемы код с "левого" пульта, если нажато *mute // delay(300); //Чутку ждём после приёма // irsend.sendNEC(0x40BEE21D,32);} //Посылаем нужный код с Ir-передатчика *mute //=====Вход в меню эквалайзера* if (val==key2){ //Принимаемы код с "левого" пульта, если нажато *menu/back delay(300); //Чутку ждём после приёма irsend.sendNEC(0x40BED02F,32);} //Посылаем нужный код с Ir-передатчика *func //=====Перемещение по меню эквалайзера* if (val==key2 && pos<3){delay(500); pos++;} //Увеличить позицию меню else if (pos==3 && val==key2){delay(500);pos=0;} //=====Изменение общей громкости* if (val==key3 && pos==0){ //Если нажато на "левом" пульте *up delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEF00F,32);} //Посылаем нужный код с Ir-передатчика *vol up+ else if (val==key4 && pos==0){ //Если нажато на "левом" пульте *down delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEE01F,32);} //Посылаем нужный код с Ir-передатчика *vol down- //=====Изменение низких частот* if (val==key3 && pos==1){ //Если нажато на "левом" пульте *up delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEDA25,32);} //Посылаем нужный код с Ir-передатчика *bass+ else if (val==key4 && pos==1){ //Если нажато на "левом" пульте *down delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEEA15,32);} //Посылаем нужный код с Ir-передатчика *bass- //=====Изменение средних частот* if (val==key3 && pos==2){ //Если нажато на "левом" пульте *up delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BE7A85,32);} //Посылаем нужный код с Ir-передатчика *middle+ else if (val==key4 && pos==2){ //Если нажато на "левом" пульте *down delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BE42BD,32);} //Посылаем нужный код с Ir-передатчика *middle- //=====Изменение высоких частот* if (val==key3 && pos==3){ //Если нажато на "левом" пульте *up delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEFA05,32);} //Посылаем нужный код с Ir-передатчика *treb+ else if (val==key4 && pos==3){ //Если нажато на "левом" пульте *down delay(400); //Чутку ждём после приёма irsend.sendNEC(0x40BEC23D,32);} //Посылаем нужный код с Ir-передатчика *treb- //=====Выход из настроек эквалайзера* if (val==key5){ //Принимаемы код с "левого" пульта, если нажато *return pos=0;} //Просто переходим в начальную позицию эквалайзера (громкость) } irrecv.enableIRIn(); //Снова Включаем Ir-приёмник irrecv.resume(); //Receive the next value delay(100); } } //=====Запуск таймера при нахождении в меню эквалайзера* void timer(){ if (pos!=0){ //Если находимся в любой позицц меню эквалайзера if (millis()-prvMlstimeM>20000){ //Проверяем интервал для обновления prvMlstimeM=millis(); pos=0;} //Если времы вЫшло возвращаемся в регулировку громкости } } void loop(){ button(); ir(); }