Перенаправление Ir-кодов (подмена пультика :)
- Войдите на сайт для отправки комментариев
Доброго времени форумчане и форумчанки. Решил заморочится, имеется система с пультиком 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+
спасибо!
Господа вы неповерите, все оказалось БАНАЛЬНО просто, но суко вычислить удалось совершенно случайно.
Я чутку поправил код, пока едер релюша 5-ти вольтовая на вкл\выкл всей системы можно поиграться с кодом.
Добавил возможность регулировать эквалайзер (входом в меню и кнопками регулировки громкости подпунктов, высокие, средние, низкие). По аналогии можно (но это лиш запутает) можно регулировтаь громкости самих 5,1 каналов отдельно друг от друга но де-факто все всегда ОДИНАКОВО :) по уровню;
Выполнение "проброса" кнопок тольк опри Включенной системе (чтобы негонять коды когда ненужно);
Вот новый кусочек кода....
реле скорее всего будет управляться инвернсо (нужно будет заменить HIGH на LOW в коде и все ну и в сетапе)
А теперь почемуже нерегулировалась громкость вверх (точнее непробрасывался код). Все дело в комментарии вида а именно в
/\
//Если нажато на "левом" пульте *up/\
вот-уж незнаю почему но //-неработало как надо в данном случае
Всё дело в символе \ (обратный слэш) в конце строки 39.
"В стандарте C99 и в C++ описан еще один тип комметариев: //. Он действует в пределах от самой последовательности двух слэшей до следующего перевода строки. Если в конце строки стоит символ \ , считается комментарием и следующая строка."
Получается, у Вас таким образом была закоментирована строка 40. В то же время в строке 42 также есть символ \ , но он не последний в строке. Поэтому там всё нормально.
Спасибо я помоему вкурил... если коментить целые куски кода в начале /* то все что после невыполнялось и так до символа */
А тут ну почти тоже самое только ктобы знал что простое "графическое" якобы описание кнопки стрелками вниз :) так себя поведёт..
/* да, большой многострочный кусок кода комментируем так */
// одну строку комментируем так, но в конце не должно быть символа \ , иначе закомментируется и строка ниже этой
Тут один мелкий НО пакостный момент (я его предвидел но недумал чт оон так помешает)...
это собственно время нахождения в менюшках эквалайзера. Сейчас нахождение там и перемещение собственно осуществляется тремя кнопочками (вход\выход - одна и две вверх и вниз (уменьшение\увеличение). Саи думаю понимаете что они нужны разово а вот регулятор громкости чащще (постоянно). И пока я невыйду из меню в pos=0 (регулировка громкости\уровня звука) то мои кнопки вверх\вниз работают в pos=1,2,3 попытался впихнуть некий таймер, задав в переменных:
и вход\выход в меню эквалайзера:
и собственно ничегошеньки невыходит ни спустя 5 сек ни болше, я так и нахожусь в pos=1,2,3,0 - в зависимости от последней выбранной по key2
Выручайте пожалста!
Плохо видно уровень вложенности ifов с таким выравниванием кода. Нажмите Ctrl+T в Arduino IDE и отредактируйте своё сообщение.
И что за конструкция такая в строке 06? Почему prvMlstimeM=millis(), pos=0; через запятую?
Сори поправил, кусочек от самого loop :)
может нахождению в меню тоже присвоить флаг, и опускать его по истечении времени? только я немогу понять как описать это кодом....
Ещё запятые в 7, 9 строках. В 24 строке после if() надо фигурные скобки. В общем, перепешите сначала все if...else таким образом:
Вместо запятой - точка с зяпятой и с переносом на следующую строку. И в последнем примере количество открытых фигурных скобок не соотсветствует количеству закрытых.
Упс... счас счас (хотя скобки обычно проверяются и не скомпилируеш, ошибки выдаст в комменте). Счас всё поправлю.....
Решил докопатсья до сути и понять почему не возвращается 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 обратное без полной синхронизации невозможно):
Спасибо за участие в моей беде!
Решил выложить готовый проект с фоточками :( ну малоли пригодится такая фигня с приёмо-передатчиком Ir.
Незнаю почему разработчики такой недешовой аккустики (более 500уе) незаложили функцию вЫключения с пульта (только с тумблера сзади корпуса), а применили так standbay усилителя но питалово всеарвно подается на транс и всё схему. Внутри стоит довольно мощный тороидальный транс с двумя оботками (питание УМЗЧ - духполярное). Ну да несуть... Вобщем в разрыв цепи 220В (после тумблера и предохранителя вставлено 5В реле. Питание (дежурное в моем случае) от ЗУ для мобильных устройств, импульсное, ровно 4,82В :). С помощью ардуинки и тестового скетка нашёл data - провод что идет с лицевой панели (там установлен IR приёмник, и кнопки упрвления громкостью и эквалайзером). Прям она плате распаял параельный Ir-приёмник- которй и будет принимать "изменнёные команды любого другого пульта). Т.к. са усилок выполнен в корпусе саба там все отлично загерметизировано и проклеено НЕПЛОХИМ термоклеем. Сначал хотел на Proini замутить но чую придётся иногда и коды кнопок менять да и так с nano прощще прошиваться итп.
В итоге почемуто !!!! при рАзмокнутой 220В цепи (один провод разрывается) БП для Ардуинки что т овыдает.. это заметно по постоянному миганию светика питания на ней, с одним Бп это 1Гц с дургим 0,5Гц, может это как то связано именно с трансформтаором что также в параели подключен но также рАзомкнут одним концом при этом. Вобщем немешает но странно (ардуинка то в любом случае выключена).
вот код, добавил снижение громкости при выключении (чтобы небахало) как и при включении и удержание кнопки 0xfffffff имеется ввиду (ноечень удобно клацать кнопками лучьше держать)
И фото внутри: