Problemas con I2C modulo OLED SH1106 y MLX90614

Retomo este hilo estoy experimentando este problema con un Arduino Wemos D1 R1 wifi, un OLED SH1106 y un modulo MLX90614.

Separados funcionan bien. Pero cuando trato de hacer funcionar el oled junto al sensor MLX el MLX comienza a enviar 1023°C midiendo SDA con el osciloscopio no veo otra cosa que una señal continua de 3,3V

He encontrado que esto ocurre al inicializar el display ya que cuando comento la línea display.init (ver código adjunto) los datos del sensor me llegan correctamente pero el OLED deja de funcionar. y en el output veo (imagen de abajo del todo)

#include <OLEDDisplayUi.h>

#include <SH1106.h>

#include <Wire.h>

#include <IR_Thermometer_Sensor_MLX90614.h> //https://github.com/DFRobot/IR-Thermometer-Sensor-MLX90614/tree/master/Arduino%20Library/IR_Thermometer_Sensor_MLX90614

//#include <SH1106Wire.h> // legacy include: `#include "SSD1306.h"`

IR_Thermometer_Sensor_MLX90614 MLX90614 = IR_Thermometer_Sensor_MLX90614();

double Tconsigna=35.0;

double aux=0;

int i;

const int buzzer=2;

//Initialize the OLED display using Wire library

SH1106Wire  display(0x3c, D14, D15);

void setup(){

   Serial.begin(19200);

   MLX90614.begin(); 

   pinMode(LED_BUILTIN, OUTPUT);

   pinMode(buzzer, OUTPUT); 

   //Display Setup

   display.init();

   display.setI2cAutoInit(true);

   display.flipScreenVertically();

   display.setFont(ArialMT_Plain_24);

   display.setTextAlignment(TEXT_ALIGN_LEFT);

}

void loop(){

   //--Temperatura en grados centigrados--//

   Serial.print("Ambient = "); Serial.print(MLX90614.GetAmbientTemp_Celsius());    Serial.println(" *C");

   Serial.print("Object  = "); Serial.print(MLX90614.GetObjectTemp_Celsius());     Serial.println(" *C");

   //--Temperatura en grados centigrados--//

   //--Temperatura en grados Farenheit--//

   //Serial.print("Ambient = "); Serial.print(MLX90614.GetAmbientTemp_Fahrenheit()); Serial.println(" *F");

   //Serial.print("Object  = "); Serial.print(MLX90614.GetObjectTemp_Fahrenheit());  Serial.println(" *F");

   //--Temperatura en grados Farenheit--//

   aux=MLX90614.GetObjectTemp_Celsius();

    //--Buzzer--// 

    /*

    if(aux>Tconsigna)

    {

      digitalWrite(LED_BUILTIN, HIGH);

      delay(1000);

      for (i=0; i<400; i++) // When a frequency sound

      {

      digitalWrite(buzzer, HIGH) ; //send tone

      delay (1) ;

      digitalWrite(buzzer, LOW) ; //no tone

      delay (1) ;

      }

      digitalWrite(LED_BUILTIN, LOW);

    }

    else

    {digitalWrite(LED_BUILTIN, LOW);}*/

     //--Buzzer--// 

    Serial.print(Tconsigna);Serial.print("__");Serial.print(aux);

    Serial.println();

     //--Buzzer--// 

    //--Temperatura

    //--Display Data--//

  display.clear();

  display.drawString(20, 16, String(aux)+"°C"); //+ String(millis()));

  display.display();

  delay(3000);

    //--Display Data--//

}

La libreria para el OLED que estoy utilizando es esp8266-oled-sh1106/SH1106.h at master · rene-mt/esp8266-oled-sh1106 · GitHub

Comentando display.init()

Alguien me podrá ayudar?

un punto donde tengo dudas es si estos comandos estan bien definidos para el SH1106 ya que cuando el display esta solo en el bus I2C funciona correctamente pero con otro dispositivo no.

// Display commands
#define CHARGEPUMP 0x8D
#define COLUMNADDR 0x21
#define COMSCANDEC 0xC8
#define COMSCANINC 0xC0
#define DISPLAYALLON 0xA5
#define DISPLAYALLON_RESUME 0xA4
#define DISPLAYOFF 0xAE
#define DISPLAYON 0xAF
#define EXTERNALVCC 0x1
#define INVERTDISPLAY 0xA7
#define MEMORYMODE 0x20
#define NORMALDISPLAY 0xA6
#define PAGEADDR 0x22
#define SEGREMAP 0xA0
#define SETCOMPINS 0xDA
#define SETCONTRAST 0x81
#define SETDISPLAYCLOCKDIV 0xD5
#define SETDISPLAYOFFSET 0xD3
#define SETHIGHCOLUMN 0x10
#define SETLOWCOLUMN 0x00
#define SETMULTIPLEX 0xA8
#define SETPRECHARGE 0xD9
#define SETSEGMENTREMAP 0xA1
#define SETSTARTLINE 0x40
#define SETVCOMDETECT 0xDB
#define SWITCHCAPVCC 0x2

Moderador:
He tenido que cerrar el hilo que ya tenia dos faltas incluída esta tuya. No se reviven hilos para luego hacer consultas que tengan que ver con un problema propio como en tu caso aunque sea similar. El único que puede hacerlo es el autor del hilo, que no eres tu.
Te invito a que leas debidamente las normas del foro y quedas advertido por la falta cometida.
Por todo lo demas has posteado bien pero pudiste crear un hilo propio como hice yo ahora con tu consulta y poner la referencia al hilo en cuestión. Esta es la manera correcta.

Luego analizo tu problema y edito este post.

He continuado trabajando y he encontrado que solo si reseteo el display.
Agregando las lineas
display.end();
display.tesetdisplay();
luego puedo volver a leer el valor de temperatura correctamente. El problema que esto lo debo hacer cada vez que imprimo en pantalla. Adjunto código. Es como si el display no liberara el bus I2C. Vuelvo a aclarar que estoy utilizando esta libreria GitHub - ThingPulse/esp8266-oled-ssd1306: Driver for the SSD1306 and SH1106 based 128x64, 128x32, 64x48 pixel OLED display running on ESP8266/ESP32

#include <OLEDDisplayUi.h>
#include <SH1106.h>
#include <Wire.h>
#include <IR_Thermometer_Sensor_MLX90614.h> //https://github.com/DFRobot/IR-Thermometer-Sensor-MLX90614/tree/master/Arduino%20Library/IR_Thermometer_Sensor_MLX90614
#include <SH1106Wire.h> // legacy include: `#include "SSD1306.h"`


IR_Thermometer_Sensor_MLX90614 MLX90614 = IR_Thermometer_Sensor_MLX90614();
double aux=0;
//Initialize the OLED display using Wire library
SH1106Wire  display(0x3c, D14, D15, GEOMETRY_128_64,I2C_ONE,400000);


void setup(){
    Serial.begin(19200);
    display.flipScreenVertically();
    display.setFont(ArialMT_Plain_24);
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    //Intitialize sensor
    MLX90614.begin(); 
}

void loop(){
   //--Temperatura en grados centigrados--//
   Serial.print("Ambient = "); Serial.print(MLX90614.GetAmbientTemp_Celsius());    Serial.println(" *C");
   Serial.print("Object  = "); Serial.print(MLX90614.GetObjectTemp_Celsius());     Serial.println(" *C");
   aux=MLX90614.GetObjectTemp_Celsius();
   Serial.println();

    //--Temperatura
    //--Display Data--//
  display.init();  
  display.clear();
  display.drawString(16, 16, String(aux)+"°C"); //+ String(millis()));
  display.display();
  delay(1000);
  display.end();
  display.resetDisplay();
    //--Display Data--//
}

Ya lo solucione. Hay que leer las hojas de datos!
como dijo Napoleón “Visteme despacio que estoy apurado”

Y cual fue la solución?

SH1106Wire display(0x3c, D14, D15, GEOMETRY_128_64,I2C_ONE,400000);

cambiar la frec. del bus de 400khz a 100khz que es la máxima permitida de funcionamiento del sensor.

Saludos.