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.

Diferencia entre estado y evento.

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.

  1. 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;
       }
    }
    
  2. 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
       }
    }
    
  3. Modifiqueu el programa anterior per activar el LED D1 quan premeu el botó 6 `` key_back`` durant dos segons.