Работа с IR и Btn (кнопками) одновременно

Thorn
Offline
Зарегистрирован: 07.11.2014

Здратси форумчане и форумчанки. Подскажите по сабжу мысли. Делал тут проброс кодов 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 выполнение идет непрерывно :(

Надеюсь правильно выразился.

Logik
Offline
Зарегистрирован: 05.08.2014

Держите. http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykhoda?page=1#comment-192620

На прошлой неделе как раз писал для 3-х кнопок. Если надо одновременное нажатие - пишите, выложу.

Там обявления переменных докинете, да Time=millis(); в начале лопа.

Thorn
Offline
Зарегистрирован: 07.11.2014

Решил всеже своими кнопками добиться нужного. Для начала что с 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);
}

срабатывания по кнопке пульта происходит НАМНОГО чащще.

 

Thorn
Offline
Зарегистрирован: 07.11.2014

Добавил "визуализацию" на предмет ПЕРЕДАЧИ 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-кода передатчиком :(
           

Thorn
Offline
Зарегистрирован: 07.11.2014

Вобщем додвёл до Ума код :). Дело было не в бобине... Возможно и сейчас несильно идеальный код (особенно при работе с обычной кнопкой) но работает как часики прям приятно.

Оказывается при работе с кнопкой мне нужно было нетолько знать какое значение она присвоила переменной необходимости включить реле (вслед за этим отправить 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();
}