Tutorial de Arduino botón (5 / 6 paso)

Paso 5: Agregar botones y va OO

Escalado de problemas

Como vimos en el paso anterior, se hace difícil de escalar. Hay variables de estado mundial, que se refieren por algunas funciones. Imagine añadir un 2 º botón: comienza la pesadilla; no habla acerca de un botón de 3...

Programación: Va OO (orientado a objetos)

Arduino utiliza el lenguaje de procesamiento sobre C++, entonces ¿por qué no utilizar algunas características OO?

Tenemos que empacar estas variables globales dentro de las estructuras que podemos crear a voluntad. Estas estructuras, con funciones de control de asociados se llaman clases y métodos en el mundo OO. Una clase es simplemente la descripción del objeto, mientras que la memoria efectiva asignada para cada objeto se llama la instancia.

La primera foto de este paso demuestra que hemos añadido un botón 2. La segunda imagen muestra el ya tradicionales Prensas de largo/corto, trabajando de forma independiente muy bien. El 2 º botón tiene, por cierto, un umbral más de largo-prensa.

Pro/contras

Este código es cada vez más complejo, que es normal porque cuando escala, la complejidad genera un paso significativo. La buena noticia es que luego puede apoyar cualquier número de botones adicionales en ningún aumento de la complejidad.

Proceso establece algunas limitaciones (por ejemplo, no es ninguna creación dinámica: no existen los operadores new y delete ). Que no es malo, porque no queremos perdernos en alguno de los lados particularmente sangrientos de C++, que son innecesarios (discutiblemente) en pequeños sistemas embebidos como Arduino.

Seguro que el mismo puede ser hecho en C puro, así que si necesidad/prefiere una implementación en C, solo me preguntan.

Código

––––––––––8<––––––––––

 #define BUTTON1_PIN 2 // Button 1 #define BUTTON2_PIN 3 // Button 2 #define DEFAULT_LONGPRESS_LEN 25 // Min nr of loops for a long press #define DELAY 20 // Delay per loop in ms ////////////////////////////////////////////////////////////////////////////// enum { EV_NONE=0, EV_SHORTPRESS, EV_LONGPRESS }; ////////////////////////////////////////////////////////////////////////////// // Class definition class ButtonHandler { public: // Constructor ButtonHandler(int pin, int longpress_len=DEFAULT_LONGPRESS_LEN); // Initialization done after construction, to permit static instances void init(); // Handler, to be called in the loop() int handle(); protected: boolean was_pressed; // previous state int pressed_counter; // press running duration const int pin; // pin to which button is connected const int longpress_len; // longpress duration }; ButtonHandler::ButtonHandler(int p, int lp) : pin(p), longpress_len(lp) { } void ButtonHandler::init() { pinMode(pin, INPUT); digitalWrite(pin, HIGH); // pull-up was_pressed = false; pressed_counter = 0; } int ButtonHandler::handle() { int event; int now_pressed = !digitalRead(pin); if (!now_pressed && was_pressed) { // handle release event if (pressed_counter < longpress_len) event = EV_SHORTPRESS; else event = EV_LONGPRESS; } else event = EV_NONE; // update press running duration if (now_pressed) ++pressed_counter; else pressed_counter = 0; // remember state, and we're done was_pressed = now_pressed; return event; } ////////////////////////////////////////////////////////////////////////////// // Instantiate button objects ButtonHandler button1(BUTTON1_PIN); ButtonHandler button2(BUTTON2_PIN, DEFAULT_LONGPRESS_LEN*2); void setup() { Serial.begin(9600); // init buttons pins; I suppose it's best to do here button1.init(); button2.init(); } void print_event(const char* button_name, int event) { if (event) Serial.print(button_name); Serial.print(".SL"[event]); } void loop() { // handle button int event1 = button1.handle(); int event2 = button2.handle(); // do other things print_event("1", event1); print_event("2", event2); // add newline sometimes static int counter = 0; if ((++counter & 0x1f) == 0) Serial.println(); delay(DELAY); } 

––––––––––>8––––––––––

Artículos Relacionados

Cómo utilizar el Sensor de flujo de agua - Tutorial de Arduino

Cómo utilizar el Sensor de flujo de agua - Tutorial de Arduino

En este tutorial usted aprenderá cómo utilizar un sensor de flujo de agua con una placa Arduino.El sensor de flujo de agua consiste en un cuerpo de válvula de plástico, un rotor de agua y un sensor de efecto hall. Cuando el agua fluye a través del ro
Cómo utilizar el Tutorial de Arduino de sensor de DHT-11

Cómo utilizar el Tutorial de Arduino de sensor de DHT-11

La DHT-11 es una salida digital de humedad relativa y temperatura. Utiliza un sensor de humedad capacitivo y un termistor para medir el aire circundante. Comparado con el DHT22, este sensor es menos precisa, menos precisa y trabaja en un rango menor
Tutorial de Arduino - organizar tus proyectos

Tutorial de Arduino - organizar tus proyectos

si usted ha tenido éxito en algunos proyectos de arduino, Felicidades! Puede ser motivado para asumir un proyecto más amplio.Pero como te tomas en un proyecto más amplio, el protoboard se convierte en messier y messier, como un plato de espagueti (al
Cómo utilizar el Sensor infrarrojo Sharp (GP2Y0A41SK0F) - Tutorial de Arduino

Cómo utilizar el Sensor infrarrojo Sharp (GP2Y0A41SK0F) - Tutorial de Arduino

En este tutorial usaremos el sensor de infrarrojos Sharp (GP2Y0A41SK0F) para medir la distancia de un objeto.Sensores IR trabajar mediante el uso de un sensor de luz específico para detectar un seleccionar longitud de onda de luz en el espectro infra
Tutorial de Arduino Bundle.: Arduino Kit de experimentación:. (ARDX)

Tutorial de Arduino Bundle.: Arduino Kit de experimentación:. (ARDX)

¿Interesado en hacer proyectos aseados con un Arduino pero no está seguro de dónde empezar?Aquí es fácil de seguir guía acerca de cómo conectar y utilizar un conjunto de componentes electrónicos.(shameless plug)¿Interesados en hacer todo?Kits complet
Cómo utilizar el Sensor de Adafruit BMP280 - Tutorial de Arduino

Cómo utilizar el Sensor de Adafruit BMP280 - Tutorial de Arduino

En este tutorial vamos a utilizar el sensor de Adafruit BMP280. Este sensor puede medir la presión barométrica y la temperatura con muy buena precisión. Porque la presión cambia con la altitud podemos también usarlo como un altímetro con una precisió
Cómo: varios botones en el Pin analógico 1 - Tutorial de Arduino

Cómo: varios botones en el Pin analógico 1 - Tutorial de Arduino

La placa de Arduino uno tiene 12 pines de I/O digitales disponible y 6 pines de entrada analógicas, a veces, en proyectos complejos o 'grandes', corremos de pines digitales. En este tutorial usted aprenderá cómo utilizar varios botones en un pin anal
Cómo utilizar los módulos XBee como transmisor y receptor - Tutorial de Arduino

Cómo utilizar los módulos XBee como transmisor y receptor - Tutorial de Arduino

En este tutorial utilizaremos dos módulos xBee (serie 1) con la placa de Arduino uno. Configuraremos a actuar como un transmisor y receptor para controlar el brillo de un LED sin cables mediante un potenciómetro.La pila de xBee - serie 1 - módulos to
Tutorial de Arduino - teclados numéricos

Tutorial de Arduino - teclados numéricos

este es un ejemplo de uno de mis tutoriales de Arduino.Teclados numéricos puede proporcionar una alternativa sencilla para el usuario final para varias interfaces para sus proyectos. O si usted necesita un montón de botones, usted puede ahorrar mucho
Cómo desaparecer un LED - Tutorial de Arduino

Cómo desaparecer un LED - Tutorial de Arduino

En este ejemplo aprenderá a desvanecerse un LED mediante la función analogWrite(). AnalogWrite utiliza modulación de anchura de pulso (PWM), digital pin y apagado muy rápidamente, para crear un efecto de desvanecimiento.Antes de empezar vamos a apren
Tutorial de Arduino Wireless SD Shield

Tutorial de Arduino Wireless SD Shield

como su nombre indica, el escudo de Arduino Wireless SD sirve dos funciones. Ante todo, este escudo permite que fácilmente la interfaz con los módulos de transceptor de Xbee para crear malla de redes y otros dispositivos inalámbricos. En segundo luga
Tutorial de Arduino defusable bomba (cuenta regresiva)

Tutorial de Arduino defusable bomba (cuenta regresiva)

Por qué hice esto.Hay otros tutoriales de hacer relojes de alarma y otras bombas defusable, son realmente buenos. pero se a complicado para mis necesidades. Se trata de una simple bomba de cuenta regresiva y glamur.Así que si usted está buscando un s
Tutorial de Arduino Robot

Tutorial de Arduino Robot

Estaba buscando la base de datos Instructable un tutorial para el Robot oficial de Arduino, pero no he podido encontrar uno! Así que mad este tutorial para ayudar a otros que necesitan poco un poco de ayuda con su nuevo Arduino Robot.Paso 1: Configur
Cómo controlar una tira de LED RGB - Tutorial de Arduino

Cómo controlar una tira de LED RGB - Tutorial de Arduino

En este tutorial vamos a utilizar una tira con 8 LED ' s RGB con la placa de Arduino uno. Usaremos la biblioteca de NeoPixel de Adafruit para cambiar el color de cada led.Vamos a empezar!Paso 1: Lo que se necesitaPara este proyecto necesitarás:Arduin