Étape 4: Distinguer court de Presses longues
Beaucoup de dispositifs avec quelques contrôles pack (par exemple numérique montres) plusieurs fonctions par touche.
Il est très utile, économiser le précieux volume, mais doit être utilisé à bon escient, sinon l’appareil peut être intuitif à utiliser.
Distinguant court des presses longs est sur la mesure de la longueur de l’impulsion.
L’événement est émis n’est plus en appuyant sur le bouton, mais de le relâcher. Cela peut affecter le sentiment de la réactivité. Mais jusqu'à ce que les dispositifs non causal peuvent être achetés, on ne peut pas prévoir la durée et doit par conséquent procéder ainsi.
C’est une épreuve du combiné et la gestion d’État : nous détecter le changement d’État (un événement) et la durée pendant laquelle l’état résultant est durable.
Programmation
Il faut donc introduire une autre variable globale (button_pressed_counter). Notez également que l’événement a n’est plus une valeur booléenne (événement présent ou non, comme dans l’étape précédente), mais trois États. Ils sont définis par un enum. (J’ai eu des ennuis en définissant un type enum ; Arduino-spécifiques au problème ? J’ai donc utilisé enum pour définir les constantes).
La première photo de cette étape montrent une pression prolongée et un timing Appuyez rapidement, avec un seuil de pression longue de 3 périodes d’échantillonnage (ce qui est beaucoup trop court, mais adapté au dessin).
La deuxième photo montre la sortie série d’une pression longue suivie de deux impulsions courtes.
Pro/Cons
Joliment améliore la fonctionnalité du bouton (si utilisées de façon judicieuse pour assurer la facilité d’utilisation). Mais le code commence à se développer et obtenir pollués par des variables globales... L’étape suivante montre la variante OO fait pour mise à l’échelle.
Code
––––––––––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––––––––––