Устранения дребезга кнопок
- Войдите на сайт для отправки комментариев
Сб, 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 тоже.
Про чтение книг, это понятно. А почему не будет работать так как я хочу?
извиниэтомояошибканеразгляделамперсантыпишувудобномтебестиле