Librería EasyMenu_OLED

portada

Librería EasyMenu_OLED

tecnoingenia / noviembre 3, 2020

Hoy quise tomarme un momento para comentarles sobre una librería en la que estuve trabajando recientemente. Ya que se han vuelto tan populares estos pequeños displays OLED y en lo personal me parecen muy prácticos, pensé que sería una buena idea hacer una librería especial para crear menús de forma rápida, basada en la librería Adafruit_SSD1306 y Adafruit_GFX. 

El resultado me parece aceptable aunque sé que hay muchas más cosas que se pueden implementar. El objetivo principal era poder generar tablas de tamaños dinámicos con texto y datos numéricos, además de tener la opción de seleccionar una celda especifica cómo las opciones de un menú.

Esto lo pude lograr implementando 4 métodos básicos:
  • drawGrill(FILAS, COLUMNAS); //dibuja una tabla o cuadricula vacía
  • drawTable(FILAS, COLUMNAS, textoArray); //dibuja un a tabla con los elementos del array en cada celda, adicionalmente se puede seleccionar una celda por fila y columna
  •  drawMenu(arrayOpciones, NUM_OPCIONES, opcionSelec); //Dibuja un menú (tabla de una sola columna) y selecciona la opción deseada
  • drawParameterTable(NUM_ITEMS, arrayTexto, pArrayVariables); //Esta se trata de una tabla de 2 columnas en la cual desplegar el valor de diferentes parametros, arrayTexto son las etiquetas de la primer columna, pArrayVariables son los apuntadores a las variables doubles que se mostraran en la segunda columna
Además de Poder utilizar toda la pantalla se pueden crear varios canvas en diferentes zonas de la pantalla y desplegar varias tablas o menús a la vez. Me pareció interesante y creo que con un poco más de ingenio se puede utilizar para graficar datos o hacer una especie de histograma.

Aquí les comparto un pequeño demo de lo que se puede hacer fácilmente con la librería, además pude implementar un juego de gato.

 
En seguida un pequeño resumen de cómo utilizar los métodos de la librería, también está documentada en mi github EasyMenu_OLED
/*Crear un Menú de la pantalla completa*/
EasyMenu Menu(&display, SCREEN_WIDTH, SCREEN_HEIGHT);

/*Crear un menú en una seccion de la pantalla*/
EasyMenu canvas(&display, 80, 50, 48, 7);
/*          |       |       |   |   |  |--------> Cordenada de origen en Y del canvas
            |       |       |   |   |-----------> Cordenada de origen en X del canvas
            |       |       |   |---------------> Alto del canvas del canvas
            |       |       |-------------------> Ancho del canvas del canvas
            |       |---------------------------> Apuntador al display
            |-----------------------------------> ID del canvas
*/

/**************************************************************************/

/*Dibujar un Menú básico*/
char* muenuOpciones[4] = {"   CONFIGURACION", "     OPCIONES", "     AVANZADO", "      SALIR"}; //char* array con la lista de opciones que aparecerán en el menú

Menu.clearDisplay(); //Borrar pantalla

Menu.drawMenu(muenuOpciones, 4, opcionIndex); 
/*                 |         |       |-----------> Opción seleccionada
                   |         |-------------------> Cantidad de opciones
                   |-----------------------------> Lista de etiquetas de opciones
*/
Menu.display(); //Mostrar en pantalla

/**************************************************************************/



/*Dibujar una tabla vacía o cuadrícula*/
Menu.clearDisplay();
Menu.drawGrill(FILAS, COLUMNAS); 
Menu.display();



/*Dibular una tabla que contenga texto*/
    char* textos[16] = {          //Array de etiquetas
        "A0", "B0", "C0", "D0",
        "A1", "B1", "C1", "D1",
        "A2", "B2", "C2", "D2",
        "A3", "B3", "C3", "D3"
    };

    Menu.clearDisplay();

    Menu.drawTable(4, 4, textos); //Tabla de 4x4 con contenido que ocupara todo el largo y ancho del canvas
                //(Filas, Columnas, list);
    Menu.display();



/*Dibujar una tabla de parámetros*/
    double temperatura = 30.05;                             //Aqui solo declaro parámetros de ejemplo
    double humedad = 66;                                    //          
    double rpm = 2500;                                      //
    char* item_labels[3] = {"TEMP:", "HUM:", "RPM:"};       //    Etiquetas del lado izquierdo de la tabla
    double* item_values[3] = {&temperatura, &humedad, &rpm};//    parámetros o valores del lado derecho
    
    Menu.clearDisplay(); 
    Menu.drawParameterTable(3, item_labels, item_values, 0); //Aquí dibujamos la tabla
/*                          |      |             |       |---------------> parametro seleccionado
                            |      |             | ----------------------> Array de apuntadores a los valores de los parámetros
                            |      |-------------------------------------> Lista de nombres de cada parámetro
                            |--------------------------------------------> Numero de parámetros

*/
    Menu.display();

2 Comments

    • tecnoingeniaPosted on : febrero 21, 2023 at 2:38 pm

      hola buen día, estoy intentando utilizar esta librería y la adapte para la OLED SH1106 similar SSD1306, pero me da error en los ítems de compilación del menú, agradeciera Ud. pueda guiarme en la resolución, me seria de gran utilidad esta herramienta, gracias y un cordial saludo desde Argentina Buenos Aires
      Miguel POLI
      PD.: modifique a los efectos que compile la librería para que reconozca el SH 1106.
      Adjunto error.
      Arduino:1.8.18 (Windows 10), Tarjeta:»Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)»

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:10:0: warning: «OLED_RESET» redefined

      #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:5:0: note: this is the location of the previous definition

      #define OLED_RESET -1 //4

      In file included from C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:3:0:

      C:\Users\User\Documents\Arduino\libraries\Adafruit_SH1106-master/Adafruit_SH1106.h:141:7: error: redefinition of ‘class Adafruit_SH1106’

      class Adafruit_SH1106 : public Adafruit_GFX {

      ^~~~~~~~~~~~~~~

      In file included from C:\Users\User\Documents\Arduino\libraries\EasyMenu_OLED-master/EasyMenu.h:6:0,

      from C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:1:

      C:\Users\User\Documents\Arduino\libraries\Adafruit_SH1106-master/Adafruit_SH1106.h:141:7: note: previous definition of ‘class Adafruit_SH1106’

      class Adafruit_SH1106 : public Adafruit_GFX {

      ^~~~~~~~~~~~~~~

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:37:32: warning: invalid conversion from ‘void (*)()’ to ‘uint16_t {aka unsigned int}’ [-fpermissive]

      uint16_t displayPontiers[4] = {&menuPrincipal, &menuOpciones, &menuConfig, menuLecturas};

      ^~~~~~~~~~~~~~

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:37:48: warning: invalid conversion from ‘void (*)()’ to ‘uint16_t {aka unsigned int}’ [-fpermissive]

      uint16_t displayPontiers[4] = {&menuPrincipal, &menuOpciones, &menuConfig, menuLecturas};

      ^~~~~~~~~~~~~

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:37:63: warning: invalid conversion from ‘void (*)()’ to ‘uint16_t {aka unsigned int}’ [-fpermissive]

      uint16_t displayPontiers[4] = {&menuPrincipal, &menuOpciones, &menuConfig, menuLecturas};

      ^~~~~~~~~~~

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:37:88: warning: invalid conversion from ‘void (*)()’ to ‘uint16_t {aka unsigned int}’ [-fpermissive]

      uint16_t displayPontiers[4] = {&menuPrincipal, &menuOpciones, &menuConfig, menuLecturas};

      ^

      Menu_ADA_4B:62:5: error: ‘display’ does not name a type

      display.setTextSize(1.5);

      ^~~~~~~

      Menu_ADA_4B:63:5: error: ‘display’ does not name a type

      display.setTextColor(WHITE);

      ^~~~~~~

      Menu_ADA_4B:64:5: error: ‘display’ does not name a type

      display.setCursor(0,0);

      ^~~~~~~

      Menu_ADA_4B:66:12: error: expected constructor, destructor, or type conversion before ‘(‘ token

      pinMode(ARRIBA, INPUT_PULLUP);

      ^

      Menu_ADA_4B:67:12: error: expected constructor, destructor, or type conversion before ‘(‘ token

      pinMode(ABAJO, INPUT_PULLUP);

      ^

      Menu_ADA_4B:70:12: error: expected constructor, destructor, or type conversion before ‘(‘ token

      pinMode(ACEPTAR, INPUT_PULLUP);

      ^

      Menu_ADA_4B:71:12: error: expected constructor, destructor, or type conversion before ‘(‘ token

      pinMode(CANCELAR, INPUT_PULLUP);

      ^

      Menu_ADA_4B:73:1: error: expected declaration before ‘}’ token

      }

      ^

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:31:13: warning: ‘void menuLecturas()’ used but never defined

      static void menuLecturas(void);

      ^~~~~~~~~~~~

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:30:13: warning: ‘void menuConfig()’ used but never defined

      static void menuConfig(void);

      ^~~~~~~~~~

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:29:13: warning: ‘void menuOpciones()’ used but never defined

      static void menuOpciones(void);

      ^~~~~~~~~~~~

      C:\Users\User\Desktop\Arduino\LUBRICAD1\Menu_ADA_4B\Menu_ADA_4B.ino:28:13: warning: ‘void menuPrincipal()’ used but never defined

      static void menuPrincipal(void); // Este Error debido a que es ?? si esta definido

      ^~~~~~~~~~~~~

      exit status 1

      ‘display’ does not name a type

      Este informe podría contener más información con
      «Mostrar salida detallada durante la compilación»
      opción habilitada en Archivo -> Preferencias.

        tecnoingeniaPosted on : febrero 22, 2023 at 12:15 am

        Hola Miguel,

        De casualidad tienes un link a un repositorio donde pueda ver tu código?

        error: redefinition of ‘class Adafruit_SH1106’ -> Esto me hace pensar que talvés creaste una clase dentro de la librería (EasyMenu) que se llama igual a la de la librería de Adafruit_SH1106.

Leave a Reply

TecnoIngenia | Blog personal -israel.barreras@tecnoingenia.com