Incompatibilidad _ i2C vs ISP ??

Hola,

Soy nuevo en esto y estoy un poco perdido.

Estoy montando un logger para medir temperaturas y por el momento he conectado en una placa arduino UNO R3 una pequeña pantalla OLED SSD1306 de 128X64 px y un RealTimeClock DS3231 ambos a través de i2c conectados a los pines A4 y A5. Ambos están funcionando correctamente. Muestra la hora el día y la temperatura ambiente de la sonda de temperatura que guarda el RTC. Hasta ahí todo perfecto.

El problema llega al introducir en el arduino una tarjeta de lectura de microSD que se comunica a través de ISP. En el momento que en el sketch intento crear el objeto tarjeta con

SdFat sd;

al subirlo al arduino el reloj y la pantalla se bloquean , quedando la imagen congelada.

He probado a cambiar de SS del lector de microSD a otros pines distintos al que viene por defecto (10) y obtengo el mismo resultado.

Por otro lado he testeado el funcionamiento del lector de microSD sin desconectar de la breadboard las otras tarjetas, cargando un sketch para testear el lector y funciona bien.

Y viveversa, es decir, manteniendo conectado el lector de microSD y cargando en el arduino el sketch que me muestra la hora y la fecha real en la pantalla OLED y también funcionan.

El problema viene cuando intento cargar en el sketch lo relativo al lector de tarjetas microSD.

A ver si podéis echarme un cable, estoy bloqueado. Gracias…

El sketch es el siguiente:

#include <Adafruit_GFX.h> // Include core graphics library for the display
#include <Adafruit_SSD1306.h> // Include Adafruit_SSD1306 library to drive the display
#include <Wire.h> // incluye libreria para interfaz I2C
#include <RTClib.h> // incluye libreria para el manejo del modulo RTC

RTC_DS3231 rtc; // crea objeto del tipo RTC_DS3231
Adafruit_SSD1306 display(128, 64); // Create objeto display

#include <Fonts/FreeMonoBold9pt7b.h> // Add a custom font

#include <SPI.h>
#include “SdFat.h”
#include “sdios.h”

const int8_t DISABLE_CHIP_SELECT = 5;
#define SPI_SPEED SD_SCK_MHZ(8)

SdFat sd; //<---- cuando intento crear el objeto sd la pantalla deja de responder.

void setup() {

pinMode ( 5, OUTPUT );

delay (100);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setRotation(0);
display.setTextWrap(false);
display.dim(0);

// if (! rtc.begin()) { // si falla la inicializacion del modulo
// Serial.println(“Modulo RTC no encontrado !”); // muestra mensaje de error
// while (1); // bucle infinito que detiene ejecucion del programa
//
// }

//rtc.adjust(DateTime( 2020, 5, 2, 19, 46,0)); // funcion que permite establecer fecha y horario
// al momento de la compilacion. Comentar esta linea
// y volver a subir para normal operacion
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:

//rtc.adjust(DateTime(DATE, TIME)); // funcion que permite establecer fecha y horario
// al momento de la compilacion. Comentar esta linea
// y volver a subir para normal operacion

}

void loop() {

DateTime fecha = rtc.now(); // funcion que devuelve fecha y horario en formato
// DateTime y asigna a variable fecha

display.clearDisplay();
display.cp437(true); // Use full 256 char ‘Code Page 437’ font
display.setFont(&FreeMonoBold9pt7b); // Set a custom font
display.setTextSize(0); // Set text size. We are using a custom font so you should always use the text size of 0

// Convert Variable1 into a string, so we can change the text alignment to the right:
// It can be also used to add or remove decimal numbers.
char hora[2]; // Create a character array of 10 characters
char minuto[2];
char segundo[2];
char dia[2];

display.setCursor(10, 60); // (x,y)
dtostrf(fecha.day(), 2, 0, dia );
if (fecha.day()<10 ){
display.print(" ");
display.print ( fecha.day());
}
else display.print(dia);

display.print(".");

display.print(fecha.month());

display.print(".");

display.print(fecha.year());

display.setFont(&FreeMonoBold9pt7b); // Set a custom font
display.setTextSize(0); // Set text size. We are using a custom font so you should always use the text size of 0
display.setCursor(20, 20); // (x,y)

dtostrf(fecha.hour(), 2, 0, hora );
if (fecha.hour()<10 ){
display.print(“0”);
display.print ( fecha.hour());
}
else display.print(hora);

display.print(":");

dtostrf(fecha.minute(), 2, 0, minuto);
if ( fecha.minute() < 10 ){
display.print(“0”);
display.print ( fecha.minute());
}
else display.print (minuto);

display.print(":");

dtostrf(fecha.second(), 2, 0, segundo); // (,,,)
if( fecha.second()<10 ){
display.print(‘0’);
display.print ( fecha.second());
}
else display.print(segundo);

// Muestra temperatura ambiente

display.setFont(&FreeMonoBold9pt7b); // Set a custom font
display.setTextSize(0); // Set text size. We are using a custom font so you should always use the text size of 0
display.setCursor(23, 40); // (x,y)
display.print(rtc.getTemperature());
display.print(" C");

display.display();

}

Moderador
Por favor edita tu post usando etiquetas de código.
Y tmb haz que la imagen adjunta sea visible usando la guía que esta al final de las normas.

Lee las Normas del foro

Hola,

Soy nuevo en esto y estoy un poco perdido.

Estoy montando un logger para medir temperaturas y por el momento he conectado en una placa arduino UNO R3 una pequeña pantalla OLED SSD1306 de 128X64 px y un RealTimeClock DS3231 ambos a través de i2c conectados a los pines A4 y A5. Ambos están funcionando correctamente. Muestra la hora el día y la temperatura ambiente de la sonda de temperatura que guarda el RTC. Hasta ahí todo perfecto.

El problema llega al introducir en el arduino una tarjeta de lectura de microSD que se comunica a través de ISP. En el momento que en el sketch intento crear el objeto tarjeta con

SdFat sd;

al subirlo al arduino el reloj y la pantalla se bloquean , quedando la imagen congelada.

He probado a cambiar de SS del lector de microSD a otros pines distintos al que viene por defecto (10) . Actualmente lo tengo en el pin 5.

Por otro lado he testeado el funcionamiento del lector de microSD sin desconectar de la breadboard las otras tarjetas, cargando un sketch para testear el lector y funciona bien.

Y viceversa, es decir, manteniendo conectado el lector de microSD y cargando en el arduino el sketch que me muestra la hora y la fecha real en la pantalla OLED y también funcionan.

El problema viene cuando intento cargar en el sketch lo relativo al lector de tarjetas microSD.

A ver si podéis echarme un cable, estoy bloqueado.

Gracias…

Ell sketch es el siguiente:

#include <Adafruit_GFX.h>  // Include core graphics library for the display
#include <Adafruit_SSD1306.h>  // Include Adafruit_SSD1306 library to drive the display
#include <Wire.h>   // incluye libreria para interfaz I2C
#include <RTClib.h>   // incluye libreria para el manejo del modulo RTC

RTC_DS3231 rtc;     // crea objeto del tipo RTC_DS3231
Adafruit_SSD1306 display(128, 64);  // Create objeto display

#include <Fonts/FreeMonoBold9pt7b.h>  // Add a custom font

#include <SPI.h>
#include "SdFat.h"
#include "sdios.h"

const int8_t DISABLE_CHIP_SELECT = 5;
#define SPI_SPEED SD_SCK_MHZ(8)


SdFat sd; //<---- cuando intento crear el objeto sd la pantalla deja de responder.




void setup() {
   
 pinMode ( 5, OUTPUT );
 
 delay (100);
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 display.clearDisplay();
 display.setTextColor(WHITE);
 display.setRotation(0);
 display.setTextWrap(false);
 display.dim(0);
 
//  if (! rtc.begin()) {       // si falla la inicializacion del modulo
//  Serial.println("Modulo RTC no encontrado !");  // muestra mensaje de error
//  while (1);         // bucle infinito que detiene ejecucion del programa
//
//  }

 //rtc.adjust(DateTime( 2020, 5, 2, 19, 46,0));  // funcion que permite establecer fecha y horario
 //  al momento de la compilacion. Comentar esta linea
 //  y volver a subir para normal operacion
 //  This line sets the RTC with an explicit date & time, for example to set
 //  January 21, 2014 at 3am you would call:
   
   //rtc.adjust(DateTime(__DATE__, __TIME__));  // funcion que permite establecer fecha y horario
 //  al momento de la compilacion. Comentar esta linea
 //  y volver a subir para normal operacion

}


void loop() {

 DateTime fecha = rtc.now();      // funcion que devuelve fecha y horario en formato
           // DateTime y asigna a variable fecha
           
 display.clearDisplay();
 display.cp437(true);         // Use full 256 char 'Code Page 437' font
 display.setFont(&FreeMonoBold9pt7b);  // Set a custom font
 display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0

 // Convert Variable1 into a string, so we can change the text alignment to the right:
 // It can be also used to add or remove decimal numbers.
 char hora[2];  // Create a character array of 10 characters
 char minuto[2];
 char segundo[2];
 char dia[2];

 display.setCursor(10, 60);  // (x,y)
 dtostrf(fecha.day(), 2, 0, dia );
 if (fecha.day()<10 ){
   display.print(" ");
   display.print ( fecha.day());
 }
 else  display.print(dia);

 display.print(".");

 display.print(fecha.month());

 display.print(".");

 display.print(fecha.year());

 
 
 display.setFont(&FreeMonoBold9pt7b);  // Set a custom font
 display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
 display.setCursor(20, 20);  // (x,y)

 
 dtostrf(fecha.hour(), 2, 0, hora );
 if (fecha.hour()<10 ){
   display.print("0");
   display.print ( fecha.hour());
 }
 else  display.print(hora);
 
 display.print(":");

 dtostrf(fecha.minute(), 2, 0, minuto);
 if ( fecha.minute() < 10 ){
   display.print("0");
   display.print ( fecha.minute());
 }
 else display.print (minuto);
 
 display.print(":");
 
 dtostrf(fecha.second(), 2, 0, segundo);  // (<variable>,<amount of digits we are going to use>,<amount of decimal digits>,<string name>)
  if( fecha.second()<10 ){
   display.print('0');
   display.print ( fecha.second());
  }
  else display.print(segundo);

// Muestra temperatura ambiente

 display.setFont(&FreeMonoBold9pt7b);  // Set a custom font
 display.setTextSize(0);  // Set text size. We are using a custom font so you should always use the text size of 0
 display.setCursor(23, 40);  // (x,y)
 display.print(rtc.getTemperature());
 display.print(" C");
 
           

   display.display();
       

}