Mostrar gráficos con oled y rpi pico


Aprende a mostrar textos y figuras geométricas en la Raspberry PI Pico y el Display OLED con micropython

oscar Escrito por oscar 13 July 2025 11 0

Aprende a mostrar textos y figuras geométricas en la Raspberry PI Pico y el Display OLED, en este post vamos a explicar como hacer la conexion de estos componentes, como instalar y configurar la librería SSD1306 y daremos ejemplos para dibujar las figuras geométricas.

Prerequisitos

Configurar entorno de trabajo

Para trabajar con la Raspberry PI Pico debemos tener el entorno de trabajo instalado y configurado, ademas del Firmware, esto lo explico a detalle en el post instalar entorno de trabajo.

Conectar raspberry pi pico a oled por i2c

E creado el post cómo conectar raspberry pi pico a oled donde realizo la explicación a detalle de como conectar la pantalla OLED.

Circuito raspberry pi pico a oled por i2c
Circuito raspberry pi pico a oled por i2c

Instalar librería manualmente

Para realizar esta instalación ingresamos a los siguientes enlaces en donde vamos a obtener el código para la ssd1306.py

Luego en thonny creamos un archivo nuevo llamado ssd1306.py y lo guardamos en la rpi pico, por ultimo del repositorio de código de la librería, copiamos y pegamos todo el contenido.

Librería ssd1306
Librería ssd1306

Código de ejemplo

from machine import Pin, I2C
import ssd1306

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)

ancho = 128
alto = 64

oled = ssd1306.SSD1306_I2C(ancho, alto, i2c)

oled.fill(0)
oled.text("Hola, mundo!", 0, 0)

oled.show()

Dibujar gráficos

A continuación, explicamos las distintas funciones que tiene la librería SSD1306 para dibujar figuras geométricas:

oled.fill(color)

🧾 Llena toda la pantalla con un color.

  • color = 0 → negro (apagado)
  • color = 1 → blanco (encendido)

📌 Ejemplo:

oled.fill(0) # Apaga toda la pantalla 
oled.fill(1) # Enciende toda la pantalla (pantalla blanca)

oled.pixel(x, y, color)

🧾 Dibuja un solo píxel en la posición (x, y).

  • x: columna (0 a 127)
  • y: fila (0 a 63)
  • color: 0 (borrar) o 1 (dibujar)

📌 Ejemplo:

oled.pixel(10, 10, 1) # Dibuja un punto en (10,10)

oled.hline(x, y, width, color)

🧾 Dibuja una línea horizontal.

📌 Ejemplo:

oled.hline(0, 20, 100, 1) # Línea horizontal desde (0,20) de 100 píxeles

oled.vline(x, y, height, color)

🧾 Dibuja una línea vertical.

📌 Ejemplo:

oled.vline(50, 0, 64, 1) # Línea vertical desde (50,0) hasta (50,63)

oled.line(x1, y1, x2, y2, color)

🧾 Dibuja una línea diagonal o cualquier línea entre dos puntos.

📌 Ejemplo:

oled.line(0, 0, 127, 63, 1) # Línea diagonal de esquina a esquina

oled.rect(x, y, width, height, color)

🧾 Dibuja un rectángulo vacío.

📌 Ejemplo:

oled.rect(10, 10, 50, 30, 1) # Rectángulo desde (10,10) de 50x30 píxeles

oled.fill_rect(x, y, width, height, color)

🧾 Dibuja un rectángulo relleno.

📌 Ejemplo:

oled.fill_rect(70, 20, 40, 20, 1)

oled.text(string, x, y, color=1)

🧾 Muestra texto en la pantalla.

  • string: texto a mostrar
  • (x, y): posición
  • color: (opcional) 1 para blanco, 0 para negro

📌 Ejemplo:

oled.text("Hola!", 0, 0)

Cada carácter mide 8 píxeles de ancho y 8 de alto.

oled.scroll(dx, dy)

🧾 Desplaza el contenido de la pantalla.

  • dx: desplazamiento horizontal
  • dy: desplazamiento vertical

📌 Ejemplo:

oled.scroll(5, 0) # Desplaza 5 píxeles a la derecha

Este método desplaza el contenido ya dibujado, no mueve automáticamente el texto que agregues después.

oled.show()

🧾 Actualiza la pantalla. Debes llamar a este método después de dibujar o escribir para que los cambios se vean.

📌 Ejemplo:

oled.fill(0)
oled.text("Hola", 0, 0)
oled.show()

oled.invert(True) (si está disponible)

🧾 Invierte los colores de la pantalla (requiere que tu versión del controlador lo soporte).

📌 Ejemplo:

oled.invert(True)

Si no funciona, es que tu versión de ssd1306.py no lo tiene implementado.

Ejemplo completo

from machine import Pin, I2C
import ssd1306
import time

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)

ancho = 128
alto = 64

oled = ssd1306.SSD1306_I2C(ancho, alto, i2c)


def dibujar_circulo(oled, x0, y0, radio, color=1):
    x = radio
    y = 0
    d = 1 - radio

    while x >= y:
        oled.pixel(x0 + x, y0 + y, color)
        oled.pixel(x0 + y, y0 + x, color)
        oled.pixel(x0 - y, y0 + x, color)
        oled.pixel(x0 - x, y0 + y, color)
        oled.pixel(x0 - x, y0 - y, color)
        oled.pixel(x0 - y, y0 - x, color)
        oled.pixel(x0 + y, y0 - x, color)
        oled.pixel(x0 + x, y0 - y, color)
        y += 1
        if d <= 0:
            d += 2 * y + 1
        else:
            x -= 1
            d += 2 * (y - x) + 1

while True:

    oled.fill(0)
    oled.text("Texto", 44, 31)
    oled.show()
    time.sleep(2)
    
    oled.fill(0)
    oled.text("Pixel", 44, 0)
    oled.pixel(64, 32, 1)
    oled.show()
    time.sleep(2)


    oled.fill(0)
    oled.text("hline", 44, 0)
    oled.hline(0, 32, 128, 1)
    oled.show()
    time.sleep(2)


    oled.fill(0)
    oled.text("vline", 44, 0)
    oled.vline(64, 10, 54, 1)
    oled.show()
    time.sleep(2)

    oled.fill(0)
    oled.text("line", 44, 0)
    oled.line(0, 0, 127, 63, 1)
    oled.show()
    time.sleep(2)

    oled.fill(0)
    oled.text("rect", 44, 0)
    oled.rect(10, 10, 117, 53, 1)
    oled.show()
    time.sleep(2)

    oled.fill(0)
    oled.text("circle", 44, 0)
    dibujar_circulo(oled, 64, 32, 25)
    oled.show()
    time.sleep(2)

Comentario

Debe aceptar antes de enviar