Вот и я созрел до своего подхода к обработке нажатий на кнопки. Правда я использую их в связке кнопка-ардуино-ИК диод для управления магнитолой. Почему не устроили скетчи в теме?
1 - пропуски нажатий, 2 - иногда получаем неверное значение, вплоть до другой кнопки, 3 - повторные срабатывания.
Для исследования что же происходит при нажатии соорудил небольшой скетч (его же использую в основной программе с добавкой функции на передачу сигнала ИК.
PHP код:
#define PIN 6 //номер аналогового порта
int sensorValue[5]; // сопротивление кнопки
byte count=5;
int sensorVal, sum;
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 = 0; i < 5; i++) {
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% случаев оказывалось слишком сильно отличающимся от номинального.
С таким алгоритмом программа у меня работает совершенно без нареканий. Готов к критике и вопросам