MicroPython: pantalla OLED con ESP32 y ESP8266

En el mundo de la electrónica y la programación, el MicroPython ha cobrado cada vez más relevancia por su facilidad de uso y versatilidad. En este artículo, exploraremos cómo utilizar MicroPython para trabajar con pantallas OLED en dispositivos ESP32 y ESP8266. ¡Descubre cómo dar vida a tus proyectos con esta poderosa combinación de tecnologías!

En esta guía aprenderá cómo usar la pantalla OLED SSD1306 de 0,96 pulgadas con un ESP32 o ESP8266 usando el firmware MicroPython. Como ejemplo, le mostraremos cómo mostrar un mensaje sencillo de «¡Hola mundo!». Más adelante también le mostraremos cómo utilizar otras funciones útiles para interactuar con la pantalla OLED.

MicroPython: pantalla OLED con ESP32 y ESP8266

Quizás también quieras leer nuestras instrucciones dedicadas para ESP con pantalla OLED usando el IDE de Arduino:

  • Pantalla OLED ESP32 con Arduino IDE
  • Pantalla OLED ESP8266 con Arduino IDE

requisitos

Para seguir este tutorial, debe tener instalado el firmware MicroPython en sus placas ESP32 o ESP8266. También necesitarás un IDE para escribir el código y subirlo a tu placa. Recomendamos utilizar Thonny IDE o uPyCraft IDE:

  • IDE de Thonny:
    • Instalación y primeros pasos con Thonny IDE
    • Actualización del firmware MicroPython con esptool.py
  • IDE de UpyCraft:
    • Comenzando con uPyCraft IDE
    • Instale uPyCraft IDE (Windows, Mac OS X, Linux)
    • Flashear/cargar firmware MicroPython a ESP32 y ESP8266

Obtenga más información sobre MicroPython: Programación de MicroPython con ESP32 y ESP8266 eBook

Introducción de la pantalla OLED

En esta guía utilizamos el Pantalla OLED SSD1306 de 0,96 pulgadas es decir, 128 × 64 píxeles y utiliza el protocolo de comunicación I2C.

MicroPython: pantalla OLED con ESP32 y ESP8266

comunicación I2C

Para la pantalla OLED I2C, debe realizar las siguientes conexiones:

OLED ESP32 ESP8266
vino 3,3 V 3,3 V
Dimensiones Dimensiones Dimensiones
SCL GPIO22 GPIO5 (D1)
ASD GPIO21 GPIO4 (D2)

Piezas requeridas

Aquí hay una lista de las piezas que necesitará para este proyecto:

Puedes utilizar los enlaces anteriores o ir directamente MakerAdvisor.com/tools ¡Para encontrar todas las piezas para tus proyectos al mejor precio!

MicroPython: pantalla OLED con ESP32 y ESP8266

Diagrama de cableado – ESP32

Siga el siguiente diagrama esquemático si está utilizando una placa ESP32:

MicroPython: pantalla OLED con ESP32 y ESP8266

Recomendaciones de literatura: Guía de referencia de asignación de pines ESP32

Diagrama de circuito – ESP8266

Siga el siguiente esquema si está utilizando una placa ESP8266:

MicroPython: pantalla OLED con ESP32 y ESP8266

Recomendaciones de literatura: Guía de referencia de asignación de pines ESP8266

Biblioteca OLED SSD1306

De forma predeterminada, la biblioteca para escribir en la pantalla OLED no forma parte de la biblioteca estándar de MicroPython. Entonces necesitas cargar la biblioteca en tu placa ESP32/ESP8266.

# MicroPython SSD1306 OLED driver, I2C and SPI interfaces created by Adafruit

import time
import framebuf

# register definitions
SET_CONTRAST        = const(0x81)
SET_ENTIRE_ON       = const(0xa4)
SET_NORM_INV        = const(0xa6)
SET_DISP            = const(0xae)
SET_MEM_ADDR        = const(0x20)
SET_COL_ADDR        = const(0x21)
SET_PAGE_ADDR       = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP       = const(0xa0)
SET_MUX_RATIO       = const(0xa8)
SET_COM_OUT_DIR     = const(0xc0)
SET_DISP_OFFSET     = const(0xd3)
SET_COM_PIN_CFG     = const(0xda)
SET_DISP_CLK_DIV    = const(0xd5)
SET_PRECHARGE       = const(0xd9)
SET_VCOM_DESEL      = const(0xdb)
SET_CHARGE_PUMP     = const(0x8d)


class SSD1306:
    def __init__(self, width, height, external_vcc):
        self.width = width
        self.height = height
        self.external_vcc = external_vcc
        self.pages = self.height // 8
        # Note the subclass must initialize self.framebuf to a framebuffer.
        # This is necessary because the underlying data buffer is different
        # between I2C and SPI implementations (I2C needs an extra byte).
        self.poweron()
        self.init_display()

    def init_display(self):
        for cmd in (
            SET_DISP | 0x00, # off
            # address setting
            SET_MEM_ADDR, 0x00, # horizontal
            # resolution and layout
            SET_DISP_START_LINE | 0x00,
            SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0
            SET_MUX_RATIO, self.height - 1,
            SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0
            SET_DISP_OFFSET, 0x00,
            SET_COM_PIN_CFG, 0x02 if self.height == 32 else 0x12,
            # timing and driving scheme
            SET_DISP_CLK_DIV, 0x80,
            SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1,
            SET_VCOM_DESEL, 0x30, # 0.83*Vcc
            # display
            SET_CONTRAST, 0xff, # maximum
            SET_ENTIRE_ON, # output follows RAM contents
            SET_NORM_INV, # not inverted
            # charge pump
            SET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14,
            SET_DISP | 0x01): # on
            self.write_cmd(cmd)
        self.fill(0)
        self.show()

    def poweroff(self):
        self.write_cmd(SET_DISP | 0x00)

    def contrast(self, contrast):
        self.write_cmd(SET_CONTRAST)
        self.write_cmd(contrast)

    def invert(self, invert):
        self.write_cmd(SET_NORM_INV | (invert & 1))

    def show(self):
        x0 = 0
        x1 = self.width - 1
        if self.width == 64:
            # displays with width of 64 pixels are shifted by 32
            x0 += 32
            x1 += 32
        self.write_cmd(SET_COL_ADDR)
        self.write_cmd(x0)
        self.write_cmd(x1)
        self.write_cmd(SET_PAGE_ADDR)
        self.write_cmd(0)
        self.write_cmd(self.pages - 1)
        self.write_framebuf()

    def fill(self, col):
        self.framebuf.fill(col)

    def pixel(self, x, y, col):
        self.framebuf.pixel(x, y, col)

    def scroll(self, dx, dy):
        self.framebuf.scroll(dx, dy)

    def text(self, string, x, y, col=1):
        self.framebuf.text(string, x, y, col)


class SSD1306_I2C(SSD1306):
    def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False):
        self.i2c = i2c
        self.addr = addr
        self.temp = bytearray(2)
        # Add an extra byte to the data buffer to hold an I2C data/command byte
        # to use hardware-compatible I2C transactions.  A memoryview of the
        # buffer is used to mask this byte from the framebuffer operations
        # (without a major memory hit as memoryview doesn't copy to a separate
        # buffer).
        self.buffer = bytearray(((height // 8) * width) + 1)
        self.buffer[0] = 0x40  # Set first byte of data buffer to Co=0, D/C=1
        self.framebuf = framebuf.FrameBuffer1(memoryview(self.buffer)[1:], width, height)
        super().__init__(width, height, external_vcc)

    def write_cmd(self, cmd):
        self.temp[0] = 0x80 # Co=1, D/C#=0
        self.temp[1] = cmd
        self.i2c.writeto(self.addr, self.temp)

    def write_framebuf(self):
        # Blast out the frame buffer using a single I2C transaction to support
        # hardware I2C interfaces.
        self.i2c.writeto(self.addr, self.buffer)

    def poweron(self):
        pass


class SSD1306_SPI(SSD1306):
    def __init__(self, width, height, spi, dc, res, cs, external_vcc=False):
        self.rate = 10 * 1024 * 1024
        dc.init(dc.OUT, value=0)
        res.init(res.OUT, value=0)
        cs.init(cs.OUT, value=1)
        self.spi = spi
        self.dc = dc
        self.res = res
        self.cs = cs
        self.buffer = bytearray((height // 8) * width)
        self.framebuf = framebuf.FrameBuffer1(self.buffer, width, height)
        super().__init__(width, height, external_vcc)

    def write_cmd(self, cmd):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs.high()
        self.dc.low()
        self.cs.low()
        self.spi.write(bytearray([cmd]))
        self.cs.high()

    def write_framebuf(self):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs.high()
        self.dc.high()
        self.cs.low()
        self.spi.write(self.buffer)
        self.cs.high()

    def poweron(self):
        self.res.high()
        time.sleep_ms(1)
        self.res.low()
        time.sleep_ms(10)
        self.res.high()

Ver código sin formato

Siga las siguientes instrucciones para el IDE que está utilizando:

  • A. Cargue la biblioteca OLED con IDE de UpyCraft
  • B. Cargar la biblioteca OLED con IDE de Thonny

A. Cargue la biblioteca OLED usando uPyCraft IDE

Esta sección muestra cómo cargar una biblioteca usando uPyCraft IDE. Si está utilizando Thonny IDE, lea la siguiente sección.

1. Crea un nuevo archivo presionando archivo nuevo Botón.

MicroPython: pantalla OLED con ESP32 y ESP8266

2. Copie el código de la biblioteca OLED a este archivo. El código de la biblioteca OLED se puede encontrar aquí.

Nota: La biblioteca de pantallas OLED SSD1306 fue desarrollada por Adafruit y ya no está disponible
estar actualizado. De momento esta funcionando bien. Sin embargo, actualizaremos esta guía cuando lo hagamos.
Encuentre una biblioteca similar que funcione tan bien como esta.

3. Después de copiar el código, guarde el archivo presionando el botón Ahorrar Botón.

MicroPython: pantalla OLED con ESP32 y ESP8266

4. Nombra este nuevo archivo “ssd1306.py» y presione DE ACUERDO.

MicroPython: pantalla OLED con ESP32 y ESP8266

5. presione eso Descargar y ejecutar Botón.

MicroPython: pantalla OLED con ESP32 y ESP8266

El archivo debe estar en la carpeta del dispositivo llamada «ssd1306.py» como
se destaca en la siguiente figura.

MicroPython: pantalla OLED con ESP32 y ESP8266

Ahora puede utilizar las funciones de la biblioteca en su código importando la biblioteca.

B. Cargar la biblioteca OLED con Thonny IDE

Si está utilizando Thonny IDE, siga los siguientes pasos:

1. Cree un nuevo archivo en Thonny IDE y copie el código de la biblioteca. El código de la biblioteca OLED se puede encontrar aquí.

2. Ir a archivo > Ahorrar como y elegir Dispositivo MicroPython.

MicroPython: pantalla OLED con ESP32 y ESP8266

3. Nombra el archivo ssd1306.py y haga clic DE ACUERDO para guardar el archivo en el sistema de archivos ESP.

Y eso fue todo. La biblioteca se ha subido a tu tablero. Ahora puede utilizar las funciones de la biblioteca en su código importando la biblioteca.

código

Después de cargar la biblioteca en ESP32 o ESP8266, copie el siguiente código en el
principal.py Archivo. Simplemente imprime el '¡Hola Mundo!' El mensaje aparece tres veces en la pantalla.

# Complete project details at https://RandomNerdTutorials.com/micropython-programming-with-esp32-and-esp8266/

from machine import Pin, SoftI2C
import ssd1306
from time import sleep

# ESP32 Pin assignment 
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))

# ESP8266 Pin assignment
#i2c = SoftI2C(scl=Pin(5), sda=Pin(4))

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

oled.text('Hello, World 1!', 0, 0)
oled.text('Hello, World 2!', 0, 10)
oled.text('Hello, World 3!', 0, 20)
        
oled.show()

Ver código sin formato

Cómo funciona el código

Comience importando los módulos necesarios para interactuar con los GPIO y enviar datos a la pantalla OLED a través de la comunicación I2C. Tienes que Bolígrafo Y suaveI2C clases de la máquina Módulo.

from machine import Pin, SoftI2C

También debe importar la biblioteca OLED que cargó previamente en la placa como ssd1306.py Archivo.

import ssd1306

Los pines I2C estándar ESP32 son GPIO22 (SCL) y GPIO21 (ADS). Los pines I2C estándar del ESP8266 son GPIO5 (SLC) y GPIO4 (ADS).

Utilice la siguiente línea si está utilizando una placa ESP32:

# ESP32 Pin assignment 
i2c = SoftI2C(scl=Pin(22), sda=Pin(21))

Comente la línea anterior y descomente la siguiente línea si está utilizando una placa ESP8266:

#ESP8266 Pin assignment
i2c = SoftI2C(scl=Pin(5), sda=Pin(4))

Defina el ancho y el alto de la pantalla OLED utilizando las siguientes variables:

oled_width = 128
oled_height = 64

Luego crea uno SSD1306_I2C Objeto nombrado OLED. Este objeto acepta el ancho, alto y pines I2C de OLED que definiste previamente.

oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

Después de inicializar la pantalla OLED, es suficiente Texto() función en el OLED Objeto para escribir texto. Después Texto() Tienes que usar la función. espectáculo() Método para actualizar el OLED.

oled.text('Hello, World 1!', 0, 0)
oled.text('Hello, World 2!', 0, 10)
oled.text('Hello, World 3!', 0, 20)
oled.show()

El Texto() El método acepta los siguientes argumentos (en este orden):

  • Noticias: debe ser de tipo String
  • Posición X: donde comienza el texto
  • Posición Y: donde el texto se muestra verticalmente
  • Color de texto: puede ser blanco o negro. El color predeterminado es el blanco y este parámetro es opcional.
    • 0 = negro
    • 1 = blanco

Por ejemplo, la siguiente línea escribe el mensaje «¡Hola, mundo 1!» en color blanco. El texto comienza en x = 0 e y = 0.

oled.text('Hello, World 1!', 0, 0)

La siguiente línea de código escribe el texto en la siguiente línea (y =10).

oled.text('Hello, World 2!', 0, 10)

Finalmente, para que los cambios surtan efecto, utilice el espectáculo() método en el OLED Objeto.

oled.show()

demostración

Sube el código a tu tablero. Su pantalla OLED ahora debería verse así:

MicroPython: pantalla OLED con ESP32 y ESP8266

Más funciones OLED

La biblioteca ofrece métodos adicionales para interactuar con la pantalla OLED.

Llena la pantalla

Para llenar toda la pantalla con blanco, use el llenar() Funciona de la siguiente manera:

oled.fill(1)
oled.show()
MicroPython: pantalla OLED con ESP32 y ESP8266

Para borrar la pantalla, utilice el llenar() Método como pase 0 como argumento. (Establece todos los píxeles en negro):

oled.fill(0)
oled.show()

dibujar un píxel

Para dibujar un píxel, utilice el Píxel() método seguido por el espectáculo() Método. El Píxel() El método acepta los siguientes argumentos:

  • Coordenada X: Posición del píxel horizontalmente
  • Coordenada Y: Posición de píxel vertical
  • Color de píxel: puede ser blanco o negro
    • 0 = negro
    • 1 = blanco

Por ejemplo, para dibujar un píxel blanco en la esquina superior izquierda:

oled.pixel(0, 0, 1)
oled.show()
MicroPython: pantalla OLED con ESP32 y ESP8266

Colores invertidos

También puedes invertir los colores OLED: blanco con negro y viceversa, con eso volviendo atrás() Método:

oled.invert(True)
MicroPython: pantalla OLED con ESP32 y ESP8266

Para restaurar los colores originales utilice:

oled.invert(False)

Ver datos de sensores

El Texto() La función sólo acepta variables de tipo String como mensajes. Los valores del sensor generalmente se almacenan en variables int o float.

Si desea mostrar los valores del sensor y están almacenados en variables int o float, debe convertirlos en una cadena. Para convertir los datos a una cadena, puede utilizar el cadena() Función:

temperature = 12.34
temperature_string = str(temperature)

Entonces tú puedes Cadena de temperatura Variable en el OLED con el Texto() Y espectáculo() Métodos:

oled.text(temperature_string, 0, 0)
oled.show()

Envolver

Esta guía rápida le mostró cómo utilizar las funciones básicas de OLED: escribir texto y dibujar píxeles con ESP32 y ESP8266 usando MicroPython. Ahora puedes utilizar el OLED en tus propios proyectos para mostrar mensajes o valores de sensores.

Tenemos otros tutoriales de MicroPython que también te pueden gustar:

  • MicroPython: ESP32/ESP8266 con DHT11/DHT22
  • MicroPython: ESP32/ESP8266 con servidor web DHT11/DHT22
  • MicroPython: LED RGB direccionables WS2812B con ESP32 y ESP8266

Si desea obtener más información sobre la programación de las placas ESP32 y ESP8266 con MicroPython, consulte nuestro libro electrónico: Programación MicroPython con ESP32 y ESP8266.

Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

MicroPython: pantalla OLED con ESP32 y ESP8266

En esta guía, aprenderás cómo usar la pantalla OLED SSD1306 de 0.96 pulgadas con un ESP32 o ESP8266 utilizando el firmware de MicroPython. Como ejemplo, te mostraremos cómo mostrar un simple mensaje de ‘¡Hola, Mundo!’. Posteriormente, también te mostraremos cómo utilizar otras funciones útiles para interactuar con la pantalla OLED.

Preguntas Frecuentes

  1. ¿Qué se necesita para seguir este tutorial?
  2. Para seguir este tutorial, necesitas tener instalado el firmware de MicroPython en tus placas ESP32 o ESP8266. También necesitas un IDE para escribir y cargar el código en tu placa. Te sugerimos usar Thonny IDE o uPyCraft IDE.

  3. ¿Qué es la comunicación I2C?
  4. La comunicación I2C es un protocolo de comunicación serial que se utiliza para la comunicación entre dispositivos. En el caso de la pantalla OLED, se utilizan conexiones específicas para garantizar una comunicación correcta entre la placa ESP y la pantalla.

  5. ¿Qué funciones ofrece la biblioteca SSD1306 OLED?
  6. La biblioteca SSD1306 OLED proporciona funciones para escribir en la pantalla OLED, como mostrar texto, dibujar píxeles, llenar la pantalla con un color específico, invertir los colores y mostrar datos provenientes de sensores.

  7. ¿Cómo se carga la biblioteca OLED en la placa?
  8. Para cargar la biblioteca OLED en la placa, puedes utilizar uPyCraft IDE o Thonny IDE. Sigue los pasos indicados en la guía para llevar a cabo la carga de la biblioteca en tu placa.

  9. ¿Qué otras funcionalidades puedo utilizar con la pantalla OLED?
  10. Además de mostrar texto en la pantalla OLED, puedes llenar la pantalla con un color específico, dibujar píxeles, invertir los colores y mostrar datos provenientes de sensores. Estas funcionalidades te permiten personalizar la visualización en la pantalla OLED según tus necesidades.

Si deseas más información sobre MicroPython, asegúrate de consultar nuestro eBook: Programación de MicroPython con ESP32 y ESP8266.

5 comentarios en «MicroPython: pantalla OLED con ESP32 y ESP8266»

Deja un comentario