Устранения дребезга кнопок

Nazka
Offline
Зарегистрирован: 02.04.2016

Привет все! Сделал пульт ИК для магнитолы, но есть один косяк: иногда при нажатии кнопки, ИК светодиод бывает горит, или кнопки плохо срабатывают. Я полагаю, это дребезг кнопок. Как можно это устранить? Код прикладываю

#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;
    }
  }
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

забейте в поисковик

ардуино кнопки на аналоговом входе и посмотрите как это реализуется

почитайте http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...

вы закладываете очень маленькие интервалы - здесь возможны постоянные глюки из-за нестабильности считываемых значений
для надёжности давайте хотя бы 50

Nazka
Offline
Зарегистрирован: 02.04.2016

Есть небольшой еще вопрос, при нажатии кнопки,команда отрабатывается, но светодиод порой остается гореть, просто гореть

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Нужно начать с чтения книг по программированию.

Это будет работать не так, как ты того хочешь:

if (val1>430&&val1<490)//Громкость+

Строки 40. 47, 53, 59, 75, 81, 88, 94 тоже.

Nazka
Offline
Зарегистрирован: 02.04.2016

Про чтение книг, это понятно. А почему не будет работать так как я хочу? 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

извиниэтомояошибканеразгляделамперсантыпишувудобномтебестиле

Nazka
Offline
Зарегистрирован: 02.04.2016
if (val1>430 && val1<490)//Громкость+ , так бы и сказал