Autor Tema: Primeros Pasos de mi Librería OLED  (Leído 924 veces)

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

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 190
Primeros Pasos de mi Librería OLED
« en: 26 de Marzo de 2022, 19:00:34 »
Hola Buenas Tardes

En uno de mis posteos anteriores planteaba. Si las librerías OLED que están a la mano de todos; no eran nuestros enemigos a la hora de usarlas con un Arduino NANO, 32U4, etc. Dada la escaza capacidad de su memoria.

En ese momento Sispic intento darme una mano; pero opté por no ponerlo en esa molestia; ya que yo necesitaba comprender que alternativas tenía a mi alcance.

Fui buscando otras librerías (que las hay) en la web; pero ninguna terminaba de convencerme.

Las que ocupaban poco espacio limitaban al tamaño del carácter impidiendo tener “grandes caracteres sobre el display”.
Preparaba mi café y pensé. Y si la librería que yo necesito la hago yo mismo. Fue así que comencé a recordar mis clases de Análisis de Sistemas II y comencé a recordar Binario y Hexadecimal.

Y aquí están mis primeros resultados; y como de costumbre, quería compartirlo con Uds. En el caso que les sirva para incursionar en el tema.

Necesitas un:
Arduino NANO, UNO, 32U4
Display OLED 128x32

Aclaraciones:
- NO lo probé en un 128x64 (pero no veo porque no debería funcionar).
- Muestra solo las 8 primeras letras de la A, … y H en una pequeña matriz de 8x8 pixel.
- Vas a ver como muestra las letras intercaladas.
- Con respecto al espesor de la letra dependerá de cómo dibujes tu carácter sobre la matriz de papel.
- Con respecto a la orientación del carácter sobre el Display, dependerá del modo que se organice y sea leída la matriz (array).

Si le tenés recelo a trabajar con Binario y Hexadecimal esta es una oportunidad para aprender o recordar y hacerlo. Bueno este es el Sketch para comenzar a practicar. Ahora es comenzar los ajustes de él e intentar hacer mi primera Librería.

Código: [Seleccionar]

#include <Wire.h>
// Tabla o Array (A, B, C, D, E, F, G, H)
uint8_t array1[8][8]={{0X18, 0X24, 0X42, 0X42, 0X42, 0X7E, 0X42, 0X42},
{0X38, 0X44, 0X44, 0X78, 0X44, 0X42, 0X42, 0X7C},
{0X3C, 0X42, 0X42, 0X40, 0X40, 0X42, 0X42, 0X3C},
{0X7C, 0X42, 0X42, 0X42, 0X42, 0X42, 0X42, 0X7C},
{0X3E, 0X40, 0X40, 0X78, 0X40, 0X40, 0X40, 0X3E},
{0X7E, 0X40, 0X40, 0X7C, 0X40, 0X40, 0X40, 0X40},
{0X3C, 0X42, 0X40, 0X7C, 0X42, 0X42, 0X42, 0X3C},
{0X42, 0X42, 0X42, 0X7E, 0X42, 0X42, 0X42, 0X42}};

void setup()   {               
     Wire.begin(); // Iniciar la comunicacion I2C de Arduino
     TWBR = 12;  // Frecuencia SCL 400MHz (velocidad refresca Pantalla)
     Wire.beginTransmission(0x3C); // Abro Canal de Comunicacion
       Wire.write(0x00); // (como decir HOME - CLEAR creo)
       Wire.write(0xAE); // Apago pantalla
       Wire.write(0xA6); // Poner la pantalla en modo Normal
       Wire.write(0xA2); // Configurar 198 columnas
       Wire.write(0x04); // x32 o Wire.write(0x3F)=63 lineas;
       Wire.write(0xD3); // Poner el offset a 0
       Wire.write(0x40); // Modo WRITE
       Wire.write(0xDA); // Mapear los pines COM
       Wire.write(0x02); // o Wire.write(0x12);
       Wire.write(0x81); // Configurar el contraste
       Wire.write(0x7F); // Este valor tiene que estar entre 0x00 (min) y 0xFF (max)
       Wire.write(0xA4); // Muestra el contenido almacenado en la GDDRAM del Display
       Wire.write(0xD5); Wire.write(0x80); // Establecer la velocidad del Oscilador
       Wire.write(0x8D); Wire.write(0x14); // Activar los Condensadores 'charge pump'
       Wire.write(0xAF); // Encender la pantalla
       // Como extra, establecemos el rango de columnas y paginas
       Wire.write(0x04); // (21) Paginas de 0 a 7
       Wire.write(0x00); // Home
       Wire.write(0x7F); // 7F
       Wire.write(0x22); // (22) Columnas de 0 a 127
       Wire.write(0x00); // Home
       Wire.write(0x07); // 07
       Wire.write(0x20); // Modo de escritura horizontal
       Wire.write(0x00);
     Wire.endTransmission(); // Cierro Canal de Comunicacion
}

void loop() {
     // Mostrando el Caracter
     for ( int i=0; i<8; ++i ) {
         screenClear(); // Limpiando Display
         for ( int j=0; j<8; j++ ) {
              Wire.beginTransmission(0x3C);
              Wire.write(0x40); Wire.write(array1[i][j]);
              Wire.endTransmission();
         }
     delay(500);
     }
}

void screenClear(){
     for (int i=0; i<512; i++){
         Wire.beginTransmission(0x3C);
         Wire.write(0x40); Wire.write(0x00);
         Wire.endTransmission();}
     delay(250);   
return;}


Aquí un breve video que te muestra el resultado

Un Cordial saludo para todos.
« Última modificación: 26 de Marzo de 2022, 19:47:05 por humberto 02 »