Para empezar a crear nuestros menús, tenemos que saber configurar cuales son los elementos de Interfaz que vamos a utilizar.
Lo primero que deberemos diferenciar serán las entradas (INPUTS) de nuestro sistema y los visores ( OUTPUTS ) en los que se va a representar la información. Es decir, no será lo mismo usar un sistem con un Encoder y una pantalla LCD, que un KeyPad con una pantalla TFT. Los sistemas son diferentes pero por dentro funcionarán con un modelo muy similar.
El modelo que se encuentra detrás debe definir primero estos elementos con sus librerías respectivas y acto seguido nosotros deberemos de programarlo para crear un menú que responda a nuestras necesidades.
Durante el curso vamos a explicar los siguiente sistemas y cada uno de ellos tendrá sus configuraciones específicas.
- LCD + Encoder
- LCD + KeyPad
- TFT + Encoder
- TFT + Keypad
La librería ArduinoMenu tiene soporte para un conjunto muy extenso de pantallas y sistemas de entrada. Asociados a estos no solo necesitaremos añadir las propias librerías para su funcionamiento, sino también las que se incorporan para realizar el sistema de menus.
Vamos a explicar los modelos de inicialización para incorporar más adelante nuestro interfaz de navegación.
*Aviso importante
La librería ArduinoMenu usa un modelo estático y contiene unas cuantas palabras reservadas para crear todo su sistema, por lo que las siguientes palabras que aparecen en muchos de los códigos publicados tienen una funcionalidad asociada al tipo de menu.
- MENU_INPUTS
- MENU_OUTPUTS
- NAVROOT
Módulos de entrada. Definición de INPUTS
Botones
Para crear la entrada de un botón, es necesario incluir su librería y definir dos configuraciones.
- Definir si el boton es de pull-up o de pull-down, es decir, si su estado activo se establece cuando está presionado o viceversa.
- Mapear qué control ejecuta cuando es presionado.
Para realizar este paso, hay que crear un objeto KeyMap, como un array de estos dos atributos
El primer atributo si es positivo, será de pull-down, es decir estará activo cuando se presiona, si es negativo, será de pull-up, es decir activado cuando no presionamos el botón. Este comportamiento depende del botón que hayamos comprado.
El segundo atributo define el comportamiento con el siguiente mapeado incluido en una variable denominada defaultNavCodes. Estos códigos se pueden extender y redefinir para un mapeado más extenso.
- noCmd ->
- escCmd -> ‘/’
- enterCmd -> ‘*’
- upCmd -> ‘+’
- downCmd -> ‘-‘
- leftCmd -> ‘-‘
- rightCmd -> ‘+’
- idxCmd -> ‘?’
- scrlUpCmd ->
#include <menuIO/keyIn.h> //Encoder button #define encBtn 4 keyMap encBtn_map[]={{-encBtn,defaultNavCodes[enterCmd].ch}};//negative pin numbers use internal pull-up, this is on when low keyIn <1> encButton(encBtn_map); //1 is the number of keys
Con este formato, se pueden añadir varios botones para realizar distintos comportamientos.
Encoder
#include <menuIO/encoderIn.h> //Libreria para Encoder //Definicion de pines del encoder #define encA 2 #define encB 3 encoderIn<encA,encB> encoder;//Definicion de Input Encoder #define ENC_SENSIVITY 4 encoderInStream<encA,encB> encStream(encoder,ENC_SENSIVITY);// simple quad encoder fake Stream
Nuestros Encoders suelen tener un switch para definir la activación o clicar sobre el elemento seleccionado. En este caso; aunque nuestro Encoder tenga todo integrado; el botón se considera como un elemento a parte.Para ello, hay que usar una la librería ChainStream. Esta librería nos permite ejecutar multiples componentes de entrada para nuestros menús.
Para realizar este paso, deberemos crear un array de elementos de entrada como punteros.
chainStream name(menuIn** chain)
N -> define el numero de componentes de entrada que vamos a utilizar.
#include <menuIO/keyIn.h> //Encoder button #include <menuIO/chainStream.h>// concatenate multiple input streams (this allows adding a button to the encoder)&amp;amp;lt;/pre&amp;amp;gt; // Encoder ///////////////////////////////////// #define encA 2 #define encB 3 //this encoder has a button here #define encBtn 4 encoderIn <encA,encB> encoder;//simple quad encoder driver #define ENC_SENSIVITY 4 encoderInStream <encA,encB> encStream(encoder,ENC_SENSIVITY);// simple quad encoder fake Stream //a keyboard with only one key as the encoder button keyMap encBtn_map[]={{-encBtn,defaultNavCodes[enterCmd].ch}};//negative pin numbers use internal pull-up, this is on when low keyIn <1> encButton(encBtn_map);//1 is the number of keys menuIn* inputsList[]={&encStream,&encButton}; chainStream<3> in(inputsList);//3 is the number of inputs
Keypad
#include <menuIO/keypadIn.h> //define your keyboard ------------------------------------ const byte ROWS = 4; //four rows const byte COLS = 4; //four columns //define the cymbols on the buttons of the keypads char hexaKeys[ROWS][COLS] = { {'A','3','2','1'}, {'B','6','5','4'}, {'C','9','8','7'}, {'D','#','0','*'} }; byte rowPins[ROWS] = {6,7,8,9}; //connect to the row pinouts of the keypad byte colPins[COLS] = {13,12,11,10}; //connect to the column pinouts of the keypad //initialize an instance of class NewKeypad Keypad customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); keypadIn kpad(customKeypad);