CONECTAR 2 DISPLAYS OLED SSD1306 A UN ARDUINO NANO
Alfredo Segura, México. Octubre de 2025.


El experimento fue largo y falto de información por parte de la comunidad y del propio foro de Arduino. Se trata de conectar 2 displays OLED SSD1306 (128x64) a un Arduino mediante el bus I2C, para lo cual procedí a cambiar de lugar en uno de ellos, el resistor que define la ADDRESS del mismo dispositivo, de tal manera que pueda ser detectado y utilizado por el I2C del Nano.

Esta nueva ADDRESS será la 0x3D que, de acuerdo con el datasheet del SSD1306, corresponde a la línea D/C (Data / Control) del chip interno del OLED, como se muestra en las siguientes imágenes:

Con estos arreglos, tenemos un OLED con la ADDRESS 0x3C original y otro con la 0x3D, listos para que el Arduino Nano los reconozca.

En el IDE de Arduino existe en el menú Archivo -> Ejemplos -> Wire -> Wire Scan que es un código que nos permite, previamente grabado en el Arduino Nano, observar los dispositivos I2C conectados. Así que ponemos ambos displays OLED (uno de ellos ya modificado) y efectivamente observamos en el Monitor Serial a 9600 bps, que aparecen las direcciones 0x3C y 0x3D.

Procedemos a teclear nuestro código para que el Arduino Nano nos controle ambos displays, mostrando en cada uno de ellos mensajes diferentes:

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

. . .

// Damos nombres diferentes a las instancias de Adafruit_SSD1306:

Adafruit_SSD1306 oleddisplay(ancho, alto, &Wire, -1);

Adafruit_SSD1306 displayoled(ancho, alto, &Wire, -1);

// En el setup, iniciamos Wire y verificamos que sean detectados ambos display:

Void setup() {

. . .

if (!oleddisplay.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C

Serial.println("No está respondiendo el OLED 0x3C...");

for(;;);

}

Serial.println("Respondiendo correctamente el OLED 0x3C...");

if (!displayoled.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // 0x3D

Serial.println("No está respondiendo el OLED 0x3D...");

for(;;);

}

Serial.println("Respondiendo correctamente el OLED 0x3D...");

. . .


Y es precisamente aquí , que al tratar de detectar el OLED SSD1306 con ADDRESS 0x3D, se queda colgado el programa y en el Monitor Serial aparece la leyenda: “No está respondiendo el OLED 0x3D...”

Por supuesto podemos buscar la causa de este problema, sobre el cual yo analicé los archivos Adafruit_GFX.h y Adafruit_GFX.cpp y no encontré algo obvio sobre el mal funcionamiento.

Sin embargo, si al OLED modificado, se le devuelve el resistor a su posición original, para que vuelva a tener la ADDRESS 0x3C y se conectan ambos al Nano, los mensajes que se envían vía I2C, aparecen en los dos displays idénticos.

Buscando en Internet, alguien propuso usar un demultiplexor para lograr separar los comandos a un display y al otro, con los pines adicionales del Nano para controlar dicho demultiplexor. Lo planteó al foro de Arduino pero fue desanimado de hacerlo, y en su lugar se le sugirió usar otro circuito integrado que ya viene ex profeso para ese fin, el PCA9548.

Como había que conseguir dicho circuito integrado y yo tenía el CD4066B que consiste de 4 switches analógicos bidireccionales, me decidí hacer mi proyecto con este chip, del cual muestro su imagen:

Conectado este circuito integrado al Arduino Nano y a los displays OLED SSD1306, tenemos el diagrama final:

Finalmente el circuito completo montado en un protoboard, ha quedado funcional:

PROGRAMA ARDUINO



Alfredo Segura, México. Octubre de 2025.