6. Botons i esdeveniments

Pulsador.

Els pendents

  • Llegiu els esdeveniments associats a un botó.
  • Programa Arduino per respondre als esdeveniments del botó.

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 prement la condició 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.

La funció: cpp: func: keyales

int keyEvents(int keyNum, int event)

Aquesta funció retorna el valor dels esdeveniments que es produeixen en un botó. Els esdeveniments que la funció pot retornar 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
15
16
// Enciende el led D1 cuando se presiona el pulsador 1
// más de medio segundo

#include <Wire.h>
#include <PC42.h>

void setup() {
   pc.begin();        // Inicializar el módulo PC42
}

void loop() {
   // Si (pulsador 1 es presionado-medio-segundo)
   if (pc.keyEvents(1, KEY_PRESSED_TIME2))
      // Enciende el led D1
      pc.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
15
16
// Enciende el led D1 cuando se presione el pulsador 1
// más de dos segundos

#include <Wire.h>
#include <PC42.h>

void setup() {
   pc.begin();        // Inicializar el módulo PC42
}

void loop() {
   // Si (pulsador 1 es presionado-dos-segundos)
   if (pc.keyEvents(1, KEY_PRESSED_TIME3))
      // Enciende el led D1
      pc.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
// Tres funciones en el pulsador 1:
//   Al presionar poco tiempo, se enciende el led D1
//   Al presionar más de medio segundo, parpadea el led D1
//   Al presionar más de dos segundos, se apaga el led D1

#include <Wire.h>
#include <PC42.h>

void setup() {
   pc.begin();        // Inicializar el módulo PC42
}

void loop() {
   // Si (pulsador 1 es recién-presionado)
   if (pc.keyEvents(1, KEY_PRESSED_TIME1))
      // Enciende el led D1
      pc.ledWrite(1, LED_ON);

   // Si (pulsador 1 es presionado-medio-segundo)
   if (pc.keyEvents(1, KEY_PRESSED_TIME2))
      // Parpadea el led D1 rápido
      pc.ledBlink(1, 200, 200);

   // Si (pulsador 1 es presionado-dos-segundos)
   if (pc.keyEvents(1, KEY_PRESSED_TIME3))
      // Apaga el led D1
      pc.ledWrite(1, LED_OFF);
}

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
    21
    // Enciende y apaga el led D1 con el pulsador 1
    
    #include <Wire.h>
    #include <PC42.h>
    
    int on_off_1;
    
    void setup() {
       pc.begin();      // Inicializar el módulo PC42
       on_off_1 = 0;    // El led D1 comienza apagado
    }
    
    void loop() {
       pc.ledWrite(1, on_off_1);   // Enciende o apaga el led D1
    
       // Si (evento de pulsador 1 es igual a pulsado)
       if (pc.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
    24
    25
    // Mueve la luz a la derecha al presionar el pulsador 2
    
    #include <Wire.h>
    #include <PC42.h>
    
    int led;
    
    void setup() {
       pc.begin();             // Inicializar el módulo PC42
       led = 1;                // Enciende primero el led D1
    }
    
    void loop() {
    
       // Enciende el led actual
       pc.ledWrite(led, LED_ON);
       
       // Si se presiona la tecla derecha  
       if (pc.keyEvents(KEY_RIGHT, KEY_PRESSED_TIME1)) {
          pc.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
       }
    }
    
  3. Modifiqueu el programa anterior per activar el LED D1 i desactiveu la resta de LEDS prement el botó 6 `` key_back`` durant dos segons.