5. Farciment: comptables

Els pendents

  • Llegiu els comptadors de temps i les pulsacions associades a un botó.
  • Realitzeu accions associades als comptadors de temps.

La funció `` keyCount``

int keyCount(int keyNum)

Aquesta funció retorna el nombre de vegades que s'ha premut un botó. El valor augmenta un immediatament després de prémer el botó. Si es manté el botó mig segon, el valor augmenta a un ritme de 5 pulsacions per segon. Si es prem el botó durant dos segons, el valor de les pulsacions augmenta a una velocitat de 20 pulsacions per segon.

; Keynum |

La funció `` keytimon``

int keyTimeOn(int keyNum)

Aquesta funció retorna el temps en què s'ha premut el botó. El temps es mesura comptant 250 passos per segon.

; Keynum |

El `` keytimoff ''`

int keyTimeOff(int keyNum)

Aquesta funció retorna el temps que ha estat sense prémer el botó. El temps es mesura comptant 250 passos per segon.

; Keynum |

Exercicis

Programa el codi necessari per resoldre els problemes següents.

  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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // Mueve una luz a izquierda y derecha con los pulsadores 1 y 2
    
    #include <Picuino.h>
    
    int led, count;
    
    void setup() {
       pio.begin();            // Inicializa el shield Picuino UNO
       led = 1;                // Enciende primero el led D1
       pio.ledWrite(led, LED_ON);
    }
    
    void loop() {
    
       // Mueve a la derecha con la tecla derecha
    
       // Lee el número de pulsaciones del pulsador 'derecha'
       count = pio.keyCount(KEY_RIGHT);
    
       // Si el número de pulsaciones es mayor que cero
       if (count > 0) {
    
          // Apaga el led actual
          pio.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
          pio.ledWrite(led, LED_ON);
       }
    }
    
  2. El següent programa és un joc per comprovar la capacitat de dir -ho. Haureu d’esperar que no es premeu el botó 1. En aquell moment, es mesurarà el moment en què se us ha pressionat. Com més temps es pressioni durant 3 segons, més puntuació s’obtindrà. ** Modifiqueu ** el programa de manera que abans de començar el joc, el LED D1 parpelleja una vegada per segon. Un cop premut el botó 1, s’ha d’extingir el parpelleig per no donar pistes sobre el temps que ha d’estar encè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
    29
    30
    // Juego de medida de tiempo
    
    #include <Picuino.h>
    
    int time, points;
    
    void setup() {
       pio.begin();   // Inicializa el shield Picuino UNO
    }
    
    void loop() {
    
       // Espera hasta que se presione el pulsador 1
       while(pio.keyPressed(1) == 0);
    
       // Espera hasta que se deje de presionar el pulsador 1
       while(pio.keyPressed(1) == 1);
    
       // Lee el tiempo que ha estado presionado el pulsador 1
       time = pio.keyTimeOn(1);
    
       // Calcula la puntuación
       points = time - 3*250;
    
       // Muestra la puntuación por el display
       pio.dispWrite(abs(points));
       if (points < 0)
          pio.dispWrite(1, 0x02);
       delay(1000);
    }
    
  3. Modifiqueu el programa que apareix a continuació, similar al anterior. En aquest joc, la puntuació serà més alta si es prem un botó el mateix temps dues vegades consecutiu. Primer, el programa ha de mesurar el temps que s'ha pressionat el botó, i haureu d'esperar que no es pressioni. Finalment, es mesurarà la segona meitat que es prem el botó.

     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
    // Juego de medida de tiempo. Versión de dos pulsaciones
    
    #include <Picuino.h>
    
    int time1, time2;
    int points;
    
    void setup() {
       pio.begin();  // Inicializa el shield Picuino UNO
    }
    
    void loop() {
       // Comienza parpadeando el led D1
       pio.ledBlink(1, 50, 50);
    
       // Espera hasta que se presione el pulsador 1
       while(pio.keyPressed(1) == 0);
    
       // Cuenta el tiempo que está presionado el pulsador 1
       while(pio.keyPressed(1) == 1) {
         time1 = pio.keyTimeOn(1);
         pio.dispWrite(time1);
       }
    
       // Espera hasta que se presione el pulsador 1
       while(pio.keyPressed(1) == 0);
    
       // Cuenta el tiempo que está presionado el pulsador 1
       while(pio.keyPressed(1) == 1) {
          time2 = pio.keyTimeOn(1);
          pio.dispWrite(time2);
       }
    
       // Apaga el led D1 y espera un segundo
       pio.ledWrite(1, LED_OFF);
    
       // Calcula la puntuación
       points = time1 - time2;
    
       // Muestra la puntuación por el display
       while(1) {
          pio.dispWrite(abs(points));
          delay(500);
          pio.dispBegin();
          delay(500);
          // Sal si se presiona el pulsador 1
          if (pio.keyEvents(1) == KEY_PRESSED_TIME2)
             break;
       }
    
       // Espera hasta que no se presione el pulsador 1
       while(pio.keyPressed(1) == 1);
    }