Mira, otra cosa que descubrimos con el forero del problema que mencioné inicialmente es que OLED tiene un alto consumo de tiempo. Eso puede dificultar la tarea I2C pero nada mas.
Lo mas adecuado es refrezcar la pantalla OLED a intervalos de digamos 1000 mseg y mientras hacer las demas cosas sin interferir uno con otro.
#include <SPI.h> // incluye libreria interfaz SPI (micro SD)
#include <SD.h> // incluye libreria para tarjetas SD
#include <OneWire.h>
#include <DallasTemperature.h> // librerias para sensor DS18B20
#include <Wire.h> // incluye libreria para interfaz I2C
#include <RTClib.h> // libreria para manejo de modulo RTC
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> // libreria para controlador SSD1306
#define ANCHO 128 // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64 // reemplaza ocurrencia de ALTO por 64
#define OLED_RESET 4 // necesario por la libreria pero no usado
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET); // crea objeto oled*/
#define DATO 44 // pin 3 entrada de datos
#define SSpin 53 // Slave Select en pin digital
float Temp1, Temp2, TimeSTAR, TimeEND; // variables globales
byte pinDOS = 22, LED = 24, valor = 0; // pin 2 entrada
RTC_DS3231 rtc; // crea objeto rtc tipo RTC_DS3231
File archivo; // objeto archivo del tipo Archivo
OneWire oneWire(DATO);
DallasTemperature sensors (&oneWire); // declara variable/objeto para sensor
DeviceAddress Sensor1 = {0x28, 0x5A, 0xA9, 0x79, 0x97, 0x14, 0x03, 0x63};
DeviceAddress Sensor2 = {0x28, 0x97, 0x46, 0x95, 0xF0, 0x01, 0x3C, 0x6B};
void setup() {
Serial.begin (9600); // inicializa monitor serie a 9600 bps
Wire.begin(); // inicializa bus I2C
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa pantalla con dirección 0x3C (bus I2C)
pinMode(pinDOS, INPUT); // pin 22 entrada
pinMode(LED, OUTPUT);
Serial.println ("Inicializando tarjeta ..."); // texto en ventana de monitor
if (! SD.begin (SSpin)) { // inicialización de la tarjeta SD
Serial.println ("fallo en inicializacion!"); // si falla se muestra texto correspondiente y
return; // se sale del setup () para finalizar el programa
}
Serial.println ("inicializacion correcta"); // texto de inicializacion correcta*/
sensors.setResolution(Sensor1, 11); // sensor1 a resolución de 9 bits
sensors.setResolution(Sensor2, 11); // sensor2 a resolución de 9 bits
}
void loop () {
char buffer[30], sTemp1[7], sTemp2[7];
if (digitalRead(pinDOS) == LOW) { // entra al if si presiona pin 2
delay(100);
TimeSTAR = millis();
while (digitalRead(pinDOS) == LOW) { // pregunta si continua resionado pin 2
TimeEND = millis(); //
if ((TimeEND - TimeSTAR) >= 5000) { // pregunta si pasaron 5 seg..
valor = 0;
TimeEND = 0;
}
else {
valor = 1; // se pone valor = 1 para pasar a case 1
}
}
}
LecturaTemp(); // llama funcion para lectura de T°
switch (valor) { // switch para elegir el modo de trabajo
case 0:
digitalWrite(LED, HIGH);
EscrituraSerial(); // llama a la funcion para escribir en pantalla
EscribeTempOLED(); // llama funcion para lectura de T°
TimeSTAR = millis();
digitalWrite(LED, LOW);
break;
case 1:
TimeEND = millis();
digitalWrite(LED, HIGH);
if (TimeEND - TimeSTAR >= 10000) { // entra al if si pasó 10 seg.
digitalWrite(LED, LOW);
archivo = SD.open ("datos1.txt", FILE_WRITE); // apertura para read/write de archivo datos.txt
if (archivo) {
DateTime fecha = rtc.now(); // fecha es tipo dateTime
dtostrf(Temp1, 6, 2, sTemp1);
dtostrf(Temp2, 6, 2, sTemp2);
sprintf(buffer, "%02d/%02d/%02d %02d:%02d:%02d, %s, %s", fecha.year(), fecha.month(), fecha.day(), fecha.hour(),
fecha, minute(), fecha.second(), sTemp1, sTemp2);
archivo.print(buffer);
archivo.close (); // cierre de archivo*/
Serial.println ("escritura correcta"); // escritura correcta en SD
}
else {
Serial.println ("error en apertura de datos.txt"); // falla en apertura de archivo
}
EscribeTempOLED(); // llama funcion para lectura de T°
EscrituraSerial();
TimeSTAR = millis();
}
break;
}
}
// Función para tomar lectura de T°
void EscribeTempOLED() {
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(0, 0); // ubica cursor en inicio de coordenadas 0,0
oled.setTextSize(1); // establece tamaño de texto en 1
oled.print("Temperaturas : "); // escribe en pantalla el text
oled.setCursor(10, 17); //
oled.setTextSize(2);
oled.print("T1: ");
oled.print(Temp1, 1);
oled.setCursor(10, 40);
oled.setTextSize(2);
oled.print("T2: ");
oled.print(Temp2, 1);
oled.display();
}
// Función para tomar lectura de T°
void LecturaTemp() {
sensors.requestTemperatures(); // envia comandos para tomar lectura
Temp1 = sensors.getTempC(Sensor1); // toma lectura del sensor 1
Temp2 = sensors.getTempC(Sensor2); // toma lectura del sensor 2
}
// Función para esribir en el puerto serial
void EscrituraSerial() {
Serial.print(Temp1, 1);
Serial.print(" , ");
Serial.println(Temp2, 1);
}