Paso 2: Toma de muestras, Deglitching y Estados de lectura
Los botones son como muchas cosas: imperfecto. Incluso cuando da una firme sensación mecánica, generan un par de oscilaciones cuando el botón de posición de cambios.
Estas oscilaciones se denominan interferencias o rebotes. Se puede eliminar agregando un condensador (introducción de algo de retraso), o por software.
Filtrado por muestreo
A menudo, la aplicación de Arduino es lazo ()-base, es decir, hace algo, y luego duerme un rato, varias veces. Puede buscar el código del botón estado muestra como:
void loop() { // handle button boolean button_pressed = read_button(); // do other things do_stuff(button_pressed); // sleep a moment before next iteration delay(DELAY); }
Esto significa que al menos demorar elapse milisegundos entre muestreos sucesivos de botón. Función de retardo, esto nos hará insensibles a las interferencias. La respuesta no es totalmente exacto, pero en gran medida suficiente: habrá alguna variación en la magnitud del retraso. Debe asegurarse que las cosas que hacemos durante cada ciclo tardan una "pequeña" y comparables para cada iteración.
La primera foto de este paso muestra los problemas y la toma de muestras periódica (indicado en azul).
El estado de lectura
El código siguiente muestra cómo se realiza el muestreo periódico. Cuando el botón se ve como un punto no presiona, es enviado a la línea serie; Cuando el botón es pulsado, se envía un carácter de intercalación.
La segunda foto de este paso muestra la salida serial, una pulsación larga seguida de dos cortas pulsaciones.
Programación
En el código a continuación, tenga en cuenta que he elegido un nombre de variable (button_pressed) que representa un alto nivel de abstracción (el estado de botón) y no el estado eléctrico (botón, llevando a cabo o no, ni eléctrico valor leído en el pasador), que sería confuso por el hecho de que, debido a la resistencia de pull-up, el perno Lee alta cuando se suelta el botón.
Pro/contras
Aplicación muy simple. Adecuado para el control continuo (e.g. pedal de descanso).
Inadecuado control incremental (por ejemplo control de volumen incremental)--que se explica en el siguiente paso.
Código
––––––––––8<––––––––––
#define BUTTON_PIN 2 // Button #define DELAY 20 // Delay per loop in ms void setup() { pinMode(BUTTON_PIN, INPUT); digitalWrite(BUTTON_PIN, HIGH); // pull-up Serial.begin(9600); } boolean handle_button() { int button_pressed = !digitalRead(BUTTON_PIN); // pin low -> pressed return button_pressed; } void loop() { // handle button boolean button_pressed = handle_button(); // do other things Serial.print(button_pressed ? "^" : "."); // add newline sometimes static int counter = 0; if ((++counter & 0x3f) == 0) Serial.println(); delay(DELAY); }
––––––––––>8––––––––––