7. Botons i mostradors¶

Els pendents¶
- Llegiu els comptadors de temps i les pulsacions associades a un botó.
- Realitzeu accions associades als comptadors de temps.
La funció: CPP: Fun: 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 el botó pressionava més de mig segon, el comptador de pulsació augmenta a una velocitat de 10 polsos per segon. Si es prem el botó durant més de dos segons, el comptador de pulsació augmenta a una velocitat de 100 polsos per segon. Els temps i les freqüències del comptador augmentat es poden modificar en la configuració del teclat.
; Keynum |
La funció: CPP: diversió: keytimon¶
-
int
keyTimeOn
(int keyNum)¶ Aquesta funció retorna el temps en mil·lisegons que s'ha premut el botó. El temps màxim que podeu comptar és de 65 segons. A partir d’aquest moment, ja no hi ha més temps i el resultat retornat sempre és el mateix.
; Keynum |
La funció: CPP: Func: KeyTimeoff¶
-
int
keyTimeOff
(int keyNum)¶ Aquesta funció retorna el temps en mil·lisegons que han estat sense prémer el botó. El temps màxim que podeu comptar és de 65 segons. A partir d’aquest moment, ja no hi ha més temps i el resultat retornat sempre és el mateix.
; Keynum |
Exercicis¶
Programa el codi necessari per resoldre els problemes següents.
El programa següent mou un LED a la dreta quan es prem el botó. Modifiqueu el programa de manera que el LED també es mogui a l'esquerra quan premeu 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 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); } }
El següent programa és un joc per comprovar la capacitat de dir -ho. El botó 1 s'ha de prémer exactament durant tres segons. La pantalla mostra l'error de temps en mil·lisegons. Si s’ha pressionat menys temps, el nombre mostrat serà negatiu. En cas de prémer més de tres segons, el nombre mostrat serà positiu. El jugador que aconsegueix més victòries zero.
** Modifiqueu ** el programa per al LED D1 a parpellejar una vegada per segon abans de començar el partit. Un cop premut el botó 1, el LED 1 s’ha d’apagar per no donar pistes sobre el temps que s’ha de prémer 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
// 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); }
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 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); }