Paso 3: Detección de bordes
Cuando queremos coger los bordes o transiciones, tenemos que mejorar un poco el programa del paso anterior.
Introducimos una variable global (button_was_pressed) que recuerda la última Lee estado, por lo que podemos detectar un cambio de estado.
En este ejemplo, detectar las transiciones de no presiona a y será señal de un evento, como se muestra en la primera foto de este paso.
Programación
En cada iteración, si tenemos un evento, te enviaremos un cursor a la línea serie, de lo contrario un punto. Ver la segunda foto de este paso. Oprima nuevamente, una larga y dos cortas prensas. Observe que la pulsación larga ha generado sólo un evento.
En el código de abajo, también tenga en cuenta que he elegido nombres de variables (button_now_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).
Pro/contras
Implementación simple todavía. La introducción de variables globales se empieza a poner la escalabilidad del programa riesgo. Para un botón, todavía aunque está bastante bien.
Código
––––––––––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––––––––––