Работа с 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-приёмник - безрезультатно... Помогите пожалста...
Кстати с "коротким" вариантом Ir куска кода
срабатывания по кнопке пульта происходит НАМНОГО чащще.
Добавил "визуализацию" на предмет ПЕРЕДАЧИ Ir простым способом
в setup pinMode(13,OUTPUT); digitalWrite(13,LOW);
и в код после каждой отправки по кнопке это или по Ir-пульту
и чт оя увидел... Т очто отпрака хреначит и ДО нажатия кнопки и после постоянно - поэтому при ДЛИННОМ коде для работы с IR-пробросом пульт вообще невоспринимался, значит я всеже НЕПРАВИЛЬНО описал выполнение кода с механической кнопкой. Уже думаю оставить это дело пока ума нехватает и выполнять простой вкл\вЫкл - без дополнительной отправки Ir-кода передатчиком :(
Вобщем додвёл до Ума код :). Дело было не в бобине... Возможно и сейчас несильно идеальный код (особенно при работе с обычной кнопкой) но работает как часики прям приятно.
Оказывается при работе с кнопкой мне нужно было нетолько знать какое значение она присвоила переменной необходимости включить реле (вслед за этим отправить Ir-код при включении и ровно наоборот при вЫключении с паузами между посылкой и включением\отключением) но и как её сравнить с мгновеноым нажатием.
Ведь раньше я почему такой злой был... имеется ввиду почему при нажатии у меня бесконенчо отправлялся код и тп потмоу что несравнивался нисчем :)
Вот что вышло, цикл общий как всегда развбил на два чтобы легче искать ошибки, всяки визуализации работы отправки Ir-кодой удалил и прочее. Выкладываю мало ли кому пригодится, так как готовго ненашёл (плохо искал может).