6. Pulsadores y Eventos¶
Objetivos¶
- Leer los eventos asociados a un pulsador.
- Programar Arduino para que responda a los eventos de los pulsadores.
Eventos relacionados con los pulsadores¶
La función keyEvents()
¶
-
int
keyEvents
(int keyNum, int event)¶ Esta función devuelve el valor de los eventos que se producen en un pulsador. Los eventos que puede devolver la función son los siguientes
Evento Significado KEY_PRESSED_TIME1 El pulsador se ha presionado durante 0,02 segundos KEY_PRESSED_TIME2 El pulsador se ha presionado durante 0,5 segundos KEY_PRESSED_TIME3 El pulsador se ha presionado durante 2,0 segundos KEY_RELEASED El pulsador se ha dejado de presionar Estos valores de tiempo son los valores predefinidos después de iniciar la placa y se pueden cambiar en la configuración.
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.
Encender un led al presionar un pulsador cierto tiempo¶
En este ejemplo, un led se encenderá después de que se presione su pulsador durante más de medio segundo
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);
}
|
El ejemplo puede modificarse con facilidad para que se encienda después de presionar dos segundos.
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 funciones en un pulsador¶
Este ejemplo es un poco más complejo y demuestra la capacidad de los eventos para dar más de un significado a un solo pulsador. Gracias a esta capacidad, un solo pulsador podrá realizar muchas funciones por sí solo.
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);
}
|
Ejercicios¶
Programa el código necesario para resolver los siguientes problemas.
El siguiente programa enciende el led D1 al presionar el pulsador D1 y apaga el led D1 al volver a presionar el pulsador 1. Se utiliza una variable para almacenar el estado del led D1. Se pide modificar el programa para que también el led D2 se encienda y apague con el pulsador 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; } }
El siguiente programa mueve hacia la derecha un led cuando se presiona el pulsador 2. Modificar el programa para que el led se mueva 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
// 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 } }
Modificar el programa anterior para que se encienda el led D1 y se apaguen el resto de ledes al presionar el pulsador 6
KEY_BACK
durante dos segundos.