7. Pulsadores y Contadores

Pulsador.

Objetivos

  • Leer los contadores de tiempo y pulsaciones asociados a un pulsador.
  • Realizar acciones asociadas a los contadores de tiempo.

La función keyCount()

int keyCount(int keyNum)

Esta función devuelve el número de veces que se ha presionado un pulsador. El valor se incrementa en uno inmediatamente después de presionar el pulsador. Si se mantiene el pulsador presionado más de medio segundo, el contador de pulsaciones se incrementa a razón de 10 pulsos por segundo. Si el pulsador se mantiene presionado durante más de dos segundos, el contador de pulsaciones se incrementa a razón de 100 pulsos por segundo. Los tiempos y las frecuencias de incremento del contador se pueden modificar en la configuración del teclado.

keyNum: número del 1 al 6 que representa al pulsador del que se solicita su valor. El valor 0 representa a todos los pulsadores juntos.

La función keyTimeOn()

int keyTimeOn(int keyNum)

Esta función devuelve el tiempo en milisegundos que ha estado presionado el pulsador. El máximo tiempo que puede contar es de 65 segundos. A partir de ese momento no se cuenta más tiempo y el resultado devuelto siempre es el mismo.

keyNum: número del 1 al 6 que representa al pulsador del que se solicita su valor. El valor 0 representa a todos los pulsadores juntos.

La función keyTimeOff()

int keyTimeOff(int keyNum)

Esta función devuelve el tiempo en milisegundos que ha estado sin presionar el pulsador. El máximo tiempo que puede contar es de 65 segundos. A partir de ese momento no se cuenta más tiempo y el resultado devuelto siempre es el mismo.

keyNum: número del 1 al 6 que representa al pulsador del que se solicita su valor. El valor 0 representa a todos los pulsadores juntos.

Ejercicios

Programa el código necesario para resolver los siguientes problemas.

  1. El siguiente programa mueve hacia la derecha un led cuando se presiona el pulsador 2. Modificar el programa para que el led se mueva también hacia la izquierda al presionar el pulsador 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    // Mueve una luz a la derecha con el pulsador 2 (Right)
    // El programa utiliza la función keyCount()
    
    #include <Wire.h>
    #include <PC42.h>
    
    int led, count;
    
    void setup() {
       pc.begin();             // Inicializar el módulo PC42
       led = 1;                // Enciende primero el led D1
       pc.ledWrite(led, LED_ON);
    }
    
    void loop() {
    
       // Mueve a la derecha con la tecla derecha
    
       // Lee el número de pulsaciones del pulsador 'derecha'
       count = pc.keyCount(KEY_RIGHT);
    
       // Si el número de pulsaciones es mayor que cero
       if (count > 0) {
    
          // Apaga el led actual
          pc.ledWrite(led, LED_OFF);
    
          // Incrementa la posición del led
          led = led + count;
    
          // Si la posición del led es mayor que 6
          // vuelve a la posición 1
          if (led > 6) led = 1;
    
          // Enciende el led en la nueva posición
          pc.ledWrite(led, LED_ON);
       }
    }
    
  2. El siguiente programa es un juego para comprobar la habilidad de contar tiempo. Se debe presionar el pulsador 1 exactamente durante tres segundos. En el display se muestra el error de tiempo en milisegundos. Si se ha presionado menos tiempo, el número mostrado será negativo. En caso de presionar más de tres segundos, el número mostrado será positivo. Gana el jugador que más se acerque al cero.

    Modificar el programa para que el led D1 parpadee una vez por segundo antes de comenzar el juego. Una vez presionado el pulsador 1, el led 1 debe apagarse para no dar pistas sobre el tiempo que debe estar presionado el pulsador.

     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
    29
    30
    31
    32
    33
    34
    // Juego de medida de tiempo.
    // Gana el jugador que más se acerque a presionar el pulsador 1
    // exactamente 3 segundos, y consiga así menor error.
    
    #include <Wire.h>
    #include <PC42.h>
    
    void setup() {
       pc.begin();   // Inicializar el módulo PC42
    }
    
    void loop() {
       int time, points;
    
       // Espera hasta que se presione el pulsador 1
       while(pc.keyPressed(1) == 0);
    
       // Espera hasta que se deje de presionar el pulsador 1
       while(pc.keyPressed(1) == 1);
    
       // Lee el tiempo que ha estado presionado el pulsador 1
       time = pc.keyTimeOn(1);
    
       // Calcula la puntuación = milisegundos de error
       points = time - 3000;
       if (points > 999) points = 999;
       if (points < -999) points = -999;
    
       // Muestra la puntuación por el display
       pc.dispNum(abs(points));
       if (points < 0)
          pc.dispWrite(4, 0x40);  // Signo menos
       delay(500);
    }
    
  3. Modificar el programa que aparece a continuación, parecido al anterior. En este juego la puntuación será más alta si se presiona un pulsador el mismo tiempo dos veces consecutivas. Primero el programa debe medir el tiempo que ha estado presionado el pulsador 1, después debe esperar a que no esté presionado. Finalmente se medirá el segundo tiempo que el pulsador esté presionado.

     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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    // Juego de medida de tiempo. Versión de dos jugadores.
    //
    // El primer jugador presiona el pulsador 1 durante un tiempo.
    // En el display se muestra el tiempo presionado en milisegundos.
    //
    // El segundo jugador debe presionar el pulsador 1 exactamente el mismo tiempo.
    // El display muestra al final la diferencia entre los dos tiempos.
    // Gana el jugador que menos diferencia consiga.
    //
    // Para comenzar un nuevo intento se debe presionar el pulsador 1
    // más de 2 segundos
    //
    
    #include <Wire.h>
    #include <PC42.h>
    
    int time1, time2;
    int points;
    
    void setup() {
       pc.begin();  // Inicializar el módulo PC42
    }
    
    void loop() {
       // Comienza parpadeando el led D1
       pc.ledBlink(1, 500, 500);
    
       // Espera hasta que se presione el pulsador 1
       while(pc.keyPressed(1) == 0);
    
       // Cuenta el tiempo que está presionado el pulsador 1
       while(pc.keyPressed(1) == 1) {
         time1 = pc.keyTimeOn(1);
         pc.dispNum(time1);
       }
    
       // Espera hasta que se presione el pulsador 1
       while(pc.keyPressed(1) == 0);
    
       // Cuenta el tiempo que está presionado el pulsador 1
       while(pc.keyPressed(1) == 1) {
          time2 = pc.keyTimeOn(1);
          pc.dispNum(time2);
       }
    
       // Apaga el led D1 y espera un segundo
       pc.ledWrite(1, LED_OFF);
    
       // Calcula la puntuación
       points = time1 - time2;
    
       // Muestra la puntuación por el display parpadeando
       while(1) {
          pc.dispNum(abs(points));
          delay(500);
          pc.dispBegin();
          delay(500);
    
          // Salir del bucle si se presiona el pulsador 1
          if (pc.keyEvents(1, KEY_PRESSED_TIME2))
             break;
       }
    
       // Espera hasta que no se presione el pulsador 1
       while(pc.keyPressed(1) == 1);
    }