Este tutorial es un extracto del tutorial que cree para el foro de Arduino, si quieres ver el tutorial completo, ver los comentario y/o los añadidos al tutorial visita Como NO leer un botón y como SI debemos hacerlo.
Empecé a crear esta parte del tutorial dando una noción de objetos y clases de C++, pero al final llegué a la conclusión de que es tema para otro tutorial que no sé si llegaré a hacer.
Me limitaré a decir que una clase es una manera de encapsular código para cosas que van a realizar la misma función.
Para leer el botón un botón hemos visto que necesitamos unas variables y que vamos a usar esas variables para leer el estado del botón. Podemos poner otro botón y creamos más variables y realizamos la acción de leerla, otro botón y mas variables/acción de leer. Si ponemos más botones habrá que hacer lo mismo, con lo cual estamos agrandando el código, haciendo que sea ilegible y provocando fallos, ya que nos dedicaremos a hacer copy+paste y no cambiaremos el nombre de las variables bien.
Así que se encápsula en una clase y queda mas escueto y elegante.
/* * 6. Usando una clase para botones. */ #define APRETADO 0 #define SUELTO 1 #define APRETANDOLO 2 #define SOLTANDOLO 3 class BotonSimple { private: unsigned char pin; unsigned char anterior, valor; unsigned char estado; unsigned long temporizador; unsigned long tiempoRebote; public: BotonSimple(unsigned char _pin, unsigned long _tiempoRebote); void actualizar(); int leer(); }; BotonSimple::BotonSimple(unsigned char _pin, unsigned long _tiempoRebote=50) { pin = _pin; tiempoRebote = _tiempoRebote; pinMode(pin, INPUT_PULLUP); valor=HIGH; anterior=HIGH; estado=SUELTO; } void BotonSimple::actualizar() { // NOTA: En el ejemplo original en vez de "pin" leia directamente el pin "2", con lo que el // codigo no funciona correctamente con el pin que le hayamos asignado. if ( valor==digitalRead(pin) ){ temporizador=0; } else if ( temporizador==0 ) { temporizador = millis(); } else if ( millis()-temporizador >= tiempoRebote ) { valor = !valor; } if ( anterior==LOW && valor==LOW ) estado = APRETADO; if ( anterior==LOW && valor==HIGH ) estado = SOLTANDOLO; if ( anterior==HIGH && valor==LOW ) estado = APRETANDOLO; if ( anterior==HIGH && valor==HIGH ) estado = SUELTO; anterior = valor; } int BotonSimple::leer() { return estado; } BotonSimple boton(2); void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { boton.actualizar(); switch ( boton.leer() ) { case SUELTO: digitalWrite(13, LOW); break; case APRETANDOLO: Serial.println("Acabas de apretar el boton"); break; case APRETADO: digitalWrite(13, HIGH); break; case SOLTANDOLO: Serial.println("Acabas de soltar el boton"); break; default: break; } }
Este código hace lo mismo que lo anterior, pero hemos usado una clase para encapsular el botón.
Nuestro objeto ahora tiene dos métodos: actualizar, que hace la lectura del botón y que deberemos hacer antes de poder leer su estado; y leer, que al llamarla nos vevolverá el estado del botón (suelto, apretado, apretandolo, soltandolo)
Ahora que lo tenemos encapsulado, si queremos más botones solo tenemos que hacer:
BotonSimple boton1(pin1, tiempoRebote1); BotonSimple boton2(pin2, tiempoRebote2); ... BotonSimple botonN(pinN, tiempoReboteN);
pinX será el pin al que asignaremos el botón. tiempoReboteX sera el tiempo de debounce, este parámetro es opcional y si no lo ponemos el tiempo será de 50ms.
Tendremos que comprobar el estado de cada boton en cada ciclo:
void loop() {
boton1.actualizar();
boton2.actualizar();
...
botonN.actualizar();
}
Como véis no me he esmerado mucho en la explicación, dado que como dije es un tema más de C++ y programación orientada a objetos que de Arduino en si. Solo básta con saber que el código es el mismo que cuando leiamos el botón sin usar objetos, pero ahora es más cómodo trabajar con él.
Os dejo en attachment la libreria para instalar en Arduino, será útil cuando cree el post para ejemplos de millis y botones.
Aquí os dejo el enlace a la librería en Github: BotonSimple
No hay comentarios:
Publicar un comentario