Étape 3: Détection des bords
Quand on veut attraper, arêtes ou transitions, nous devons améliorer légèrement le programme de l’étape précédente.
Nous introduisons une variable globale (button_was_pressed) qui se souvient de la dernière lire État, afin que nous puissions détecter un changement d’État.
Dans cet exemple, nous avons détecter les transitions de ne pas pressé pressé et signalera par un événement, tel qu’indiqué sur la première photo de cette étape.
Programmation
À chaque itération, si nous avons un événement, nous vous enverrons un signe d’insertion à la ligne sérielle, sinon un point. Voir la deuxième photo de cette étape. Encore une fois, pour une longue presse et deux courtes presses. Notez que la presse longue a généré un seul événement.
Dans le code ci-dessous, Notez également que j’ai choisi les noms de variables (button_now_pressed) qui représente un niveau élevé d’abstraction (l’état du bouton) et non l’État électrique (bouton, mener ou non, ni électrique valeur lue sur l’axe).
Pro/Cons
Mise en œuvre toujours simple. L’introduction des variables globales commence à mettre l’évolutivité du programme à risque. Pour un bouton, mais toujours tout à fait d’accord.
Code
––––––––––8<––––––––––
#define BUTTON_PIN 2 // Button #define DELAY 20 // Delay per loop in ms boolean button_was_pressed; // previous state void setup() { pinMode(BUTTON_PIN, INPUT); digitalWrite(BUTTON_PIN, HIGH); // pull-up Serial.begin(9600); button_was_pressed = false; } boolean handle_button() { boolean event; int button_now_pressed = !digitalRead(BUTTON_PIN); // pin low -> pressed event = button_now_pressed && !button_was_pressed; button_was_pressed = button_now_pressed; return event; } void loop() { // handle button boolean raising_edge = handle_button(); // do other things Serial.print(raising_edge ? "^" : "."); // add newline sometimes static int counter = 0; if ((++counter & 0x3f) == 0) Serial.println(); delay(DELAY); }
––––––––––>8––––––––––