Programación de Pantalla OLED 2.42″ (SSD1309) por I2C con Arduino UNO

Por: Julio Cesar Sandria Reynoso
Instituto de Robótica de Xalapa
11 de noviembre de 2026

Las pantallas OLED gráficas de 2.42 pulgadas basadas en el controlador SSD1309 (resolución de 128×64 píxeles) ofrecen un excelente contraste y ángulo de visión para proyectos de electrónica embebida. Sin embargo, las versiones de 7 pines suelen generar confusión al utilizarse bajo el protocolo I2C (IIC), ya que conservan la nomenclatura del bus SPI en su serigrafía.

Esta guía detalla el diagrama de conexión exacto para Arduino UNO y proporciona el código base utilizando la librería U8g2.


1. Especificaciones del Módulo

  • Controlador: SSD1309
  • Resolución: 128 × 64 píxeles (monocromática)
  • Tamaño diagonal: 2.42 pulgadas
  • Interfaz: I2C (configuración mediante resistencias puente R9, R10, R11 y R12)
  • Dirección I2C: 0x3C (con pin DC a GND) o 0x3D (con pin DC a VCC)
  • Voltaje de operación: 3.3V a 5V (verificar presencia de regulador LDO en la placa)

2. Requisito de Hardware (Configuración I2C)

Para que el módulo opere en modo I2C, la placa debe contar con las siguientes modificaciones físicas en la parte posterior del PCB (generalmente ya realizadas en las versiones marcadas como IIC):

  1. R8: Debe estar abierta (sin resistencia).
  2. R9, R10, R11 y R12: Deben estar puenteadas (con resistencias de 0 Ω o punto de soldadura).

3. Diagrama de Conexión (Pinout)

En el modo I2C, los pines de control tradicionales de SPI (DC y CS) cumplen funciones de direccionamiento y habilitación, por lo que no deben dejarse desconectados.

Pin en Pantalla OLEDPin en Arduino UNODescripción Técnica
VSSGNDTierra común del circuito (0V).
VDD3.3V (o 5V)Alimentación positiva. Se recomienda 3.3V si no se confirma regulador integrado.
SCLKA5 (o pin SCL)Señal de reloj serial (Clock) del bus I2C.
SDAA4 (o pin SDA)Línea de datos bidireccional (Data) del bus I2C.
RESPin Digital 4Reinicio por hardware (Reset). Indispensable para inicializar el controlador SSD1309.
DCGNDSelección de dirección esclavo I2C. Conectado a GND fija la dirección 0x3C.
CSGNDSelección de chip (Chip Select). Debe mantenerse en nivel bajo (GND) para habilitar el bus.

Nota sobre Arduino UNO: Los pines analógicos A4 y A5 están conectados eléctricamente a los pines dedicados SDA y SCL situados junto al pin AREF. Puedes utilizar cualquiera de ambos pares indistintamente.


4. Instalación de Librerías

Para gestionar el controlador SSD1309 de forma estable, utilizaremos la librería U8g2 de Oliver Kraus:

  1. Abre el IDE de Arduino.
  2. Dirígete a Programa > Incluir Librería > Administrar Bibliotecas… (o presiona Ctrl + Shift + I).
  3. En el buscador, escribe U8g2.
  4. Localiza la librería «U8g2 by oliver» y haz clic en Instalar.

5. Código de Ejemplo en Arduino

El siguiente código inicializa la pantalla utilizando I2C por hardware y renderiza un mensaje de prueba en pantalla, similar al de la imagen de portada de este artículo.

/*
  Instituto de Robótica de Xalapa - 11-noviembre-2026
  Programa: OLED-2.42-I2C-Hola_iRoX.ino (C++)
  Autor: Julio César Sandria Reynoso
  Colaborador: Google Gemini
  Hardware:
  + Pantalla OLED 2.42" Ver. 4.2 IIC controlador SSD1309
  + Arduino UNO
*/

#include <U8g2lib.h>

// Constructor para SSD1309 128x64 por I2C por hardware.
// El último parámetro (4) es el pin de RESET. 
// Si conectaste RES a 3.3V, cámbialo a U8X8_PIN_NONE.
U8G2_SSD1309_128X64_NONAME0_F_HW_I2C oled(U8G2_R0, /* reset=*/ 4);

void setup(void) {
  oled.begin();
}

void loop(void) {
  oled.clearBuffer();                  // Limpia la memoria interna
  oled.setFont(u8g2_font_ncenB10_tr);  // Selecciona una fuente legible
  oled.drawStr(10, 15, "Hola iRoX!");  // Escribe texto en (X, Y)

  // Cambia a una fuente secundaria más pequeña
  oled.setFont(u8g2_font_6x10_tr);
  oled.drawStr(10, 35, "OLED 2.42\" I2C"); 
  oled.drawStr(10, 55, "SSD1309 Listo!");
  oled.sendBuffer();                   // Envía el contenido a la pantalla
  delay(1000);
}

El siguiente código inicializa la pantalla utilizando I2C por hardware y renderiza un mensaje de prueba en pantalla con un marco alrededor.

/*
  Instituto de Robótica de Xalapa - 11-noviembre-2026
  Programa: OLED-2.42-I2C-Graphic.ino (C++)
  Autor: Julio César Sandria Reynoso
  Colaboradores: Google Gemini
  Hardware:
  + Pantalla OLED 2.42" Ver. 4.2 IIC controlador SSD1309
  + Arduino UNO
*/

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

// Constructor para pantalla OLED 2.42" SSD1309 (128x64) por I2C Hardware
// Pin de Reset conectado al Pin Digital 4
U8G2_SSD1309_128X64_NONAME0_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 4);

void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer(); // Limpia la memoria antes de dibujar

  // 1. Dibuja el doble marco exterior con esquinas 
  // ligeramente redondeadas (128x64 px)
  u8g2.drawRFrame(0, 0, 128, 64, 2);
  u8g2.drawRFrame(2, 2, 124, 60, 2);

  // 2. Selecciona una fuente de estilo técnico/monoespaciado 
  // similar a los LCD gráficos
  u8g2.setFont(u8g2_font_6x12_tr);

  // 3. Dibuja tres líneas de texto centradas horizontalmente
  // Nota: Cada carácter en la fuente 6x12 mide 6 píxeles de ancho.
  // Cálculo de centrado: (128 - (cantidad_letras * 6)) / 2
  
  // Línea 1: 17 caracteres -> (128 - 17 * 6) / 2 = 13
  u8g2.drawStr(13, 21, "OLED 2.42 SSD1309");
  
  // Línea 2: 17 caracteres -> (128 - 17 * 6) / 2 = 13
  u8g2.drawStr(13, 38, "128X64 MONOCHROME");
  
  // Línea 3: 11 caracteres -> (128 - 11 * 6) / 2 = 31
  u8g2.drawStr(31, 54, "GRAPHIC LCD");

  // 4. Envía el gráfico completo a la pantalla OLED
  u8g2.sendBuffer();
  
  delay(1000);
}


6. Resolución de Problemas Frecuentes

  • La pantalla permanece completamente negra:
    Verifica que el pin RES esté conectado al pin digital definido en el código (Pin 4) y que CS y DC estén firmemente conectados a GND. Si el problema persiste, ejecuta un I2C Scanner para confirmar que el microcontrolador detecta el dispositivo en la dirección 0x3C.
  • Los píxeles se muestran desplazados o cortados en los bordes:
    Existen dos variantes de mapeo de memoria en los paneles SSD1309 genéricos. Si la imagen aparece recorrida horizontalmente, sustituye NONAME0 por NONAME2 en la declaración del constructor:
    U8G2_SSD1309_128X64_NONAME2_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 4);
  • Inestabilidad o parpadeo al alimentar a 5V:
    Aunque muchos módulos incluyen un regulador de voltaje de 3.3V en la cara posterior (identificable como un componente SMD de 3 pines marcado como 662K), si tu módulo carece de él, aliméntalo estrictamente desde el pin 3.3V del Arduino UNO para evitar daños en el controlador.