4. Farciment: esdeveniments¶
Els pendents¶
- Llegiu els esdeveniments associats a un botó.
- Respon als esdeveniments de botons.
Esdeveniments relacionats amb la factura¶
En llegir un botó, s’han de distingir els estats dels esdeveniments.
Un estat ** ** es manté amb el pas del temps. Un exemple d’estat és el valor premsat d’un botó. Mentre es prem el botó, l’estat val un. Quan no es prem el botó, l'estat val zero.
Un esdeveniment ** **, al contrari, només és cert al començament d’un nou estat. En el cas anterior, prement un botó, l'esdeveniment premsat val la primera vegada que llegeix. A partir d’aquest moment, sempre val la pena zero fins que es pressioni l’estat d’un botó.
Els ** esdeveniments ** són útils quan voleu realitzar una sola acció en prémer una tecla. Al gràfic següent podeu veure la diferència entre estat i esdeveniment.

El `` keyevents ''¶
-
int
keyEvents
(int keyNum)¶ Aquesta funció retorna el valor dels esdeveniments que es produeixen en un botó. Els esdeveniments que poden retornar la funció són els següents:
Aconteixement Significat Key_pressed_time1 El botó ha estat premsat durant 0,02 segons Key_pressed_time2 El botó ha estat premsat durant 0,5 segons Key_Pressed_Time3 El botó s'ha premut durant 2,0 segons Key_releed El botó ha deixat de prémer Aquests valors de temps són valors predefinits després d’iniciar la placa i es poden canviar a la configuració.
; Keynum |
Encendre un LED prement un botó un cert temps¶
En aquest exemple, un LED s'encendrà després que el botó es premeu més de mig segon
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // Enciende el led D1 cuando se pulse el pulsador 1 más de medio segundo
#include <Picuino.h>
void setup() {
pio.begin(); // Inicializar el shield Picuino UNO
}
void loop() {
// Si (evento del pulsador 1 es presionado-medio-segundo)
if (pio.keyEvents(1) == KEY_PRESSED_TIME2)
// Enciende el led D1
pio.ledWrite(1, LED_ON);
}
|
L’exemple es pot modificar fàcilment perquè s’encengui després de prémer dos segons.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // Enciende el led D1 cuando se presione el pulsador 1 más de dos segundos
#include <Picuino.h>
void setup() {
pio.begin(); // Inicializar el shield Picuino UNO
}
void loop() {
// Si (evento del pulsador 1) es presionado-medio-segundo
if (pio.keyEvents(1) == KEY_PRESSED_TIME3)
// Enciende el led D1
pio.ledWrite(1, LED_ON);
}
|
Múltiples funcions en un botó¶
Aquest exemple és una mica més complex i demostra la capacitat dels esdeveniments per donar més d’un significat a un sol botó. Gràcies a aquesta capacitat, un sol botó pot realitzar moltes funcions només.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // Enciende, apaga y parpadea D1 con un solo pulsador
#include <Picuino.h>
void setup() {
pio.begin(); // Inicializar el shield Picuino UNO
}
void loop() {
// Almacenar el evento en una variable
int event = pio.keyEvents(1);
// Si (evento del pulsador 1) es recién-presionado
if (event == KEY_PRESSED_TIME1)
// Apaga el led D1
pio.ledWrite(1, LED_OFF);
// Si (evento del pulsador 1) es presionado-medio-segundo
if (event == KEY_PRESSED_TIME2)
// Parpadea el led D1 rápido
pio.ledBlink(1, 20, 20);
// Si (evento del pulsador 1) es presionado-dos-segundos
if (event == KEY_PRESSED_TIME3)
// Elimina el parpadeo y enciende el led D1
pio.ledBlink(1, 0, 0);
}
|
Exercicis¶
Programa el codi necessari per resoldre els problemes següents.
El programa següent encén el LED D1 en prémer el botó D1 i apaga el LED D1 en prémer el botó de nou 1. S'utilitza una variable per emmagatzemar l'estat LED D1. Es demana que modifiqui el programa de manera que el LED D2 també s’encengui i s’apagui amb el botó 2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// Enciende y apaga el led D1 con el pulsador 1 #include <Picuino.h> int on_off_1; void setup() { pio.begin(); // Inicializa el shield Picuino UNO on_off_1 = 0; // El led D1 comienza apagado } void loop() { pio.ledWrite(1, on_off_1); // Enciende o apaga el led D1 // Si (evento de pulsador 1 es igual a pulsado) if (pio.keyEvents(1) == KEY_PRESSED_TIME1) { // Cambia el estado de encendido <--> apagado on_off_1 = 1 - on_off_1; } }
El programa següent mou un LED a la dreta quan es prem el botó. Modifiqueu el programa de manera que el LED es mogui a l'esquerra prement el botó 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// Mueve la luz a izquierda y derecha con los pulsadores 1 y 2 #include <Picuino.h> int led; void setup() { pio.begin(); // Inicializa el shield Picuino UNO led = 1; // Enciende primero el led D1 pio.ledWrite(led, LED_ON); } void loop() { // Si se pulsa la tecla derecha if (pio.keyEvents(KEY_RIGHT) == KEY_PRESSED_TIME1) { pio.ledWrite(led, LED_OFF); // Apaga el led actual led = led + 1; // Mover el led a la derecha if (led > 6) // Si se pasa por la derecha led = 1; // volver al inicio pio.ledWrite(led, LED_ON); // Enciende el nuevo led } }
Modifiqueu el programa anterior per activar el LED D1 quan premeu el botó 6 `` key_back`` durant dos segons.