Hola! Encontré la solución para poder utilizar cualquier pin de un Arduino como bus I2C para utilizar el Oled.
Lo primero que hay que saber es que Adafruit fabrica sus OLED con una dirección I2C diferente para cada tamaño:
OLED 128x64 ---> 0x3D
OLED 128x32 ---> 0x3C
Sin embargo, si se compran uno genérico, ambos tamaños disponibles utilizan la misma dirección: 0x3C, así que en la línea:
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
debe cambiarse por:
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Luego en la función setup hay que añadir la siguiente línea:
void setup(){
Serial.begin(115200);
Wire.begin(D3,D4); // para utilizar, por ejemplo el pin D3 como SDA y el D4 como SCL
}
Si no funciona aún con todo eso, descarguen la librería para mapear pines (I2C_Force_SW). Tenemos librerías como SoftwareWire.h o BitBang_I2C.h.
Ahora bien, si no logran hacer funcionar un arduino cualquiera con todo lo anterior, consideren el uso de una librería que tiene todo y es muy simple de utilizar: OLED_I2C, desarrollada por Rinky-Dink Electronics. Es la que estoy utilizando ahora ya que posee una documentación muy detallada.
Les dejo a continuación esa librería y el manual para que descarguen ambas cosas. OLED_I2C.zip (514,3 KB) OLED_I2C.pdf (119,3 KB)
Se pueden mapear los pines para forzar al software a que trabaje con otros. Creo que se conoce como "bitbanging". Si no quieren renegar nunca más, les aconsejo que consideren utilizar la librería ss-oled. Otra opción es obligar a Wire.h a que tome otros pines, mediante una librería alternativa, como "SoftI2C".