Paso 4: Distinción de corto de Prensas de largo
Muchos dispositivos con pocos controles (por ejemplo digital relojes) pack múltiples funciones por botón.
Es muy útil, ahorrando valioso volumen, pero deben utilizarse con prudencia, de lo contrario el dispositivo puede ser poco intuitivo para usar.
Distinguir corto largo Prensas es medir la longitud del pulso.
El evento ya no se emite al presionar el botón, pero al soltarlo. Esto puede afectar la sensación de capacidad de respuesta. Pero hasta que los dispositivos no-causal pueden adquirirse, no se puede predecir la duración y por lo tanto, debe proceder así.
Este es un evento combinado y manejo de estado: detectar el cambio de estado (un evento) y la duración que el estado resultante es duradero.
Programación
Así que tenemos que introducir otra variable global (button_pressed_counter). Tenga en cuenta también que el evento no tiene un valor de tipo boolean (evento presente o no, como en el paso anterior), pero los tres Estados. Son definidos por una enumeración. (Tuve problemas de definición de un tipo enum; ¿Tema específico de Arduino? Así solía enum para definir constantes).
La primera foto de este paso muestran una pulsación larga y una sincronización de pulsación corta, con un umbral de pulsación larga de 3 periodos de muestreo (que es demasiado corto, pero adaptado al dibujo).
La segunda imagen muestra la salida serial para una pulsación larga seguida de dos cortas pulsaciones.
Pro/contras
Muy bien mejora la funcionalidad de botón (si se usa sabiamente, para asegurar la buena usabilidad). Pero el código comienza a crecer y conseguir contaminada por variables globales... El siguiente paso muestra la variante OO, para escalar.
Código
––––––––––8<––––––––––
#define BUTTON_PIN 2 // Button #define LONGPRESS_LEN 25 // Min nr of loops for a long press #define DELAY 20 // Delay per loop in ms enum { EV_NONE=0, EV_SHORTPRESS, EV_LONGPRESS }; boolean button_was_pressed; // previous state int button_pressed_counter; // press running duration void setup() { pinMode(BUTTON_PIN, INPUT); digitalWrite(BUTTON_PIN, HIGH); // pull-up Serial.begin(9600); button_was_pressed = false; button_pressed_counter = 0; } int handle_button() { int event; int button_now_pressed = !digitalRead(BUTTON_PIN); // pin low -> pressed if (!button_now_pressed && button_was_pressed) { if (button_pressed_counter < LONGPRESS_LEN) event = EV_SHORTPRESS; else event = EV_LONGPRESS; } else event = EV_NONE; if (button_now_pressed) ++button_pressed_counter; else button_pressed_counter = 0; button_was_pressed = button_now_pressed; return event; } void loop() { // handle button boolean event = handle_button(); // do other things switch (event) { case EV_NONE: Serial.print("."); break; case EV_SHORTPRESS: Serial.print("S"); break; case EV_LONGPRESS: Serial.print("L"); break; } // add newline sometimes static int counter = 0; if ((++counter & 0x3f) == 0) Serial.println(); delay(DELAY); }
––––––––––>8––––––––––