Устранения дребезга кнопок
- Войдите на сайт для отправки комментариев
Сб, 04/02/2017 - 17:36
Привет все! Сделал пульт ИК для магнитолы, но есть один косяк: иногда при нажатии кнопки, ИК светодиод бывает горит, или кнопки плохо срабатывают. Я полагаю, это дребезг кнопок. Как можно это устранить? Код прикладываю
#include <IRremote.h> IRsend irsend; const int read1 = 6;//левый блок кнопок const int read2 = 7;//правый блок кнопок float val1=0; float val2=0; float lastval1=0; float lastval2=0; int pause1=180;//Задержка после нажатия кнопок int pause2=200;//Задержка после нажатия кнопrи SRC // Коды снятые с пульта //[Влево] 9D6250AF //[Вправо] 9D62D02F //[Громкость +] 9D6228D7 //[Громкость –] 9D62A857 //[ + ] 9D62B04F //[ – ] 9D6230CF //[SRC] 9D62C837 //Пауза 9D62708F void setup() { pinMode (read1, INPUT_PULLUP); //PULLUP, это подключение подтягивающего резистора для msp430 pinMode (read2, INPUT_PULLUP); Serial.begin(9600); } void loop() { val1 = analogRead(read1); val2 = analogRead(read2); /////////////////// Обработка правого блока кнопок ////////////////////// if (val1>10 && val1<1000)//фильтр от помех { if (val1 != lastval1)//если значение изменилось // Serial.print("Right "); // Serial.println(val1); { delay (pause1);//задержку подбирал на свой вкус if (val1>880&&val1<990)//Выбор источника, цифровые значения, снятые с кнопок { Serial.println(" R. SRS");//Контроль irsend.sendNEC(0x9D62C837, 32); lastval1=val1; delay (pause2);//дополительная задержка } if (val1>710&&val1<760)//Громкость- { Serial.println(" R. VOL-");//Контроль irsend.sendNEC(0x9D62A857, 32); lastval1=val1; } if (val1>310&&val1<360)//Пауза { Serial.println(" R. PAUSE");//Контроль irsend.sendNEC(0x9D62708F, 32); lastval1=val1; } if (val1>430&&val1<490)//Громкость+ { Serial.println(" R. VOL+");//Контроль irsend.sendNEC(0x9D6228D7, 32); lastval1=val1; } } } /////////////////// Обработка левого блока кнопок ////////////////////// if (val2>0 && val2<1000)//фильтр от помех { if (val2 != lastval2)//если значение изменилось { // Serial.print("Left "); // Serial.println(val2); delay (pause1);//задержку подбирал на свой вкус if (val2>100&&val2<140)//Вверх { Serial.println(" L. UP");//Контроль irsend.sendNEC(0x9D62B04F, 32); lastval2=val2; } if (val2>25&&val2<28)//Вниз { Serial.println(" L. DOWN");//Контроль irsend.sendNEC(0x9D6230CF, 32); lastval2=val2; } } if (val2>0&&val2<10)//Вправо { Serial.println(" L. RIGHT");//Контроль irsend.sendNEC(0x9D62D02F, 32); lastval2=val2; } if (val2>36&&val2<39)//Влево { Serial.println(" L. LEFT");//Контроль irsend.sendNEC(0x9D6250AF, 32); lastval2=val2; } } }
забейте в поисковик
ардуино кнопки на аналоговом входе и посмотрите как это реализуется
почитайте http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
вы закладываете очень маленькие интервалы - здесь возможны постоянные глюки из-за нестабильности считываемых значений
для надёжности давайте хотя бы 50
Есть небольшой еще вопрос, при нажатии кнопки,команда отрабатывается, но светодиод порой остается гореть, просто гореть
Нужно начать с чтения книг по программированию.
Это будет работать не так, как ты того хочешь:
Строки 40. 47, 53, 59, 75, 81, 88, 94 тоже.
Про чтение книг, это понятно. А почему не будет работать так как я хочу?
извиниэтомояошибканеразгляделамперсантыпишувудобномтебестиле