Usando o driver MicroPython SSD1306 para fazer interface de um display OLED com ESP8266 e ESP32

Uso del controlador MicroPython SSD1306 para conectar una pantalla OLED con ESP8266 y ESP32

Probablemente haya oído hablar de las pantallas de diodos emisores de luz orgánicos (OLED) SSD1306 o SSD1315. Estas pantallas monocromáticas suelen tener un rango de precios similar al de las pantallas de personajes, lo que proporciona un atractivo más estético. Lo más importante es que proporcionan una interfaz verdaderamente gráfica para un dispositivo integrado.

Las pantallas OLED están disponibles en placas de conexión listas para usar que se pueden insertar fácilmente en prácticamente cualquier PCB. En lugar de caracteres y números simples, los OLED pueden mostrar gráficos complejos donde el usuario puede programar cada píxel individual de la pantalla.

SSD1306 o SSD1315 son los nombres de los chips del controlador OLED. El repositorio oficial de MicroPython no tiene una biblioteca de controladores para SSD1306. Si bien hay bifurcaciones de la misma biblioteca realizadas por otros desarrolladores que afirman funcionar bien con el SSD1315, estas afirmaciones no están confirmadas actualmente.

De hecho, incluso el controlador SSD1306 disponible en el repositorio de código oficial tiene errores en la implementación de I2C. Para nuestros propósitos, solo cubriremos la biblioteca oficial del controlador SSD1306 con una demostración de su implementación SPI, que ha demostrado funcionar.

SSD1306 es un controlador CMOS OLED/PLED de un solo chip. Puede gestionar una pantalla gráfica de matriz de puntos de 128×64. Está diseñado para controlar paneles OLED de cátodo común. El chip viene con varias funciones integradas, como control de brillo de 256 pasos, RAM de pantalla, oscilador y control de contraste. Las características integradas del chip SSD1306 significan que no hay requisitos adicionales para que un controlador o bloque interactúe con la pantalla OLED en una placa de conexión.

El chip controlador SSD1306 se utiliza para controlar pantallas OLED monocromáticas con resoluciones de 128×64 (0,96″), 128×32 (0,91″) o pantallas OLED más pequeñas. El controlador OLED utiliza interfaces I2C y SPI para conectarse a un microcontrolador o microcomputadora. Algunas placas de conexión utilizan sólo la interfaz I2C, mientras que otras ofrecen ambas interfaces.

La implementación I2C de la biblioteca del controlador OLED MicroPython SSD1306 tiene errores de tiempo de ejecución, por lo que vale la pena comprar un módulo de pantalla OLED SSD1306 con una interfaz SPI integrada. El módulo de pantalla OLED SSD1306 puede mostrar gráficos muy complejos, incluidos texto, imágenes de mapa de bits y animaciones.

Estas pantallas OLED son populares para diseñar dispositivos portátiles y de IoT.

La pantalla OLED SSD1306
Las pantallas OLED para dispositivos integrados vienen en dos tamaños estándar:

  • 0,91″ con resolución de pantalla de 128×32
  • 0,96″ con una resolución de pantalla de 128×64.

Los monitores son monocromáticos azul, monocromático blanco o azul-amarillo. El módulo de pantalla OLED puede tener un puerto de 3/4 pines, que es solo para interfaz I2C, o una interfaz de 7 pines para interfaz SPI de 3 cables, SPI de 4 cables o I2C.

El módulo SSD1306 que probaremos en el tutorial es una pantalla de 0,96″ con una resolución de 128×64. Es de color monocromático amarillo-azul.

El módulo aquí tiene una interfaz de 7 pines, lo que le permite interactuar con cualquier microcontrolador o SBC a través de una interfaz SPI de 3 cables, SPI de 4 cables e I2C.

La pantalla OLED de 7 pines tiene esta configuración de pines:

Interfaz UE de SSD1306 con ESP8266
El módulo OLED SSD1306 se puede conectar al ESP8266 mediante un bus I2C o SPI. Se pueden utilizar tanto hardware como software SPI.

Para interactuar con el bus I2C, conecte los pines SCL y SDA en el SSD1306 OLED con GPIO5 y GPIO4 del ESP8266, respectivamente. La fuente de alimentación y la tierra del módulo OLED se pueden proporcionar a través de la salida de 3V y GND del ESP8266 respectivamente.

Actualmente, la implementación I2C de la biblioteca del controlador OLED SSD1306 tiene errores de tiempo de ejecución para ETIMEOUT. Por lo tanto, se recomienda utilizar SPI para interactuar con el módulo OLED.

Como se mencionó, se pueden utilizar SPI tanto de hardware como de software. El software SPI puede utilizar cualquier pin capaz de generar SCK, MOSI, RST, DC y CS. Estas conexiones de circuito se pueden utilizar para interconectar el SSD1306 mediante hardware y software SPI.

Interfaz SSD1306 con ESP32
La pantalla OLED SSD1306 se puede interconectar con el ESP32 utilizando hardware y software I2C y SPI.

Para interactuar a través de I2C, conecte los pines SCL y SDA en el SSD1306 OLED con GPIO22 y GPIO21 del ESP32, respectivamente. La fuente de alimentación y la tierra del módulo OLED se pueden proporcionar a través de la salida 3V y GND del ESP32 respectivamente.

Nuevamente, la implementación I2C de la biblioteca del controlador OLED SSD1306 genera el error de tiempo de ejecución, ETIMEOUT. Por lo tanto, se recomienda utilizar SPI para interactuar con el módulo OLED. Se puede utilizar hardware y software SPI. El software SPI puede utilizar cualquier pin capaz de generar SCK, MOSI, RST, DC y CS.

Las conexiones del circuito se pueden utilizar para interconectar el SSD1306 mediante hardware y software SPI.

Controlador MicroPython SSD1306
La biblioteca del controlador OLED SSD1306 ahora forma parte del MicroPython estándar. La biblioteca se puede encontrar aquí .

Aquí está el código fuente de esta biblioteca:

El código del controlador SSD1306
El controlador OLED SSD1306 comienza importando la clase const del módulo MicroPython y el módulo framebuf. La clase const se utiliza para definir las constantes de los miembros de la clase. framebuf es un módulo diseñado para manipular buffers de fotogramas, como imágenes de mapa de bits.

A esto le sigue una declaración de las constantes para los registros SSD1306. Las constantes reciben las direcciones hexadecimales de los respectivos registros SSD1306.

A continuación, se define la clase SSD1306, que toma el frame buffer como único parámetro. La función constructora de la clase SSD1306 toma como parámetros el ancho de la pantalla en píxeles, la altura de la pantalla en píxeles y el pin de alimentación externo. Estos argumentos se utilizan para determinar el número de páginas en la pantalla, creando un objeto de búfer que puede almacenar el búfer de cuadros de cada página.

La clase SSD1306 incluye estos métodos...

  • initial_display : inicializa la pantalla configurando varios parámetros, como resolución horizontal, dirección de columna, reloj de pantalla, contraste y configuración de RAM.
  • apagado : apaga la pantalla.
  • on : enciende la pantalla.
  • Contraste : establece el contraste de la pantalla.
  • invertido : invierte el color del texto.
  • rotar : gira la pantalla.
  • show : muestra la pantalla de visualización; como se llama este método, el contenido escrito en la RAM OLED se muestra en la pantalla OLED.

El controlador utiliza varios métodos de la clase FrameBuffer del módulo framebuf para escribir texto o dibujar formas en la pantalla OLED.

Los siguientes métodos de la clase FrameBuffer son útiles para manipular texto y formas en el SSD1306 OLED.

  • FrameBuffer.fill(c) : rellena todo el framebuffer con un color específico. El controlador OLED SSD1306 utiliza este método para llenar la pantalla OLED con un color monocromático.
  • FrameBuffer.pixel(x, y(, c)) : Obtiene o establece el color de un píxel específico. La posición del píxel se pasa como argumentos 'x' e 'y'. Si se usa para establecer el color del píxel, 'c' es el color pasado como argumento.
  • FrameBuffer.hline(x, y, w, c) : dibuja una línea horizontal de ancho 'w', comenzando en las posiciones de píxeles 'x' e 'y'. La línea horizontal se rellena con el color "c".
  • FrameBuffer.vline(x, y, h, c) : dibuja una línea vertical con la altura, 'h', comenzando en las posiciones de los píxeles, 'x' e 'y'. La línea vertical se rellena con el color "c".
  • FrameBuffer.line(x1, y1, x2, y2, c) : dibuja una línea entre los píxeles colocados en (x1, y1) y (x2, y2). La línea se rellena con el color 'c'.
  • FrameBuffer.rect(x, y, w, h, c) : dibuja un rectángulo con ancho 'w' y alto 'h', comenzando en las posiciones de píxeles 'x' e 'y'. Los bordes del rectángulo están rellenos con el color "c".
  • FrameBuffer.fill_rect(x, y, w, h, c) : dibuja un cuadro rectangular con ancho 'w' y alto 'h', comenzando en las posiciones de los píxeles, 'x' e 'y'. El cuadro rectangular está lleno del color 'c'.

La pantalla OLED monocromática sólo puede tener dos colores para cada píxel. Está lleno del color monocromático del OLED o del color invertido. Por lo tanto, el valor del argumento c sólo puede ser '0' o '1'.

El '0' indica el color monocromático verdadero y el '1' indica el color invertido. La posición del píxel se puede especificar como 0~128 a lo largo del eje x y 0~64 a lo largo del eje y en el caso de una resolución OLED de 128×64.

  • FrameBuffer.text(s, x, y(, c)) : escribe una cadena de texto en la pantalla OLED. El texto comienza a imprimirse en la pantalla desde las posiciones de los píxeles, 'x' e 'y'. El color del texto se puede configurar en 'c'.

La definición de clase del SSD1306 va seguida de la definición de clase de otra clase, el SSD1306_I2C. Esta clase tiene una función constructora y dos métodos: write_cmd para escribir el comando OLED y write_data para escribir los datos de visualización.

Actualmente, la ejecución de esta clase genera un error de tiempo de ejecución.

La clase SSD1306_SPI está definida por la implementación del bus SPI para el SSD1306 OLED. Esta clase tiene una función constructora y dos métodos: write_cmd para escribir el comando OLED y write_data para escribir los datos de visualización.

Cargando el controlador OLED con uPyCraft IDE
Para cargar el controlador OLED para ESP8266 o ESP32 usando uPyCraft IDE, conecte la placa a una computadora usando un cable USB. Asegúrese de que el firmware MicroPython para ESP8266/ESP32 esté cargado.

Seleccione el puerto COM ESP8266/ESP32 para asegurarse de que esté conectado navegando a Herramientas->Serial y elija su placa MicroPython navegando a Herramientas->Tablero. Luego conecte la placa al IDE de uPyCraft haciendo clic en el botón de conexión.

Una vez que la placa esté conectada, puede buscar boot.py en la carpeta del dispositivo. Para agregar el controlador OLED SSD1306, cree un nuevo archivo navegando a Archivo->Nuevo o haciendo clic en el botón Nuevo.

Copie el código de la biblioteca del controlador OLED SSD1306 y guarde el archivo como ssd1306.py. Finalmente, haga clic en el botón Descargar y ejecutar para cargar el archivo de la biblioteca en ESP8266/ESP32.

Una vez cargado el archivo, se puede importar al script principal y utilizarlo como interfaz para la pantalla OLED.

Cargando el controlador OLED con Thonny IDE
Si está utilizando Thonny IDE, cree un nuevo archivo navegando a Archivo->Nuevo. Copie el código de la biblioteca del controlador OLED SSD1306 aquí y guarde el archivo como ssd1306.py. Para cargar el archivo a ESP8266/ESP32, navegue hasta Dispositivo -> Cargar script actual con el nombre actual.

Para verificar que el archivo se cargó correctamente en ESP8266/ESP32, escriba este comando en el shell:
%lsdispositivo

Devolverá una lista de archivos cargados en el tablero. La lista debe incluir ssd1306.py.

Visualización de datos del sensor en SSD1306
La pantalla OLED SSD1306 se puede utilizar con ESP8266/ESP32 para mostrar datos de sensores, mostrar parámetros de red o mostrar información recibida de un servidor IoT remoto.

El método de texto de la clase FrameBuffer requiere un argumento de cadena. Los valores devueltos por sensores, valores de parámetros de red o información de IoT suelen ser valores enteros o de punto flotante. Estos valores primero deben convertirse en una cadena usando la función str cPython/MicroPython.

Este es un ejemplo válido de conversión de un valor entero o de punto flotante de un sensor a una cadena.
temperatura = 25
cadena_temp = cadena(temp)

El objeto de cadena se puede pasar directamente como argumento al método de texto para mostrarlo en el OLED.
oled.text(cadena_temp, 0, 0)
oled.mostrar

Mostrando texto en SSD1306 con ESP8266
Ahora mostremos mensajes de texto en el SSD1306 OLED. En este tutorial, SSD1306 está conectado con ESP8266.

Componentes necesarios
1.ESP8266x1
2. SSD1306 OLED con interfaz SPI x1
3. Cables de conexión/cables de puente

Conexiones de circuito
Conectamos el SSD1306 OLED al ESP8266 usando el software SPI. Los pines DC, RST y CS del OLED están conectados a GPIO4, GPIO5 y GPIO15 respectivamente. Los pines D0 y D1 del módulo OLED están conectados a GPIO14 y GPIO13. Los pines VCC y GND del módulo OLED están conectados a la salida 3V y GND del ESP8266.

El script MicroPython

Como funciona
El módulo de pantalla OLED interactúa con ESP8266 mediante el software SPI. Los métodos de la clase ssd1306 se utilizan para controlar el OLED, mientras que los métodos del módulo framebuf se utilizan para imprimir mensajes de texto en el OLED.

Código
Guarde el código anterior como main.py y cargue el archivo en ESP8266 haciendo clic en el botón Descargar y ejecutar. El código comienza importando las clases Pin y SoftSPI desde el módulo de la máquina. Se importa el módulo ssd1306, que primero debe cargarse en el ESP8266. También se importa la clase de sueño del módulo de tiempo.

Un objeto, espi, se crea a partir de la clase SoftSPI, que se instancia con una velocidad de baudios de 500.000 Hz, polaridad 1, fase 0, así como un pin SCK al pin GPIO14 y un pin MOSI a GPIO13.

El pin MISO no se utiliza con el módulo OLED. GPIO12 recibe el MISO para el software SPI. Los pines DC, RST y CS están configurados para GPIO4, GPIO5 y GPIO15, respectivamente. Estas constantes de pin se utilizan para crear un objeto de clase SSD1306_SPI oled. Se crea una instancia del objeto de clase para un ancho de pantalla de 128 píxeles y una altura de 64 píxeles. El texto se imprime en la pantalla SSD1306 llamando al método oled.text. Se muestra en la pantalla cuando se llama al método oled.show.

En el script MicroPython anterior, se muestran dos mensajes de texto en la pantalla OLED en intervalos de dos segundos. El método de suspensión se utiliza para proporcionar el retraso entre los dos mensajes.

Los resultados

Video:

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.