
 Сообщение от 
Hmelik
					 
				 
				я в итоге решил переделать на кнопки с резисторных на матричные.
Не удалось достичь успеха. Пробовал менять время в прошивке.
Добился что получаю двойное нажатие, с стандартным параметром тоже устойчивость не радует, или нажмёт 1 раз и быстро, или не нажмёт ваще, или выдаст двойное нажатие(т.к. если не сработало продолжаю держать)
			
		 
	 
 Добавлю свои 5 копеек. Такие же проблемы были, сколько не изгалялся с подбором времени задержки "дребезга" - не удалось добиться полность 100% реакции, как в штатной магнитоле.
В итоге перенес логику определения какая кнопка нажата полностью в ардуину, т.е. на выходе она выдает в компорт код нажатой кнопки, а не значение из АЦП. Получилось громоздко, зато теперь никаких двойных нажатий или проглатывания нажатой кнопки нет.
	PHP код:
	
// Для рулевых кнопок
// Задержки между нажатиями конкретных кнопок, миллисекунды
#define KEY_CH_MINUS_DELAY    (200)
#define KEY_CH_PLUS_DELAY     (200)
#define KEY_VOL_MINUS_DELAY   (150)
#define KEY_VOL_PLUS_DELAY    (150)
#define KEY_MODE_DELAY        (300)
// Значения кнопок
#define KEY_CH_MINUS    (445)
#define KEY_CH_PLUS     (640)
#define KEY_VOL_MINUS   (90)
#define KEY_VOL_PLUS    (270)
#define KEY_MODE        (805)
// Погрешность при чтении кнопок
#define KEY_DELTA       (30)
// Коды кнопок, что отсылаем в порт внешней проге
#define CH_MINUS    (1)
#define CH_PLUS     (2)
#define VOL_MINUS   (3)
#define VOL_PLUS    (4)
#define MODE        (5)
#define NONE        (0)
unsigned long LastTimeKeyPressed = millis();
int LastKeyPressed = NONE;
void setup()      
{     
Serial.begin(57600);
}      
void loop()      
{   
  ReadSteering();
  delay(50);
} 
// Читает рулевые кнопки и пишет в порт код нажатой кнопки
void ReadSteering()      
{   
  unsigned long TimeKeyPressed;
  int KeyPressed = NONE;
  int dt1 = analogRead(0);
  delay(50); 
  int dt2 = analogRead(0);
  if (abs(dt1-dt2)<=5 and dt1<900 ) //если нет дребезга и что-то есть
  { 
    // Регистрируем время нажатия кнопки
    TimeKeyPressed = millis();
    //CH_MINUS    
    if ( (dt1-KEY_DELTA <= KEY_CH_MINUS) and (dt1+KEY_DELTA >= KEY_CH_MINUS) )
    {
      if ( (LastKeyPressed != CH_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_MINUS_DELAY) )
      {
        LastKeyPressed = CH_MINUS;
        KeyPressed = CH_MINUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //CH_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_CH_PLUS) and (dt1+KEY_DELTA >=KEY_CH_PLUS) )
    {
      if ( (LastKeyPressed != CH_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_CH_PLUS_DELAY) )
      {
        LastKeyPressed = CH_PLUS;
        KeyPressed = CH_PLUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //VOL_MINUS
    else if ( (dt1-KEY_DELTA <= KEY_VOL_MINUS) and (dt1+KEY_DELTA >=KEY_VOL_MINUS) )
    {
      if ( (LastKeyPressed != VOL_MINUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_MINUS_DELAY) )
      {
        LastKeyPressed = VOL_MINUS;
        KeyPressed = VOL_MINUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    //VOL_PLUS
    else if ( (dt1-KEY_DELTA <= KEY_VOL_PLUS) and (dt1+KEY_DELTA >=KEY_VOL_PLUS) )
    {
      if ( (LastKeyPressed != VOL_PLUS) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_VOL_PLUS_DELAY) )
      {
        LastKeyPressed = VOL_PLUS;
        KeyPressed = VOL_PLUS;
        LastTimeKeyPressed = TimeKeyPressed;
      }
    }
    //MODE
    else if ( (dt1-KEY_DELTA <= KEY_MODE) and (dt1+KEY_DELTA >=KEY_MODE) )
    {
      if ( (LastKeyPressed != MODE) or (abs(TimeKeyPressed-LastTimeKeyPressed) >= KEY_MODE_DELAY) )
      {
        LastKeyPressed = MODE;
        KeyPressed = MODE;
        LastTimeKeyPressed = TimeKeyPressed;
      }  
    }
    
    if (KeyPressed != NONE)
    {
      Serial.print(char(255));
      Serial.print(KeyPressed,DEC);
    }  
    //Serial.print(dt1,DEC);
    //Serial.print("   ");
    //Serial.println(dt2,DEC);
  }   
}