Перенаправление Ir-кодов (подмена пультика :)

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

Доброго времени форумчане и форумчанки. Решил заморочится, имеется система с пультиком Edifier RC20A* (DA5000Pro  -старичок такой). К нему внешний звук на 5.1 Creative RM-820* (Creative Omni). У акустики неочень нужный и неудобный пульт, где по большому счёту нужен только звук... однако при использовании внешнего предварительного усилителя в нем надобност ьвообще пропадает. Решено установить реле отключения питания с пульта у Эдиффера, путём установки внутрь дежурного питания мелкой ProMini и собственно реле. Также решено оставить несколько функций с родного пультика (мутэ, громкость + и -). Скетчик успешно набросан и работает, однако... одна суко кнопка (громкость вверх или +) - нивкакую нехочет, тоетсь остальные по нажатию спустя 300мсек "пробрасывают" нужный код от передатчика Ir - а именно эта нехочет. Если оставить её одну то все пучком, также если прописать НОВЫЕ кнопк иот других пультиков - то все отлично, а эта нет.

Будьте любезны - там кода 10 строк :) посмотрите где собака порылась.

#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 0x832204FB                //mute
#define key2 0x832206F9                //menu/back
#define key3 0x83220EF1                //up
#define key4 0x832212ED                //down

//=====Other_Relay*
#define Out0 5                         //Используем цифровой Порт 5 для реле отключения питания

void setup(){
    irrecv.enableIRIn();               //Включаем Ir-приёмник
    digitalWrite(Out0,LOW);
}

void loop(){
  if (irrecv.decode(&results)){
    val=results.value;
if (val==key0){                        //Принимаемы код с "левого" пульта *power
  if (digitalRead(Out0)){              //Проверяем состояние реле
  digitalWrite(Out0, LOW);}            //Выключаем реле
    else{                              //Или....
  digitalWrite(Out0, HIGH);}           //Включаем реле
    delay(300);}                       //Чутку ждём после приёма
else if (val==key1){                   //Принимаемы код с "левого" пульта, если нажато *mute
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEE21D,32);}  //Посылаем нужный код с Ir-передатчика *mute
else if (val==key2){                   //Если нажато на "левом" пульте *menu/back
      delay(300);
      irsend.sendNEC(0x40BE28D7,32);}  //Посылаем *user
else if (val==key3){                   //Если нажато на "левом" пульте *up/\
      delay(300);
      irsend.sendNEC(0x40BEF00F,32);}  //Посылаем *vol up+
else if (val==key4){                   //Если нажато на "левом" пульте *down\/
      delay(300);
      irsend.sendNEC(0x40BEE01F,32);}  //Посылаем *vol down-
  irrecv.enableIRIn();                 //Снова Включаем Ir-приёмник
  irrecv.resume();                     //Receive the next value
    delay(100);
  }
}

В кратце... подмениваю

#define key3 0x83220EF1                //up

на

irsend.sendNEC(0x40BEF00F,32);}  //Посылаем *vol up+

спасибо!

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

Господа вы неповерите, все оказалось БАНАЛЬНО просто, но суко вычислить удалось совершенно случайно.

Я чутку поправил код, пока едер релюша 5-ти вольтовая на вкл\выкл всей системы можно поиграться с кодом.

Добавил возможность регулировать эквалайзер (входом в меню и кнопками регулировки громкости подпунктов, высокие, средние, низкие). По аналогии можно (но это лиш запутает) можно регулировтаь громкости самих 5,1 каналов отдельно друг от друга но де-факто все всегда ОДИНАКОВО :) по уровню;

Выполнение "проброса" кнопок тольк опри Включенной системе (чтобы негонять коды когда ненужно);

Вот новый кусочек кода....

#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 0x832204FB                //mute
#define key2 0x832206F9                //menu/back
#define key3 0x83220EF1                //up
#define key4 0x832212ED                //down
#define key5 0x83228E71                //return

//=====Other_Relay*
#define Out0 5                         //Используем цифровой Порт 5 для реле отключения питания
byte pwrOn=0;                          //Флаг Включения реле

//=====Menu*
byte pos=0;                            //Позиция эквалайзера

void setup(){
    irrecv.enableIRIn();               //Включаем Ir-приёмник
    digitalWrite(Out0,LOW);
}

void loop(){
  if (irrecv.decode(&results)){
    val=results.value;
//=====Для начаа проверим включено или вЫключено реле питания системы*     
if (val==key0){                        //Принимаемы код с "левого" пульта *power
  if (digitalRead(Out0)){              //Проверяем состояние реле
  digitalWrite(Out0,LOW),pwrOn=0; }    //Выключаем реле
    else{                              //Или....
  digitalWrite(Out0,HIGH),pwrOn=1;}    //Включаем реле
    delay(2000);                       //Чутку ждём после приёма
    pos=0;                             //Устанавливаем позицию меню эквалайзера в начало (громкость)
      irsend.sendNEC(0x40BE28D7,32);}  //Посылаем *user (чтобы звука как надо был сразу)
if (pwrOn==1){                         //Если питание включено можно "подменивать" команды
//=====Перемещение по меню эквалайзера*   
     if (val==key2 && pos<3) {delay(500); pos++;}  //Увеличить позицию меню
else if (pos==3 && val==key2) {delay(500);pos=0;}
//=====Приглушение общей громкости*
if (val==key1){                        //Принимаемы код с "левого" пульта, если нажато *mute
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEE21D,32);}  //Посылаем нужный код с Ir-передатчика *mute 
//=====Изменение общей громкости*
if (val==key3 && pos==0){              //Если нажато на "левом" пульте *up
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEF00F,32);}  //Посылаем нужный код с Ir-передатчика *vol up+
else if (val==key4 && pos==0){         //Если нажато на "левом" пульте *down
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEE01F,32);}  //Посылаем нужный код с Ir-передатчика *vol down-
//=====Изменение высоких частот*
if (val==key3 && pos==1){              //Если нажато на "левом" пульте *up
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEFA05,32);}  //Посылаем нужный код с Ir-передатчика *treb+
else if (val==key4 && pos==1){         //Если нажато на "левом" пульте *down
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEC23D,32);}  //Посылаем нужный код с Ir-передатчика *treb-      
//=====Изменение средних частот*      
if (val==key3 && pos==2){              //Если нажато на "левом" пульте *up
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BE7A85,32);}  //Посылаем нужный код с Ir-передатчика *middle+
else if (val==key4 && pos==2){         //Если нажато на "левом" пульте *down
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BE42BD,32);}  //Посылаем нужный код с Ir-передатчика *middle- 
//=====Изменение низких частот*       
if (val==key3 && pos==3){              //Если нажато на "левом" пульте *up
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEDA25,32);}  //Посылаем нужный код с Ir-передатчика **bass+
else if (val==key4 && pos==3){         //Если нажато на "левом" пульте *down
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEEA15,32);}  //Посылаем нужный код с Ir-передатчика **bass-
//=====Выход из настроек эквалайзера*
if (val==key5){                        //Принимаемы код с "левого" пульта, если нажато *return
      delay(300);                      //Чутку ждём после приёма
      pos=0;}                          //Просто переходим в начальную позицию эквалайзера (громкость)      
}
  irrecv.enableIRIn();                 //Снова Включаем Ir-приёмник
  irrecv.resume();                     //Receive the next value
    delay(100);
  }
}

реле скорее всего будет управляться инвернсо (нужно будет заменить HIGH на LOW в коде и все ну и в сетапе)

А теперь почемуже нерегулировалась громкость вверх (точнее непробрасывался код). Все дело в комментарии вида а именно в /\

//Если нажато на "левом" пульте *up/\

вот-уж незнаю почему но //-неработало как надо в данном случае

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Всё дело в символе  \  (обратный слэш) в конце строки 39.

"В стандарте C99 и в C++ описан еще один тип комметариев: //. Он действует в пределах от самой последовательности двух слэшей до следующего перевода строки. Если в конце строки стоит символ \ , считается комментарием и следующая строка."

Получается, у Вас таким образом была закоментирована строка 40. В то же время в строке 42 также есть символ \ , но он не последний в строке. Поэтому там всё нормально.

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

Спасибо я помоему вкурил... если коментить целые куски кода в начале /* то все что после невыполнялось и так до символа */

А тут ну почти тоже самое только ктобы знал что простое "графическое" якобы описание кнопки стрелками вниз :) так себя поведёт..

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

/* да, большой многострочный кусок кода комментируем так */

// одну строку комментируем так, но в конце не должно быть символа \ , иначе закомментируется и строка ниже этой

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

Тут один мелкий НО пакостный момент (я его предвидел но недумал чт оон так помешает)...

это собственно время нахождения в менюшках эквалайзера. Сейчас нахождение там и перемещение собственно осуществляется тремя кнопочками (вход\выход - одна и две вверх и вниз (уменьшение\увеличение). Саи думаю понимаете что они нужны разово а вот регулятор громкости чащще (постоянно). И пока я невыйду из меню в pos=0 (регулировка громкости\уровня звука) то мои кнопки вверх\вниз работают в pos=1,2,3  попытался впихнуть некий таймер, задав в переменных:

//=====Delays*
unsigned long timeM=0;                //Время нахождения в меню эквалайзера
unsigned long prvMlstimeM=0;           //Предыдущее показание обновления таймера

и вход\выход в меню эквалайзера:

//=====Вход в меню эквалайзера*
if (val==key2){                        //Принимаемы код с "левого" пульта, если нажато *mute
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BED02F,32);   //Посылаем нужный код с Ir-передатчика *func 
if (millis()-prvMlstimeM>5000)         //Проверяем интервал для обновления 
     prvMlstimeM=millis(), pos=0;}     //Если времы вЫшло возвращаемся в регулировку громкости
//=====Перемещение по меню эквалайзера*   
     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(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEF00F,32);}  //Посылаем нужный код с Ir-передатчика *vol up+
else if (val==key4 && pos==0){         //Если нажато на "левом" пульте *down
      delay(300);                      //Чутку ждём после приёма
      irsend.sendNEC(0x40BEE01F,32);}  //Посылаем нужный код с Ir-передатчика *vol down-

и собственно ничегошеньки невыходит ни спустя 5 сек ни болше, я так и нахожусь в pos=1,2,3,0 - в зависимости от последней выбранной по key2

Выручайте пожалста!

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Плохо видно уровень вложенности ifов с таким выравниванием кода. Нажмите Ctrl+T в Arduino IDE и отредактируйте своё сообщение.

И что за конструкция такая в строке 06? Почему prvMlstimeM=millis(), pos=0; через запятую?

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

Сори поправил, кусочек от самого loop :)

void loop(){
  if (irrecv.decode(&results)){
    val=results.value;
//=====Для начала проверим включено или вЫключено реле питания системы*     
    if (val==key0){                        //Принимаемы код с "левого" пульта *power
      if (digitalRead(Out0)){              //Проверяем состояние реле
        digitalWrite(Out0,LOW), pwrOn=0;}  //Выключаем реле 
      else{                                //Или....
        digitalWrite(Out0,HIGH),pwrOn=1;}  //Включаем реле
      delay(2000);                         //Чутку ждём после приёма
      pos=0;                               //Устанавливаем позицию меню эквалайзера в начало (громкость)
      if (pwrOn==1){
        irsend.sendNEC(0x40BE28D7,32);}    //Посылаем *user (чтобы звук как надо был сразу)
    }
    if (pwrOn==1){                         //Если питание включено можно "подменивать" команды
//=====Приглушение общей громкости*
      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 (millis()-prvMlstimeM>5000)     //Проверяем интервал для обновления 
          prvMlstimeM=millis(); pos=0;}    //Если времы вЫшло возвращаемся в регулировку громкости
//=====Перемещение по меню эквалайзера*   
      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(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BEF00F,32);}    //Посылаем нужный код с Ir-передатчика *vol up+
      else if (val==key4 && pos==0){       //Если нажато на "левом" пульте *down
        delay(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BEE01F,32);}    //Посылаем нужный код с Ir-передатчика *vol down-

может нахождению в меню тоже присвоить флаг, и опускать его по истечении времени? только я немогу понять как описать это кодом....

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ещё запятые в 7, 9 строках. В 24 строке после if() надо фигурные скобки. В общем, перепешите сначала все if...else таким образом:

if(условие) {
  действие1;
  действие2;
}
else {
  действие1;
  действие2; 
}

Вместо запятой - точка с зяпятой и с переносом на следующую строку. И в последнем примере количество открытых фигурных скобок не соотсветствует количеству закрытых.

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

Упс... счас счас (хотя скобки обычно проверяются и не скомпилируеш, ошибки выдаст в комменте). Счас всё поправлю.....

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

Решил докопатсья до сути и понять почему не возвращается pos-0; когда ей положено, решил помониторить в Serial.prin всю кухню кода. И обнаружил, что где бы я незапускал таймер он всегда останавливался если отсутсвовало нажатие кнопок (я так понял закрывающая скобка } был не на месте. Когда она была на месте :) код работал как хотел, мог включать реле черз:

unsigned long prvMlstimeM=0;               //Предыдущее показание обновления таймера

и так далее. Вобщем решил пойти простым путем и создал допонительно функцию таймера void timer(){...} которая выполнялась бы при само собой включенном основном реле и любой позиции в меню эквалайзера отлиной от 0, тоесть везде кроме общей ГРОМКОСТИ

В Serial.print вывел позицию в меню и собственно сами millis:

Serial.print("pos  ");
Serial.println(pos);
Serial.println("***");
Serial.print("imeM ");
Serial.println(prvMlstimeM);

и обнаружил когда и при каких скобках { } всё выполнялось правильно :) Теперь работает все как надо идаже при случайном нажатии спустя 15 сек уже небудеш вместо громкости по каналам регулировать басы и психовать :(

Собственно полностью рабочий и готовый код (убрал mute, потмоу как совсем ненужно и совпадает с mute звуковой карты, сами понимаете может случиться шахматный пордядок и при выключенной аккустике и нажатом на звковухе mute обратное без полной синхронизации невозможно):

#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

//=====Other_Relay*
#define Out0 5                             //Используем цифровой Порт 5 для реле отключения питания
byte pwrOn=0;                              //Флаг Включения реле

//=====Menu*
byte pos=0;                                //Позиция эквалайзера

//=====Delays*
unsigned long prvMlstimeM=0;               //Предыдущее показание обновления таймера меню эквалайзера

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();                     //Включаем Ir-приёмник
  digitalWrite(Out0,LOW);
}

//=====Запуск таймера при нахождении в меню эквалайзера*
void timer(){
  if (pos!=0){                            //Если находимся в любой позицц меню эквалайзера
    if (millis()-prvMlstimeM>15000){      //Проверяем интервал для обновления
       prvMlstimeM=millis(); 
        pos=0;                            //Если времы вЫшло возвращаемся в регулировку громкости
    }
  }
}

void loop(){
  if (irrecv.decode(&results)){
    val=results.value;
//=====Для начала проверим включено или вЫключено реле питания системы*     
    if (val==key0){                        //Принимаемы код с "левого" пульта *power
      if (digitalRead(Out0)){              //Проверяем состояние реле
        digitalWrite(Out0,LOW), pwrOn=0;}  //Выключаем реле 
      else{                                //Или....
        digitalWrite(Out0,HIGH),pwrOn=1;}  //Включаем реле
      pos=0;                               //Устанавливаем позицию меню эквалайзера в начало (громкость)
      delay(3000);                         //Чутку ждём после приёма
      if (pwrOn==1){                       //Когда включилось питание (реле)
        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(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BEF00F,32);}    //Посылаем нужный код с Ir-передатчика *vol up+
      else if (val==key4 && pos==0){       //Если нажато на "левом" пульте *down
        delay(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BEE01F,32);}    //Посылаем нужный код с Ir-передатчика *vol down-
//=====Изменение низких частот*
      if (val==key3 && pos==1){            //Если нажато на "левом" пульте *up
        delay(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BEDA25,32);}    //Посылаем нужный код с Ir-передатчика *bass+
      else if (val==key4 && pos==1){       //Если нажато на "левом" пульте *down
        delay(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BEEA15,32);}    //Посылаем нужный код с Ir-передатчика *bass-      
//=====Изменение средних частот*      
      if (val==key3 && pos==2){            //Если нажато на "левом" пульте *up
        delay(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BE7A85,32);}    //Посылаем нужный код с Ir-передатчика *middle+
      else if (val==key4 && pos==2){       //Если нажато на "левом" пульте *down
        delay(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BE42BD,32);}    //Посылаем нужный код с Ir-передатчика *middle- 
//=====Изменение высоких частот*
      if (val==key3 && pos==3){            //Если нажато на "левом" пульте *up
        delay(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BEFA05,32);}    //Посылаем нужный код с Ir-передатчика *treb+
      else if (val==key4 && pos==3){       //Если нажато на "левом" пульте *down
        delay(300);                        //Чутку ждём после приёма
        irsend.sendNEC(0x40BEC23D,32);}    //Посылаем нужный код с Ir-передатчика *treb-
//=====Выход из настроек эквалайзера*
      if (val==key5){                      //Принимаемы код с "левого" пульта, если нажато *return
        delay(300);                        //Чутку ждём после приёма
        pos=0;
      }                                    //Просто переходим в начальную позицию эквалайзера (громкость)
    }
    irrecv.enableIRIn();                   //Снова Включаем Ir-приёмник
    irrecv.resume();                       //Receive the next value
    delay(100);
  }
}

Спасибо за участие в моей беде!

 

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

Решил выложить готовый проект с фоточками :( ну малоли пригодится такая фигня с приёмо-передатчиком Ir.

Незнаю почему разработчики такой недешовой аккустики (более 500уе) незаложили функцию вЫключения с пульта (только с тумблера сзади корпуса), а применили так standbay усилителя но питалово всеарвно подается на транс и всё схему. Внутри стоит довольно мощный тороидальный транс с двумя оботками (питание УМЗЧ - духполярное). Ну да несуть... Вобщем в разрыв цепи 220В (после тумблера и предохранителя вставлено 5В реле. Питание (дежурное в моем случае) от ЗУ для мобильных устройств, импульсное, ровно 4,82В :). С помощью ардуинки и тестового скетка нашёл data - провод что идет с лицевой панели (там установлен IR приёмник, и кнопки упрвления громкостью и эквалайзером). Прям она плате распаял параельный Ir-приёмник- которй и будет принимать "изменнёные команды любого другого пульта). Т.к. са усилок выполнен в корпусе саба там все отлично загерметизировано и проклеено НЕПЛОХИМ термоклеем. Сначал хотел на Proini замутить но чую придётся иногда и коды кнопок менять да и так с nano прощще прошиваться итп.

В итоге почемуто !!!! при рАзмокнутой 220В цепи (один провод разрывается) БП для Ардуинки что т овыдает.. это заметно по постоянному миганию светика питания на ней, с одним Бп это 1Гц с дургим 0,5Гц, может это как то связано именно с трансформтаором что также в параели подключен но также рАзомкнут одним концом при этом. Вобщем немешает но странно (ардуинка то в любом случае выключена).

вот код, добавил снижение громкости при выключении (чтобы небахало) как и при включении и удержание кнопки 0xfffffff имеется ввиду (ноечень удобно клацать кнопками лучьше держать)

#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

//=====Other_Relay*
#define Out0 4                             //Используем цифровой Порт 4 для реле отключения питания
byte pwrOn=0;                              //Флаг Включения реле

//=====Menu*
byte pos=0;                                //Позиция эквалайзера

//=====Delays*
unsigned long prvMlstimeM=0;               //Предыдущее показание обновления таймера меню эквалайзера

void setup(){
  irrecv.enableIRIn();                     //Включаем Ir-приёмник
  pinMode(Out0,OUTPUT);                    //Определяем инверсные выход реле 
  digitalWrite(Out0,HIGH);                 //Определяем выход реле как вЫключенный
}

//=====Запуск таймера при нахождении в меню эквалайзера*
void timer(){
  if (pos!=0){                             //Если находимся в любой позицц меню эквалайзера
    if (millis()-prvMlstimeM>20000){       //Проверяем интервал для обновления
       prvMlstimeM=millis(); 
        pos=0;}                            //Если времы вЫшло возвращаемся в регулировку громкости
  }
}

void loop(){
  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);
  }
}

И фото внутри:

и

и