Select Page

¿Aburrido de usar la pantalla LCD en sus proyectos Arduino una y otra vez? ¡Bien! De hecho, son cosa del pasado. ¡Ingrese a las pantallas OLED (diodo emisor de luz orgánico) súper geniales! Son súper livianos, casi delgados como el papel, teóricamente flexibles y producen una imagen más brillante y nítida.

Qué es una pantalla OLED

Un OLED (Organic Light-Emmiting Diode) es un tipo de LED fabricado con un compuesto orgánico que emite luz al recibir una descarga eléctrica. Normalmente se fabrican con Polifluoruro de Vinilideno, una sustancia eco friendly. Las pantallas OLED están formadas por cientos de estos pequeños diodos, y permiten mostrar textos e imágenes monocromáticas.

En la electrónica DIY y maker son muy populares y por ahora vienen pequeñas de 0.96”, que incorporan el chip SSD1306 o SSD1780 y pueden programarse fácilmente usando Arduino u otro microcontrolador. Tienen un consumo de energía bajo (normalmente 15mA, 3.3v) y son muy baratas.

SSD1306 OLED Driver y sus interfaces

En el corazón del módulo se encuentra un potente controlador de OLED CMOS de un solo chip: SSD1306. Se puede comunicar con el microcontrolador de múltiples maneras, incluyendo I2C y SPI.

SPI es generalmente más rápido que I2C pero requiere más pines de E / S. Mientras que I2C requiere solo dos pines y se puede compartir con otros periféricos I2C y/o conectar más de un OLED al mismo tiempo. Es una decisión entre cantidad de pines y velocidad. Por lo tanto, realmente se reduce a tu propia elección.

Gracias a la versatilidad del controlador SSD1306, el módulo viene en diferentes tamaños y colores: por ejemplo, 128×64, 128×32, con OLED blancos, OLED azules y OLED de doble color. La buena noticia es que todas estas pantallas son intercambiables.

Para más información descarga el datasheet SSD1306 OLED LCD

Fuente de alimentación OLED SSD1306

Una pantalla OLED funciona sin luz de fondo (negro puro) porque produce su propia luz en lugar de tener un backlight. Es por eso que la pantalla tiene un contraste tan alto, un ángulo de visión extremadamente amplio y puede mostrar niveles de negro profundos. La ausencia de luz de fondo reduce significativamente la potencia requerida para iluminar el OLED. En promedio, la pantalla usa una corriente de aproximadamente 20 mA, aunque depende de cuánto esté encendida y este factor la hace perfecta para aplicaciones a batería.

El voltaje de funcionamiento del controlador SSD1306 es de 1.65V a 3.3V, mientras que el panel OLED requiere un voltaje de alimentación de 7V a 15V. Todos estos requisitos de potencia diferentes son suficientes utilizando circuitos de bomba de carga interna. Esto permite conectarlo fácilmente a un Arduino o cualquier microcontrolador lógico de 5V sin usar ningún convertidor de nivel lógico.

OLED Memory Map

Independientemente del tamaño del módulo OLED, el controlador SSD1306 tiene una RAM de datos de visualización gráfica (GDDRAM) incorporada de 1 KB para la pantalla que contiene el patrón de bits que se mostrará. Esta área de memoria de 1K está organizada en 8 páginas (de 0 a 7). Cada página contiene 128 columnas / segmentos (bloque 0 a 127). Y cada columna puede almacenar 8 bits de datos (de 0 a 7). Eso seguramente nos dice que tenemos

8 páginas x 128 segmentos x 8 bits de datos = 8192 bits = 1024 bytes = 1 KB de memoria.

La memoria completa de 1K con páginas, segmentos y datos se resalta a continuación.

LCD Gráfico SSD1306 OLED Driver 5
LCD Gráfico SSD1306 OLED Driver 6

Cada bit representa un píxel OLED particular en la pantalla que se puede ENCENDER o APAGAR mediante programación.

NOTA
La pantalla OLED de 128 × 64 muestra todo el contenido de RAM, mientras que la pantalla OLED de 128 × 32 muestra solo 4 páginas (medio contenido) de RAM.

Modo de escritura

La imagen de la pantalla se modifica enviando bytes de datos (1 byte = 8 bits). Cada bit del byte de datos se corresponde al estado de uno de los píxeles de la pantalla. Como la pantalla es monocromática, cada píxel sólo puede tener uno de dos estados: encendido (bit 1) o apagado (bit 0).

El chip tiene varios modos de escritura, es decir, varias formas de colocar los bytes de datos sobre la pantalla. El modo que voy a explicarte es el modo de escritura horizontal (Horizontal Adressing Mode). Este modo facilita mucho la escritura de texto.

Al recibir un byte de datos en el modo de escritura horizontal, la pantalla lo colocará en la primera columna de la primera página e irá llenando las sucesivas columnas con los bytes posteriores.

modo_escritura_horizontal
modo_escritura_horizontal

Al llegar a la última columna de la última página, volverá al principio.

Para escribir en la pantalla habrá que enviarle el byte 0x40 para ponerla en modo de escritura, seguido de otro byte con los datos.

Especificaciones Técnicas

Display TechnologyOLED (Organic LED)
MCU InterfaceI2C / SPI
Screen Size0.96 Inch Across
Resolution128×64 pixels
Operating Voltage3.3V – 5V
Operating Current20mA max
Viewing Angle160°
Characters Per Row21
Number of Character Rows7

OLED Pinout

Antes de sumergirse en la conexión y el código de ejemplo, echemos un vistazo a su Pinout.

LCD Gráfico SSD1306 OLED Driver 7

GND debe estar conectado a la tierra de Arduino

VCC es la fuente de alimentación para la pantalla a la que conectamos el pin de 5 voltios en el Arduino.

SCL es un pin de reloj en serie para la interfaz I2C.

SDA es un pin de datos en serie para la interfaz I2C.

CS o chip select, útil para seleccionar el módulo en caso de conectar varios.

RES se usa para resetear la memoria del módulo.

Conectando el OLED al Arduino

Antes de subir el código y enviar datos a la pantalla, conectemos la pantalla al Arduino.

Las conexiones son bastante simples. Comience conectando el pin VCC a la salida de 5V en el Arduino y conecte GND a tierra.

Ahora nos quedamos con los pines que se utilizan para la comunicación I2C. Tenga en cuenta que cada placa Arduino tiene pines I2C diferentes que deben conectarse en consecuencia. En las placas Arduino con el diseño R3, el SDA (línea de datos) y SCL (línea de reloj) están en los encabezados de los pines cerca del pin AREF. También se conocen como A5 (SCL) y A4 (SDA).

Si tienes un Mega, ¡los pines son diferentes! Querrá usar el formato digital 21 (SCL) y 20 (SDA). Consulte la tabla a continuación para una comprensión rápida.

SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo/Micro32
LCD Gráfico SSD1306 OLED Driver 8

Instalación de la librería OLED Adafruit

El controlador SSD1306 de la pantalla OLED tiene controladores flexibles pero complejos. Se requiere un amplio conocimiento sobre el direccionamiento de memoria para utilizar el controlador SSD1306. Afortunadamente, la biblioteca SSD1306 de Adafruit fue escrita para ocultar las complejidades del controlador SSD1306 para que podamos emitir comandos simples para controlar la pantalla.

Para instalar la biblioteca, navegue hasta Sketch> Incluir biblioteca> Administrar bibliotecas … Espere a que Library Manager descargue el índice de bibliotecas y actualice la lista de bibliotecas instaladas.

LCD Gráfico SSD1306 OLED Driver 9

Filtre su búsqueda escribiendo «adafruit ssd1306». Debería haber un par de entradas. Busque Adafruit SSD1306 por Adafruit. Haga clic en esa entrada y luego seleccione Instalar.

LCD Gráfico SSD1306 OLED Driver 10

Esta biblioteca Adafruit SSD1306 es una biblioteca específica de hardware que maneja funciones de nivel inferior. Debe combinarse con la biblioteca Adafruit GFX para mostrar primitivas gráficas como puntos, líneas, círculos, rectángulos, etc. Instale esta biblioteca también.

LCD Gráfico SSD1306 OLED Driver 11

Problema conocido con el controlador SSD1306

Aunque el SSD1306 tiene un GDDRAM incorporado para la pantalla, no podemos leer su contenido (según Adafruit). Por lo tanto, no es posible manipular el búfer de pantalla para realizar operaciones matemáticas.

Como alternativa, la biblioteca asigna 1 KB (128 × 64) / 8 bits) de memoria de ATmega328P como búfer. Por lo tanto, puede manipular el búfer de pantalla y luego realizar una transferencia masiva desde la memoria del ATmega328P a la memoria interna del controlador SSD1306.

Cambiar tamaño de LCD en la librería OLED

La biblioteca SSD1306 de Adafruit no está configurada para las pantallas OLED de 128×64 (la que estamos usando en este ejemplo). El tamaño de visualización debe cambiarse en el archivo de encabezado Adafruit_SSD1306.h para que funcione.

Si no se cambia, un mensaje de error que dice #error («Altura incorrecta, arregle Adafruit_SSD1306.h!»); puede aparecer al intentar verificar el boceto de ejemplo en el IDE de Arduino:

LCD Gráfico SSD1306 OLED Driver 12
Por lo menos no es un error random y nos da algo de INFO

Para cambiar el archivo de encabezado Adafruit_SSD1306.h, abra la ubicación de su cuaderno de bocetos. Generalmente es Mis documentos> Arduino. Ahora ve a las bibliotecas> Adafruit_SSD1306

Abra el archivo Adafruit_SSD1306.h en un editor de texto. Desplácese hacia abajo para encontrar la sección con las pantallas SSD1306 o vaya directamente a la línea no. 73. Comente #define SSD1306_128_32 y descomente #define SSD1306_128_64 para que el código en esta sección se vea así:

LCD Gráfico SSD1306 OLED Driver 13

Está bueno que las líneas están comentadas así no tenemos que pensar. Aunque estaria mas bueno poder definirlo dentro del código principal.

Código Arduino – Visualización de texto

Ahora viene lo interesante!

El siguiente Sketch de prueba imprimirá el mensaje «¡Hola Mundo!» En la pantalla. También incluye:

  • Mostrar texto invertido
  • Mostrar números
  • Visualización de números con base (Hex, Dec)
  • Mostrar símbolos ASCII
  • Desplazamiento de texto horizontal y verticalmente
  • Desplazar parte de la pantalla

Esto le dará una comprensión completa sobre cómo usar la pantalla OLED y puede servir como base para experimentos y proyectos más prácticos. Pruebe el boceto y luego lo diseccionaremos con cierto detalle.

Al construir el boceto, el IDE mostrará un mensaje de advertencia de poca memoria. Esto se debe a que la biblioteca asigna 1 KB de memoria de ATmega328P como búfer de visualización. Puedes ignorarlo pero tene en cuenta el espacio de memoria para el resto de tu aplicación.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(-1);

void setup()   
{                
	// initialize with the I2C addr 0x3C
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  

	// Clear the buffer.
	display.clearDisplay();

	// Display Text
	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,28);
	display.println("Hello world!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display Inverted Text
	display.setTextColor(BLACK, WHITE); // 'inverted' text
	display.setCursor(0,28);
	display.println("Hello world!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Changing Font Size
	display.setTextColor(WHITE);
	display.setCursor(0,24);
	display.setTextSize(2);
	display.println("Hello!");
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display Numbers
	display.setTextSize(1);
	display.setCursor(0,28);
	display.println(123456789);
	display.display();
	delay(2000);
	display.clearDisplay();

	// Specifying Base For Numbers
	display.setCursor(0,28);
	display.print("0x"); display.print(0xFF, HEX); 
	display.print("(HEX) = ");
	display.print(0xFF, DEC);
	display.println("(DEC)"); 
	display.display();
	delay(2000);
	display.clearDisplay();

	// Display ASCII Characters
	display.setCursor(0,24);
	display.setTextSize(2);
	display.write(3);
	display.display();
	delay(2000);
	display.clearDisplay();

	// Scroll full screen
	display.setCursor(0,0);
	display.setTextSize(1);
	display.println("Full");
	display.println("screen");
	display.println("scrolling!");
	display.display();
	display.startscrollright(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	delay(1000);
	display.startscrollleft(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	delay(1000);    
	display.startscrolldiagright(0x00, 0x07);
	delay(2000);
	display.startscrolldiagleft(0x00, 0x07);
	delay(2000);
	display.stopscroll();
	display.clearDisplay();

	// Scroll part of the screen
	display.setCursor(0,0);
	display.setTextSize(1);
	display.println("Scroll");
	display.println("some part");
	display.println("of the screen.");
	display.display();
	display.startscrollright(0x00, 0x00);
}

void loop() {}

El boceto comienza al incluir cuatro bibliotecas, a saber. SPI.h, Wire.h, Adafruit_GFX.h y Adafruit_SSD1306.h. Aunque la biblioteca SPI.h no es necesaria para las pantallas OLED I2C, debemos agregarla para compilar nuestro programa.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

A continuación, necesitamos crear un objeto de Adafruit_SSD1306.h. El constructor Adafruit_SSD1306 acepta el número de pin Arduino al que está conectado el pin de reinicio de la pantalla. Como la pantalla OLED que estamos usando no tiene un pin RESET, enviaremos -1 al constructor para que ninguno de los pines Arduino se use como reinicio de la pantalla. Pero si tu modelo de LCD OLED si lo trae asignalo en este momento.

Adafruit_SSD1306 display(-1);

En la función de configuración: necesitamos inicializar el objeto OLED usando la función begin (). La función toma dos parámetros. El primer parámetro SSD1306_SWITCHCAPVCC activa los circuitos de la bomba de carga interna mientras que el segundo parámetro proporciona la dirección I2C de la pantalla OLED. La dirección I2C de dicho módulo de pantalla OLED es generalmente 0x3C. Está arreglado y no se puede cambiar.

A continuación, borramos el búfer antes de imprimir nuestro primer mensaje en la pantalla.

// initialize with the I2C addr 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

// Clear the buffer.
display.clearDisplay();

Mostrar texto simple (Hello World)

LCD Gráfico SSD1306 OLED Driver 14
// Display Text
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,28);
display.println("Hello world!");
display.display();
delay(2000);

Para mostrar texto en la pantalla, necesitamos establecer el tamaño de fuente. Esto se puede hacer llamando a setTextSize () y pasando el tamaño de fuente (a partir de 1) como parámetro.

Luego, necesitamos establecer el color de la fuente llamando a la función setTextColor (). Pase el parámetro BLANCO para el fondo oscuro y pase NEGRO para el fondo brillante. Ahora, antes de imprimir el mensaje, necesitamos establecer la posición del cursor llamando a la función setCursor (X, Y). Los píxeles en la pantalla son direccionados por sus coordenadas horizontales (X) y verticales (Y). El sistema de coordenadas coloca el origen (0,0) en la esquina superior izquierda, con X positivo aumentando a la derecha e Y positivo aumentando hacia abajo.

Podemos usar la función simple print («») o println («») para imprimir el mensaje en la pantalla al igual que imprimimos datos en el monitor en serie. Recuerde, println () moverá el cursor a la nueva línea.

Para que la biblioteca realice operaciones matemáticas extremadamente rápidas en el búfer de pantalla (más de 100 cuadros por segundo), las llamadas a las funciones de impresión no transfieren inmediatamente el contenido del búfer de pantalla al controlador SSD1306. Se requiere un comando display () para indicar a la biblioteca que realice la transferencia masiva desde el búfer de pantalla en el ATmega328P a la memoria interna del controlador SSD1306. Tan pronto como se transfiera la memoria, los píxeles correspondientes al búfer de la pantalla aparecerán en la pantalla OLED.

Mostrar texto invertido

LCD Gráfico SSD1306 OLED Driver 15
// Display Inverted Text
display.clearDisplay();
display.setTextColor(BLACK, WHITE); // 'inverted' text
display.setCursor(0,28);
display.println("Hello world!");
display.display();
delay(2000);

Para mostrar texto invertido, llamaremos a la función setTextColor (FontColor, BackgroundColor) nuevamente. Si está prestando atención, sabe que pasamos solo un parámetro a esta función anteriormente, pero ahora estamos pasando dos parámetros. Esto es posible debido a algo llamado sobrecarga de funciones. La sobrecarga de funciones es la capacidad de crear múltiples funciones del mismo nombre pero con un conjunto diferente de parámetros. Las llamadas a una función sobrecargada ejecutarán una implementación específica de esa función dependiendo de los parámetros pasados.

En nuestro caso, pasar setTextColor (NEGRO, BLANCO) representará texto negro en el fondo lleno.

Escalar tamaño de fuente

LCD Gráfico SSD1306 OLED Driver 16
// Changing Font Size
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0,24);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);

Anteriormente en este tutorial, llamamos a la función setTextSize () para establecer el tamaño de fuente y pasamos 1 como parámetro. Puede usar esta función para escalar la fuente pasando cualquier número entero no negativo.

Los caracteres se representan en la proporción de 7:10. Es decir, pasar el tamaño de fuente 1 representará el texto a 7 × 10 píxeles por carácter, pasar 2 representará el texto a 14 × 20 píxeles por carácter y así sucesivamente.

La biblioteca Adafruit_GFX es responsable de representar la fuente. Por defecto, la fuente monoespaciada está seleccionada. Sin embargo, las versiones más recientes de la biblioteca Adafruit GFX ofrecen la posibilidad de usar fuentes alternativas. La biblioteca incluye varias fuentes alternativas, además de la posibilidad de agregar nuevas.

Mostrar números

LCD Gráfico SSD1306 OLED Driver 17
// Display Numbers
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0,28);
display.println(123456789);
display.display();
delay(2000);

Los números se pueden mostrar en la pantalla OLED simplemente llamando a la función print () o println (). Una implementación sobrecargada de estas funciones acepta int sin signo de 32 bits, por lo que solo puede mostrar números del 0 al 4,294,967,295.

Algunos Links Útiles

A %d blogueros les gusta esto: