Вот и я созрел до своего подхода к обработке нажатий на кнопки. Правда я использую их в связке кнопка-ардуино-ИК диод для управления магнитолой. Почему не устроили скетчи в теме?
1 - пропуски нажатий, 2 - иногда получаем неверное значение, вплоть до другой кнопки, 3 - повторные срабатывания.
Для исследования что же происходит при нажатии соорудил небольшой скетч (его же использую в основной программе с добавкой функции на передачу сигнала ИК.
PHP код:
#define PIN 6  //номер аналогового порта 
int sensorValue[5];  // сопротивление кнопки
byte count=5;
int sensorValsum

void setup()   {
  
  
Serial.begin(9600); 
}
void loop(){
  if (
analogRead(PIN) < 950){
  
sensorValue[0] = analogRead(PIN); // прочитать данные АЦП   
  
delay(10);  
  
sensorValue[1] = analogRead(PIN); // прочитать данные АЦП    
  
delay(10);
  
sensorValue[2] = analogRead(PIN); // прочитать данные АЦП    
  
delay(10);
  
sensorValue[3] = analogRead(PIN); // прочитать данные АЦП    
  
delay(10);
  
sensorValue[4] = analogRead(PIN); // прочитать данные АЦП
  
count 0;
  
sum 0;
  for (
byte i 05i++) {
    if (
sensorValue[i] != 1023) { 
       
sum sum sensorValue[i];
       
count++;
    }
  
sensorVal sum count;     
  }
  
  
Serial.println(sensorValue[0],DEC);
  
Serial.println(sensorValue[1],DEC);
  
Serial.println(sensorValue[2],DEC);
  
Serial.println(sensorValue[3],DEC);
  
Serial.println(sensorValue[4],DEC);
  
Serial.print("R=");
  
Serial.println(sensorVal,DEC);
  
Serial.println("End");
  }

Смысл его - это 5 измерений через определенный интервал, отбрасывание значения ненажатой кнопки (а это как оказалось тоже имеет место), вычисление среднего значения. Как можно заметить, первое измерение в вычислениях не участвует, т.к. в моем случае оно в 90% случаев оказывалось слишком сильно отличающимся от номинального.
С таким алгоритмом программа у меня работает совершенно без нареканий. Готов к критике и вопросам