Autor Tema: Librerías para pantallas OLED ¿enemigo silencioso? en Arduino  (Leído 1617 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 190
Librerías para pantallas OLED ¿enemigo silencioso? en Arduino
« en: 26 de Febrero de 2022, 20:19:50 »
Hola. En esta tarde de un sábado más, estaba trabajando en un proyecto en el cual he desarrollado una LLAVE HARD por medio de un Arduino MICRO (Leonardo). Me ha pasado (en otros proyectos con Arduino NANO) de 300 líneas y varias librerías; que jamás estuve al límite de su memoria.

En este caso le incorporé un Display OLED 128x32 y el mensaje de advertencia de inestabilidad de la memoria, se hizo presente. La primer impresión fue dudar de mi codificación (pero era muy corto) leo 8 teclas y reacciono de acuerdo a la tecla pulsada; la imprimí, la volví a revisar. Menos de 100 líneas me estaban haciendo entrar en crisis con mi memoria.

Rápidamente recordé todos los consejos que hay en la web: Revisa tu código, No es un Microprocesador, Pasa a un Arduino MEGA, etc.

Haciéndotela corta. Era la librería u8g2.h devorándose el 54% de la memoria. Al quitarla se sintió un fuerte estruendo en el cielo, la tierra se movió a mi alrededor mientras volvía a compilar mi MICRO. Ahí estaba el problema. No era mi codificación. Inmediatamente busqué un video tutorial en la web; donde usaran la Adafruit y cuando la compilaban corroboré que el problema también lo tenía esa librería.

Ya sin duda alguna; entré a ver la (.h y la .cpp) corroborando la sospecha. “Son impresionantemente extensas”. Por eso ocupan tanto.

Pero escucha ahora lo que te voy a contar. En un sitio que ya no está. Recuerdo muy bien (hace 8 años atrás) les pregunté.
Cuando un Microcontrolador compila, toma de la librería lo que necesita. O agrega la librería completa? Lo que me respondieron fue: NO. Solo toma lo que necesita.

Querido lector ESTE; NO ES EL CASO evidentemente. Carga TODO.

Propuesta: Mañana pienso comenzar a recortar la librería; sacando todos los modelos que tiene y que no uso en mí proyecto; con el fin de achicarla lo más que pueda. Al menos hasta que quite el mensaje de inestabilidad.

OJO, CUIDADO. Si recortas como yo. No olvides “aislarla” porque en un futuro. Eso que cortaste, te podrá enloquecer con otro display. Por eso “aíslala” y escribí una advertencia. Para que lo recuerdes.

Te deseo lo mejor y te envío un Cordial Saludo.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Librerías para pantallas OLED ¿enemigo silencioso? en Arduino
« Respuesta #1 en: 26 de Febrero de 2022, 22:41:39 »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
Re:Librerías para pantallas OLED ¿enemigo silencioso? en Arduino
« Respuesta #2 en: 27 de Febrero de 2022, 17:36:54 »
Estos displays constan en tu caso de 128 x 32 pixels de  4 páginas con  128 bytes cada una total 512 bytes que se necesitan de tu dispositivo ya que en estos displays no se les puede leer la RAM interna.
Si  usas un 128x64 pues el doble 1k de RAM por el morro "se queda en bragas segun que dispositivo"desperdiciado entre comillas  depende de lo que quieras hacer con el OLED .
Para consumir los menos recursos uso a imprimir sin importar lo que este ya impreso es decir , machacando lo que haya debajo ..Nose si me xplico .
Sin And , Ord ni leches .
Naturalmente se usara toda una página de alto usease 8 pixels mínimo , el ancho el deseado .
Para caracteres y bitmaps mas usados va de lujo y sin usar apenas ram solo los mapas de bits en flash .
Te pongo un ejemplo para que te hagas una idea .
en este caso OLED 128x64 SH1106 spi .


Mapa de bits .

Código: C
  1. rom const char Courier_New16[127][24] ={
  2. // verificar bytes [][x]
  3. // Courier New size:16  Width:12 Height:13   w:12 h:13 di:-4 aa:0
  4. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//  
  5. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  6. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,// !
  7. 0x00,0x00,0x00,0x00,0x00,0x18,0x19,0x18,0x00,0x00,0x00,0x00,
  8. 0x00,0x00,0x07,0x3F,0x07,0x00,0x00,0x07,0x3F,0x07,0x00,0x00,// "
  9. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  10. 0x00,0x00,0x10,0x10,0xFC,0x13,0x10,0xFC,0x13,0x10,0x00,0x00,// #
  11. 0x00,0x00,0x01,0x19,0x07,0x01,0x19,0x07,0x01,0x01,0x00,0x00,
  12. 0x00,0x00,0x00,0x1C,0x22,0x22,0x43,0x42,0x42,0x86,0x00,0x00,// $
  13. 0x00,0x00,0x00,0x0E,0x08,0x08,0x18,0x08,0x0C,0x07,0x00,0x00,
  14. 0x00,0x00,0x8E,0x91,0x51,0x51,0x4E,0x40,0x20,0x20,0x00,0x00,// %
  15. 0x00,0x00,0x00,0x00,0x00,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00,
  16. 0x00,0x00,0x00,0x00,0xB8,0xC4,0x84,0x04,0x04,0x00,0x00,0x00,// &

funciones .

Código: C
  1. /*****************************************************/
  2. void Display_font_CourierNew_16(char chr ){
  3. /*****************************************************/
  4. int16 ch;
  5. ch = (chr - ' ');
  6. ch = ch * 24;
  7.    draw_bitmap_h16(Courier_New16 + ch , 12);
  8.  
  9.  
  10. /**************************************************************/
  11. void draw_bitmap_h16(  rom char  *bitmap , int8 pixels_with ){  // 16 bits de alto
  12. /**************************************************************/
  13.  pon_columna_linea(col,pag);
  14.      
  15.       for (int8 x = 0; x < pixels_with; x++) {
  16.         spi_write( *bitmap++);
  17.       }
  18.  pon_columna_linea(col,pag+1);
  19.       for (int8 x = 0; x < pixels_with; x++) {
  20.         spi_write( *bitmap++);
  21.       }
  22.      
  23.  col=col+pixels_with;
  24. }
  25. }
  26.  
  27. /*****************************************************/
  28. void pon_columna_linea(char x , y){
  29. /*****************************************************/
  30.    x = x + 2;    
  31.     SH1106_command( 0xB0 + y);      // Set row
  32.     SH1106_command( x  & 0x0F);      // Set lower column address
  33.     SH1106_command( 0x10 | (x >> 4));// Set higher column address
  34.  
  35. }

Ejemplo .

Código: C
  1. col=0; pag=0;
  2.   printf(Display_font_CourierNew_12 , "%s", "A1234567890");
  3.    col=0; pag=6;
  4.   draw_bitmap_h16(icono, 32 );

Te puedo pasar mas info o todo lo que tengo si te interesa .
OLED SSD1306_i2c_0,96 "
OLED SH1106 _spi_1,3P "


Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 190
Re:Librerías para pantallas OLED ¿enemigo silencioso? en Arduino
« Respuesta #3 en: 27 de Febrero de 2022, 20:52:26 »
Hola Caballeros.

Te puedo pasar mas info o todo lo que tengo si te interesa.

Gracias Sispic muy gentil de tu parte. Por el momento no será necesario más material.

Cuando escribi (Esta nota informativa a la comunidad de Arduino) lo hice con el espiritu de compartir mis experiencias con los miembros (en el caso que les ocurran los mismo) y saber porque. De este modo, sabrán que decisión personal tomarán frente al problema planteado.

En algún momento critiqué fuertemente este tipo de Pantallas (pese a que son hermosas y simples de aplicar). pero es evidente que sus librerías son exigentes también y es bueno que todos lo sepamos. Como dije; tienen en su alma un enemigo silencioso que devora nuestra SRAM.

Un Cordial Saludo




 

anything