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.

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.

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óncolor
: (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 horizontaldy
: 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)