Problema con varias pantallas OLED

Buenos días
Estoy desarrollando un proyecto con un par de pantallas OLED y me estoy encontrando con problemas.
En principio el programa lleva dos potenciometros que marcan un determinado valor que es el que muestra cada una de las pantallas OLED.

El problema que tengo es que cuando ejecuto este código me da error de SSD1306 allocation failed.
Con I2C Scanner he comprobado que cada pantalla tiene una dirección distinta, de hecho, si separo el programa en dos y ejecuto uno para un potenciometro y pantalla OLED con dirección 0x3D funciona correctamente, igual que si lo ejecuto para la otra, pero junto no funciona.

Me podeis ayudar para ver que podría estar sucediendo?


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

// Which pin on the Arduino is connected to the NeoPixels?
#define PIN        6 // On Trinket or Gemma, suggest changing this to 1

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 144 // Popular NeoPixel ring size

// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define DELAYVAL 10 // Time (in milliseconds) to pause between pixels



#define SCREEN_WIDTH 128 // OLED display1 width, in pixels
#define SCREEN_HEIGHT 64 // OLED display1 height, in pixels

// Declaration for an SSD1306 display1 connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library. 
// On an arduino UNO:       A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO:   2(SDA),  3(SCL), ...
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
//#define SCREEN_ADDRESS1 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
//#define SCREEN_ADDRESS2 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//Adafruit_SSD1306 display1(OLED_RESET);
//Adafruit_SSD1306 display2(OLED_RESET);

#define NUMFLAKES     10 // Number of snowflakes in the animation example

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
static const unsigned char PROGMEM logo_bmp[] =
{ 0b00000000, 0b11000000,
  0b00000001, 0b11000000,
  0b00000001, 0b11000000,
  0b00000011, 0b11100000,
  0b11110011, 0b11100000,
  0b11111110, 0b11111000,
  0b01111110, 0b11111111,
  0b00110011, 0b10011111,
  0b00011111, 0b11111100,
  0b00001101, 0b01110000,
  0b00011011, 0b10100000,
  0b00111111, 0b11100000,
  0b00111111, 0b11110000,
  0b01111100, 0b11110000,
  0b01110000, 0b01110000,
  0b00000000, 0b00110000 };

const int potenciometro1=A2;        //El potenciómetro1 está conectado al pin ANALÓGICO 2.
const int potenciometro2=A3;        //El potenciómetro2 está conectado al pin ANALÓGICO 3.
const byte lockPin=4;
const int temp1=-13;        
const int temp2=-36;        


int convert1=0;                      //Variable que contendrá el valor leído, convertido con función map() [rango de 0 a 9]
int convert2=0;                      //Variable que contendrá el valor leído, convertido con función map() [rango de 0 a 9]
int convert_anterior=0;             //Variable que almacena el número correspondiente a la anterior conversión.
int leer1=0;
int leer2=0;

void(* Resetea) (void) = 0;

void setup() {
  Serial.begin(9600);

  pinMode(potenciometro1,INPUT);
  pinMode(potenciometro2,INPUT);
  pinMode(lockPin, OUTPUT);          // Pone el lockPin como salida
  digitalWrite(lockPin, HIGH);

  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
  pixels.clear(); // Set all pixel colors to 'off'
  for(int i=0; i<NUMPIXELS; i++) { // For each pixel...
    pixels.setPixelColor(i, pixels.Color(255, 0, 0));
    //pixels.show();   // Send the updated pixel colors to the hardware.
    //delay(DELAYVAL); // Pause before next pass through loop
  }
  pixels.show();   // Send the updated pixel colors to the hardware.
  
  // SSD1306_SWITCHCAPVCC = generate display1 voltage from 3.3V internally
  if(!display1.begin(SSD1306_SWITCHCAPVCC, 0x3D)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  if(!display2.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
      Serial.println(F("SSD1306 allocation failed"));
      for(;;); // Don't proceed, loop forever
  }
  
  
  display1.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  display1.display();
  delay(2000); // Pause for 2 seconds
  display1.clearDisplay();
  
  
  display2.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display2.display();
  delay(2000); // Pause for 2 seconds
  display2.clearDisplay();
  
  
  // Show initial display1 buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  
  

  // Clear the buffer
  
 
}

void loop() {

  // Leo potenciometro de la camara frigorifica 1 y su valor lo convierto y guardo en convert1
  leer1=analogRead(potenciometro1);
  convert1=map(leer1, 0 , 1023 , 0 , -50);
  
  display1.clearDisplay();

  display1.setTextSize(6);             // Normal 1:1 pixel scale
  display1.setTextColor(SSD1306_WHITE);        // Draw white text
  display1.setCursor(0,10);             // Start at top-left corner
  display1.println(convert1);

  display1.display();
  delay(500);

  // Leo potenciometro de la camara frigorifica 2 y su valor lo convierto y guardo en convert2
  leer2=analogRead(potenciometro2);
  convert2=map(leer2, 0 , 1023 , 0 , -50);
  
  display2.clearDisplay();

  display2.setTextSize(6);             // Normal 1:1 pixel scale
  display2.setTextColor(SSD1306_WHITE);        // Draw white text
  display2.setCursor(0,10);             // Start at top-left corner
  display2.println(convert2);

  display2.display();
  delay(500);

  verificarTemp();
}

void verificarTemp()
{
  if ((convert1 == temp1) && (convert2==temp2))
  {
    Serial.println("Temperatura alcanzada");
    pixels.clear(); // Set all pixel colors to 'off'
    for(int i=0; i<NUMPIXELS; i++) 
    { // For each pixel...
      pixels.setPixelColor(i, pixels.Color(0, 0, 255));
      //pixels.show();   // Send the updated pixel colors to the hardware.
      //delay(DELAYVAL); // Pause before next pass through loop
    } 
    pixels.show();   // Send the updated pixel colors to the hardware.
  } else {
     Serial.println("Temperatura erronea");
     pixels.clear(); // Set all pixel colors to 'off'
     for(int i=0; i<NUMPIXELS; i++) 
     { // For each pixel...
       pixels.setPixelColor(i, pixels.Color(255, 0, 0));
       //pixels.show();   // Send the updated pixel colors to the hardware.
       //delay(DELAYVAL); // Pause before next pass through loop
     } 
     pixels.show();   // Send the updated pixel colors to the hardware.
    }
}

void desbloquea()
{
  digitalWrite(lockPin, LOW);
  delay(50);
  digitalWrite(lockPin, HIGH);
  //delay de 3 minutos
  delay(300000);
}

Pero si pruebas cada pantalla y te responde con 0x3D entonces ambas pantallas tienen dirección 0x3D y por eso tienes la falla.
Por defecto todas las pantallas vienen con esa dirección y debes cambiarla por tu cuenta. Tendras jumpers o tal vez tendras que hacerlo con un puente.
Dejame ver y te respondo qué debes hacer.

EDITO: si, ya lo consulté. Está pensado para cambiarlo por hard o sea con un puente.
Un truco es este. Usar un pin del Arduino para elegir cual usas apuntando al CS o sea el pin del OLED que te permite cambiar la dirección.
De ese modo aparentarán las dos estar en el mismo lugar pero una estara en 0x3D y la otra en 0x3E cuando subas el pin CS a HIGH

image

Aca se ve si lo haces con el soldador para establecer el puente en una de las OLED, pero hay que confirmar como es tu PCB porque hay muchos y diferentes.
La idea con el CS es si lo tienes disponible, veo que no todos lo tienen.

Este por ejemplo si

image

Más allá de lo que te sugiere @Surbyte, le agregaría a cada mensaje "SSD1306 allocation failed" el número de pantalla, algo así
SSD1306 allocation failed #1
para identificar cuál es la que genera el error.

Por otro lado, ese error se genera cuando la librería no pudo asignar el buffer o el buffer generado no tiene el tamaño adecuado.

¿Qué arduino estás usando?

Al margen, los pines analógicos no hace falta definirlos como INPUT a menos que los uses en modo digital, que no es tu caso.

Prueba a hacer la modificación que te sugiero y comentanos cuál es la que no está inicializando así vemos cómo seguir.

Saludos

Gracias Surbyte, hice el puente y solucione el problema. Efectivamente todas las que compre tenían la misma direccion