Objetivos
Material requerido.
Un M5Stack
|
|
Un cable USB C |
Los botones del M5
El M5Stack incluye nativamente 3 botones estándar que nos vienen muy bien para interaccionar con el sistema y que nos dan bastante ventaja sobre los pulsadores externos tan frecuentes en el mundo Arduino, que, si bien son de lo mas educativos, son molestos por los cablecitos que siempre acabamos teniendo colgando por ahí.
Para quienes vengáis del mundo Arduino tradicional, ya estáis acostumbrados a manejar los botones o pulsadores con una cierta precaución porque tienden a comportarse de una forma un tanto impredecible si no se tiene un mínimo de cuidado. Por eso los chicos de M5 han desarrollado una serie de funciones estándar que nos aíslan de estos problemas y que nos permiten hacer la clase de cosas que suelen dar dolor de cabeza a los novatos como determinar si un botón ha sido pulsado o ya ha sido liberado y también el más prosaico, pero más útil, saber si un botón ha sido pulsado durante un cierto tiempo dado para lanzar una llamada especial diferente de la pulsación simple.
En esta sesión vamos a ver como podemos usar las librerías suministradas para hacer todas estas operaciones de una forma sencilla de modo que podáis incluirlos en vuestros programas.
Inicializando el M5Stack
Las librerías M5 han incluido algunas ayudas a tareas habituales de modo que podamos hacer programas mas sencillos para nuestros Arduino /M5 y la primera instrucción que nos conviene conocer es la de M5. begin.
Casi siempre cuando empezamos a escribir nuestro programa vamos a tener que iniciar la pantalla, el puerto serie, el I2C o la tarjeta SD, lo que serían unas cuantas instrucciones y por ello M5 nos provee de una forma sencilla de declarar todo esto con M5. begin:
void begin(bool LCDEnable=true, bool SDEnable=true, bool SerialEnable=true,bool I2CEnable=false);
La idea es que podamos inicializar todo desde una instrucción única en lugar de ir dando instrucciones sucesivas. Así pues si quiero activa la pantalla y el puerto serie:
M5.begin(true, false, true);
Si queremos usar la batería los de M5 nos recomiendan usar la línea
M5.Power.begin
No he encontrado mucha información al respecto, pero parece que así podemos gestionar la duración de la batería (Y el botón de encendido / Apagado) con un poco mas de facilidad y aquí somos muy obedientes con estas cosas.
Empezando con los botones
Vamos a empezar con uno de los ejemplos que vienen con el M5 en el que cada vez que pulsemos uno de los botones no saque un mensaje en pantalla indicando de que botón se trata y que nos borre la pantalla cuando pulsemos el botón de en medio durante un tiempo prefijado simplemente.
Puedes encontrar el ejemplo que sigue en el menú
Archivo\Ejemplos\M5Stack\Basics\button
ya que viene incluido a modo de ejemplo de programación. Nos ha parecido encantadoramente sencillo y hemos prefierido no complicar mas las cosas. Los nombres de los botones para usarlos en la libreria son BtnA; BtnB y BtnC:
Lo primero como siempre invocar la librería del M5:
#include <M5Stack.h>
Y ahora empezamos con el setup() y definiendo el tipo y color del texto, y sacamos algunos mensajes en pantalla:
void setup() { // init lcd, serial, but don't init sd card M5.begin(true, false, true); M5.Power.begin(); M5.Lcd.clear(BLACK); M5.Lcd.setTextColor(YELLOW); M5.Lcd.setTextSize(2); M5.Lcd.setCursor(65, 10); M5.Lcd.println("Button example"); M5.Lcd.setCursor(3, 35); M5.Lcd.println("Press button B for 500ms"); M5.Lcd.println("to clear screen."); M5.Lcd.setTextColor(RED); }
Vamos ahora con el loop(). En primer lugar, a diferencia de lo habitual con Arduino, no necesitamos comprobar periódicamente si algún botón esta pulsado o no. La librería lo hace por nosotros y nos basta con interrogarla para saber si algún boto ha sido pulsado en algún momento anterior, y para ello usamos M5.update():
M5.update(); if (M5.BtnA.wasReleased()) M5.Lcd.print('A');
Si el botón A (El de mas a la izquierda) ha sido pulsado la función M5.BtnA.wasReleased() estará a true y cumplirá la condición del if con lo que sacara el mensaje en pantalla. Podemos aplicar le mismo criterio para el resto de botones:
if (M5.BtnA.wasReleased()) M5.Lcd.print('A'); else if (M5.BtnB.wasReleased()) M5.Lcd.print('B'); else if (M5.BtnC.wasReleased()) M5.Lcd.print('C'); else if (M5.BtnB.wasReleasefor(700)) { M5.Lcd.clear(BLACK); M5.Lcd.setCursor(0, 0); }
Fíjate en la última condición en la que usamos M5.BtnB.wasReleasefor(500), que se cumple si alguien ha mantenido pulsado el botón B pulsado, durante el plazo especificado de 500 ms. Si es así, borramos la pantalla y vuelta a empezar.
Funciones adicionales con los botones
Además de las funciones que ya hemos visto arriba tenemos disponibles algunas otras, como por ejemplo:
Funcion | Resultado |
---|---|
M5.BtnA/B/C. read(); | Devuelve la situación actual, True si el botón esta pulsado ahora y False en caso contrario |
M5.BtnA/B/C. isPressed(); | Recuerda el valor del botón la ultima vez que llamamos a Button.read() |
M5.BtnA/B/C. pressedFor(uint32_t ms); | Devuelve 1, si el botón ha estado pulsado continuamente más del tiempo especificado |
Hay varias más, pero la documentación es poco clara en lo que al resultado se refiere por lo que habrá que investigar un poco para ver su utilidad.