Using Nano Every with Nano data logging shield

I'm using BME280 and PMS5003 particulate sensors and an ILI9225 TFT display. Without data logging, this system works fine on a a Nano. But, adding data logging code to such a system is too large to compile on a Nano. I tried mounting the Nano Every on a Nano data logging shield, widely available online. The individual components of this system work but the logging code won't run at all. Does anyone know why this shouldn't work??
Should I try a separate RTC/SD data logging module?

The ATmega328P has a minimum Vih of 0.6 * Vcc when Vcc is 2.4V - 5.5V. So when operating at 5V, its Vih is 3V.

The ATmega4809 has a minimum Vih of 0.7 * Vcc. So its minimum Vcc at 5V is 3.5V.

The logging shield, if I indeed found the one you're using (and had you provided a link to it that doubt would have been removed and I wouldn't have had to search for one), feeds the MISO signal directly from the uSD card to pin 12 on the Nano.

Recall that the uSD card operates at 3.3V.

With the ATmega328P, the MISO signal level meets the minimum Vih requirement of 3V.

With the ATmega4809, the MISO signal level does not meet the minimum Vih requirement of 3.5V.

To be more specific, I've used several Nano data logging shields from Amazon, so I'm not sure which one this is -- they all appear to be the same. I said the project didn't work, but... not quite true. The data were logged, but the ILI9225 display never worked. If I run the same code, but without data logging code, the display works just fine.
I'm wondering if getting something like a separate data logging module from Adafruit would solve the problem. Your thoughts?

Please post your code and a wiring schematic of how things are connected.

Here is the (long) code. The wiring is as laid out in the code. As I mentioned in previous post, all of the components work fine by themselves. As written, the code saves data to the SD card. The only problem is that the ILI9225 TFT doesn't display any data.


`/* ILI9225_T_RH_P_PM_log.ino, December 2023
  Uses BME280 to display indoor temperature (deg F),
  humidity (%), and pressure (" Hg). Includes PM2.5 and
  PM10 values from PMS5003 particulate sensor.
*/
// PM setup
  #define KNT_MAX 50
  #include <SoftwareSerial.h>
  SoftwareSerial pmsSerial(2, 3);
  float pm2_5 = 0., pm10 = 0., AQI2_5, AQI10;
  int knt = 0, color;
// BME280 setup
  #include <Wire.h>
  #include <SPI.h>
  #include <Adafruit_BME280.h>
  Adafruit_BME280 bme;
  float T, RH, P, elev = 0.131; // elevation (km) at my site
// Datalog setup
  #include <RTClib.h>
  #include <SD.h>
  const int SDpin = 10;
  RTC_DS1307 rtc;  // old dataloggers
  int YR, MON, DAY, HR, MIN, SEC;
  File logfile;
  char filename[] = "WEATHER.CSV";
// TFT setup
  String Date;
  #include "TFT_22_ILI9225.h"
  #include <../fonts/FreeSerif12pt7b.h>
  #include <../fonts/FreeSerif9pt7b.h>
  // hardware SPI
  //#define TFT_RST  8
  //#define TFT_RS   9
  //#define TFT_CS  10  // SS
  // avoid conflicts with SD card, especially pin 10?
  #define TFT_RST  6
  #define TFT_RS   7
  #define TFT_CS   5  // SS
  #define TFT_SDI 11  // MOSI
  #define TFT_CLK 13  // SCK
  #define TFT_LED  0   // 0 if wired to +5V directly
  #define TFT_BRIGHTNESS 200
  const int width = 176, height = 220;
  TFT_22_ILI9225 tft=TFT_22_ILI9225(TFT_RST,TFT_RS,TFT_CS,TFT_SDI,TFT_CLK,TFT_LED);
void setup() {
  Serial.begin(9600); Wire.begin(); rtc.begin();
  if (!SD.begin(SDpin)) Serial.println("Card failed.");
  else
    Serial.println("card initialized.");
  logfile = SD.open(filename, FILE_WRITE);
  if (!logfile) Serial.println("Couldn't create file.");
  else {
    Serial.print("Logging to file "); Serial.println(filename);
  }
  if (!bme.begin()) Serial.println("Couldn't find BME280 sensor.");
  else Serial.println("Found BME280 sensor.");
  pmsSerial.begin(9600);
  tft.begin(); tft.setOrientation(1); tft.clear();
  tft.setGFXFont(&FreeSerif9pt7b);
  tft.drawGFXText(2,25,"Waiting for PM sensor...", COLOR_RED);
  tft.setGFXFont(&FreeSerif12pt7b);
}
struct pms5003data {
  uint16_t framelen;
  uint16_t pm10_standard, pm25_standard, pm100_standard;
  uint16_t pm10_env, pm25_env, pm100_env;
  uint16_t particles_03um, particles_05um, particles_10um;
  uint16_t particles_25um, particles_50um, particles_100um;
  uint16_t unused; uint16_t checksum;
};
struct pms5003data data;
void loop() {
  // PM/AQI
  if (readPMSdata(&pmsSerial)) { // reading data was successful!
    pm2_5+=data.pm25_env;pm10+=data.pm100_env;knt++;
    //Serial.println(knt);
    if (knt==KNT_MAX) {
      DateTime now=rtc.now();
      YR=now.year();MON=now.month(); DAY=now.day();
      HR=now.hour();MIN=now.minute();SEC=now.second();
      Date = String(YR) + '/';
      if (MON< 10) Date+='0'; Date+=String(MON)+'/';
      if (DAY< 10) Date+='0'; Date+=String(DAY)+' ';
      if (HR < 10) Date+='0'; Date+=String(HR)+':';
      if (MIN< 10) Date+='0'; Date+=String(MIN);
      tft.clear();
      tft.drawGFXText(15,25,Date,COLOR_WHITE);
      // temperature, convert to deg F?
      T = bme.readTemperature()*9./5.+32.;
      T = bme.readTemperature();
      tft.drawGFXText(15,57,"T = ", COLOR_RED);
      tft.drawGFXText(57,57,String(T,1), COLOR_RED);
      tft.drawGFXText(103,47,"o",COLOR_RED);
      tft.drawGFXText(113,57,"F",COLOR_RED);
      // humidity, percent
      RH = bme.readHumidity();
      tft.drawGFXText(15, 82, "H = ", COLOR_SKYBLUE);
      tft.drawGFXText(57, 82, String((int)(RH + 0.5)) + "%", COLOR_SKYBLUE);
      // pressure, pascals
      P=bme.readPressure(); // station pressure (at site elevation)
      tft.drawGFXText(15, 107, "P = ", COLOR_MAGENTA);
      P=P /100./ exp(-0.119*elev-0.0013*elev*elev); // to sea level
      P=P*29.921/1013.15; // P to inches of mercury
      tft.drawGFXText(57, 107, String(P, 2) + " \"Hg", COLOR_MAGENTA);
      pm2_5 /= knt; pm10 /= knt;
      if (pm2_5 <= 12.0) AQI2_5 = (50. - 0.) / (12.0 - 0.) * (pm2_5 - 0.0) + 0.;
      else if (pm2_5 <= 35.4) AQI2_5 = (100. - 50.) / (35.4 - 12.0) * (pm2_5 - 12.0) + 50.;
      else if (pm2_5 <= 55.4) AQI2_5 = (150. - 100.) / (55.4 - 35.4) * (pm2_5 - 35.4) + 100.;
      else if (pm2_5 <= 150.4) AQI2_5 = (200. - 150.) / (150.4 - 55.4) * (pm2_5 - 55.4) + 150.;
      else if (pm2_5 <= 250.4) AQI2_5 = (300. - 200.) / (250.4 - 150.4) * (pm2_5 - 150.4) + 200.;
      else if (pm2_5 <= 350.4) AQI2_5 = (400. - 300.) / (350.4 - 250.4) * (pm2_5 - 250.4) + 300.;
      else if  (pm2_5 <= 500.4)AQI2_5 = (500. - 400.) / (500.4 - 350.4) * (pm2_5 - 350.4) + 400.;
      else AQI2_5 = 501.;
      if (pm10 <= 54.) AQI10 = (50. - 0.) / (54. - 0.) * (pm10 - 0.) + 0.;
      else if (pm10 <= 154.) AQI10 = (100. - 50.) / (154. - 54.) * (pm10 - 54.) + 50.;
      else if (pm10 <= 254.) AQI10 = (150. - 100.) / (254. - 154.) * (pm10 - 154.) + 100.;
      else if (pm10 <= 354.) AQI10 = (200. - 150.) / (354. - 254.) * (pm10 - 254.) + 150.;
      else if (pm10 <= 424.) AQI10 = (300. - 200.) / (424. - 354.) * (pm10 - 354.) + 200.;
      else if (pm10 <= 504.) AQI10 = (400 - 300) / (504. - 424.) * (pm10 - 424.);
      else if (pm10 <= 604.) AQI10 = (500. - 400.) / (604. - 504.) * (pm10 - 504.) * 400.;
      if ((int)AQI2_5 <= 50) color = COLOR_GREEN;
      else if ((int)AQI2_5 <= 100) color = COLOR_YELLOW;
      else if ((int)AQI2_5 <= 150) color = COLOR_ORANGE;
      else if ((int)AQI2_5 <= 200) color = COLOR_RED;
      else color = COLOR_DARKRED;
      tft.drawGFXText(15, 136, "AQI 2.5 = " + String((int)AQI2_5), color);
      if ((int)AQI10 <= 50) color = COLOR_GREEN;
      else if ((int)AQI10 <= 100) color = COLOR_YELLOW;
      else if ((int)AQI10 <= 150) color = COLOR_ORANGE;
      else if ((int)AQI10 <= 200) color = COLOR_RED;
      else color = COLOR_DARKRED;
      tft.drawGFXText(15, 166, "AQI  10 = " + String((int)AQI10), color);
      pm2_5 = 0; pm10 = 0; knt =0; // reset PM totals
      logfile.print(YR); logfile.print('/');logfile.print(MON);logfile.print('/');
      logfile.print(DAY);logfile.print(',');logfile.print(HR); logfile.print(':');
      logfile.print(MIN);logfile.print(':');logfile.print(SEC);logfile.print(',');
      logfile.print(DAY+HR/24.+MIN/1440.+SEC/86400.,6);logfile.print(',');
      logfile.print(T,2);      logfile.print(',');
      logfile.print(RH,1);     logfile.print(',');
      logfile.print(P,3);      logfile.print(',');
      logfile.print(AQI2_5,0); logfile.print(',');
      logfile.println(AQI10,0);logfile.flush();
    }
  }
}
boolean readPMSdata(Stream *s) {
  if (! s->available()) {
    return false;
  }
  // Read a byte at a time until we get to the special
  // '0x42' start-byte
  if (s->peek() != 0x42) {
    s->read();
    return false;
  }
  // Now read all 32 bytes
  if (s->available() < 32) {
    return false;
  }
  uint8_t buffer[32]; uint16_t sum = 0;
  s->readBytes(buffer, 32);
  // get checksum ready
  for (uint8_t i = 0; i < 30; i++) {
    sum += buffer[i];
  }
  // The data comes in endian'd, this solves it so it works on all platforms
  uint16_t buffer_u16[15];
  for (uint8_t i = 0; i < 15; i++) {
    buffer_u16[i] = buffer[2 + i * 2 + 1];
    buffer_u16[i] += (buffer[2 + i * 2] << 8);
  }
  // put it into a nice struct :)
  memcpy((void *)&data, (void *)buffer_u16, 30);
  if (sum != data.checksum) {
    Serial.println("Checksum failure");
    return false;
  }
  // success!
  return true;
}`

Does the TFT show this line from setup
tft.drawGFXText(2,25,"Waiting for PM sensor...", COLOR_RED);

I don't know if its related to the problem you have, but Software Serial is not needed on the Nano Every as there are multiple hardware serial port. The most simple to use is Serial1 on the Tx1 and Rx0 pins which unlike the classic Nano, are separate from the USB serial. The use of Software Serial may be an issue for the software SPI used by the library with the display.

PROGMEM is also not relevant for the 4809, but is supported by the core.

Are you certain that with your shield, TFT_CS, pin 5, is indeed connected to the CS on the display?

I think that with the display library you are using a software SPI to communicate, while the SD card is using the hardware SPI. I'm not certain how well they work together.

Can you post the stand alone code which works with the Nano Every and the display? Are the constructors and the pins the same as the code which does not run the display?

Not even the "waiting..." line displays with the data logger shield attached. Here's code that works except for no data logger. For that system I've used an Adafruit I2C PCF8523 RTC module to display date/time. Could you be more specific about using different SPI pins for the TFT on the Nano Every?

/* ILI9225_T_RH_P_PM.ino, 
  humidity (%), and pressure (" Hg). Includes PM2.5 and
  PM10 values from PMS5003 particulate sensor. 
*/ 
// PM setup
  #define KNT_MAX 50
  #include <SoftwareSerial.h>
  SoftwareSerial pmsSerial(2, 3); 
  float pm2_5=0.,pm10=0.,AQI2_5,AQI10;
  int knt=0,color;
// BME280 setup
  #include <Wire.h>
  #include <Adafruit_BME280.h>
  Adafruit_BME280 bme; 
  float T,RH,P,elev=0.131; // elevation (km) at my site
// RTC setup
  #include <RTClib.h>
  RTC_PCF8523 rtc; 
  //RTC_DS1307 rtc;  // old dataloggers  
  int YR,MON,DAY,HR,MIN; 
  String Date;
// TFT setup  
  #include "SPI.h"
  #include "TFT_22_ILI9225.h"
  #include <../fonts/FreeSerif12pt7b.h>
  #include <../fonts/FreeSerif9pt7b.h>  
// hardware SPI
  //#define TFT_RST  8
  //#define TFT_RS   9
  //#define TFT_CS  10  // SS  
  #define TFT_RST  6
  #define TFT_RS   7
  #define TFT_CS   5  // SS+  
  #define TFT_SDI 11  // MOSI
  #define TFT_CLK 13  // SCK
  #define TFT_LED  0   // 0 if wired to +5V directly
  #define TFT_BRIGHTNESS 200 
  const int width=176,height=220; 
  // Use hardware SPI? (faster - on Uno: 13-SCK, 12-MISO, 11-MOSI)
  TFT_22_ILI9225 tft=TFT_22_ILI9225(TFT_RST,TFT_RS,TFT_CS,TFT_SDI,TFT_CLK,TFT_LED);

void setup() {
  Serial.begin(9600); Wire.begin(); rtc.begin();
  Serial.println(F("BME280 test"));
  if (!bme.begin()) Serial.println("Couldn't find BME280 sensor.");
  else Serial.println("Found BME280 sensor.");
  pmsSerial.begin(9600);   
  tft.begin(); tft.setOrientation(1); tft.clear();
  tft.setGFXFont(&FreeSerif9pt7b);
  tft.drawGFXText(2,25,"Waiting for PM sensor...",COLOR_RED);  
  tft.setGFXFont(&FreeSerif12pt7b);  
}
struct pms5003data {
  uint16_t framelen;
  uint16_t pm10_standard, pm25_standard, pm100_standard;
  uint16_t pm10_env, pm25_env, pm100_env;
  uint16_t particles_03um, particles_05um, particles_10um;
  uint16_t particles_25um, particles_50um, particles_100um;
  uint16_t unused; uint16_t checksum;
};
struct pms5003data data;
void loop() {
  // PM/AQI
  if (readPMSdata(&pmsSerial)) { // reading data was successful!
    pm2_5+=data.pm25_env; pm10+=data.pm100_env;
    knt++;
    if (knt==KNT_MAX) {
      DateTime now=rtc.now();
      YR=now.year(); MON=now.month(); DAY=now.day();
      HR=now.hour(); MIN=now.minute();
      Date=String(YR)+'/';
      if (MON<10) Date+='0'; Date+=String(MON)+'/';
      if (DAY<10) Date+='0'; Date+=String(DAY)+' ';
      if (HR<10)  Date+='0'; Date+=String(HR)+':';
      if (MIN<10) Date+='0'; Date+=String(MIN);
      tft.clear();
      tft.drawGFXText(15,25,Date,COLOR_WHITE);
      // temperature, convert to deg F?
      //T=bme.readTemperature()*9./5.+32.; 
      T=bme.readTemperature();
      tft.drawGFXText(15,57,"T = ",COLOR_RED);
      tft.drawGFXText(57,57,String(T,1),COLOR_RED);
      tft.drawGFXText(103,47,"o",COLOR_RED); 
      tft.drawGFXText(113,57,"C",COLOR_RED);
      // humidity, percent
      RH=bme.readHumidity();
      tft.drawGFXText(15,82,"H = ",COLOR_SKYBLUE); 
      tft.drawGFXText(57,82,String((int)(RH+0.5))+"%",COLOR_SKYBLUE); 
      // pressure, pascals
      P=bme.readPressure(); // station pressure (at site elevation)
      tft.drawGFXText(15,107,"P = ",COLOR_MAGENTA); 
      P=P/100./exp(-0.119*elev-0.0013*elev*elev); // to sea level
      tft.drawGFXText(57,107,String(P,2)+" mb",COLOR_MAGENTA);                                                                                       
      pm2_5/=knt; pm10/=knt;
     if (pm2_5<=12.0) AQI2_5=(50.-0.)/(12.0-0.)*(pm2_5-0.0)+0.;
     else if (pm2_5<=35.4) AQI2_5=(100.-50.)/(35.4-12.0)*(pm2_5-12.0)+50.;
      else if (pm2_5<=55.4) AQI2_5=(150.-100.)/(55.4-35.4)*(pm2_5-35.4)+100.;
      else if (pm2_5<=150.4) AQI2_5=(200.-150.)/(150.4-55.4)*(pm2_5-55.4)+150.;
      else if (pm2_5<=250.4) AQI2_5=(300.-200.)/(250.4-150.4)*(pm2_5-150.4)+200.;
      else if (pm2_5<=350.4) AQI2_5=(400.-300.)/(350.4-250.4)*(pm2_5-250.4)+300.;
      else if  (pm2_5<=500.4)AQI2_5=(500.-400.)/(500.4-350.4)*(pm2_5-350.4) +400.;
     else AQI2_5=501.;
     if (pm10<=54.) AQI10=(50.-0.)/(54.-0.)*(pm10-0.)+0.;
     else if (pm10<=154.) AQI10=(100.-50.)/(154.-54.)*(pm10-54.)+50.;
     else if (pm10<=254.) AQI10=(150.-100.)/(254.-154.)*(pm10-154.)+100.;
     else if (pm10<=354.) AQI10=(200.-150.)/(354.-254.)*(pm10-254.)+150.;
     else if (pm10<=424.) AQI10=(300.-200.)/(424.-354.)*(pm10-354.)+200.;
     else if (pm10<=504.) AQI10=(400-300)/(504.-424.)*(pm10-424.);
     else if (pm10<=604.) AQI10=(500.-400.)/(604.-504.)*(pm10-504.)*400.;
     if ((int)AQI2_5<=50) color=COLOR_GREEN;
     else if((int)AQI2_5<=100) color=COLOR_YELLOW;
     else if ((int)AQI2_5<=150) color=COLOR_ORANGE;
     else if ((int)AQI2_5<=200) color=COLOR_RED;
     else color=COLOR_DARKRED;
     tft.drawGFXText(15,136,"AQI 2.5 = "+String((int)AQI2_5),color);
     if ((int)AQI10<=50) color=COLOR_GREEN;
     else if((int)AQI10<=100) color=COLOR_YELLOW;
     else if ((int)AQI10<=150) color=COLOR_ORANGE;
     else if ((int)AQI10<=200) color=COLOR_RED;
     else color=COLOR_DARKRED;      
     tft.drawGFXText(15,166,"AQI  10 = "+String((int)AQI10),color);
     pm2_5=0; pm10=0; knt=0;// reset PM totals      
    }
  } 
}
float seaLevel(float P,float elev) { // shift to U.S. units?
  // conversion from station pressure in mbar to 
  // sea level "Hg. Elevation in km.
  return 29.921/1013.25*P/exp(-0.119*elev-0.0013*elev*elev);
}
boolean readPMSdata(Stream *s) {
if (! s->available()) {return false;}
// Read a byte at a time until we get to the special 
// '0x42' start-byte
if (s->peek() != 0x42) {s->read();return false;}
// Now read all 32 bytes
if (s->available() < 32) { return false;}
uint8_t buffer[32]; uint16_t sum = 0;
s->readBytes(buffer, 32);
// get checksum ready
for (uint8_t i=0; i<30; i++) {
sum += buffer[i];}
// The data comes in endian'd, this solves it so it works on all platforms
uint16_t buffer_u16[15];
for (uint8_t i=0; i<15; i++) {
  buffer_u16[i] = buffer[2 + i*2 + 1];
  buffer_u16[i] += (buffer[2 + i*2] << 8);}
// put it into a nice struct :)
memcpy((void *)&data, (void *)buffer_u16, 30);
if (sum != data.checksum) {
  Serial.println("Checksum failure");
  return false;}
// success!
return true;
}

There's no need to use any loop code for testing at this point. If you only run the setup and you comment out first the SD.open() line, and then the SD.begin() line can determine when the tft display does not show the"Waiting for PM sensor...". It might give us some clues.

The library is very complex and covers many mcu's and I'm not clear why it works for the classic nano but not the every.

My thinking is that the library is using some sort of software spi, and not running the every on the hardware spi bus like the sd card. If you were not using the library you you just write to both devices with a different CS.

I will study the library some more, but its not clear to me that the is a constructor for the Nano Every which uses the hardware spi bus.

Can you figure out how to write to the display without the library?

Hmm... at least I'm glad that this is a mystery and not just me! I will try your suggestion about running just the setup function but that seems unlikely. When I upload this code and try to run it, the TFT stays bright and doesn't even go through its screen clearing tft.clear() statement. I have an old Deek-Robot data logging module that I will try, just to make sure there's nothing particular about the Nano data logging shield. Not optimistic, but...
As for writing to the display without a library, that's way beyond my capabilities! I hope somebody can figure this out because what I'm trying to do doesn't seem that obscure and it would be nice for everybody to know how to log data while at the same time displaying it on a TFT screen. The Nano Every is a nice board, but maybe Arduino needs to make a data logging shield specifically for it. Say, like the data logging shield Adafruit has for their Feather series boards.

#define TFT_RST  6
  #define TFT_RS   7
  #define TFT_CS   5  // SS
  #define TFT_SDI 11  // MOSI
  #define TFT_CLK 13  // SCK
  #define TFT_LED  0   // 0 if wired to +5V directly
  #define TFT_BRIGHTNESS 200
  const int width = 176, height = 220;
  TFT_22_ILI9225 tft=TFT_22_ILI9225(TFT_RST,TFT_RS,TFT_CS,TFT_SDI,TFT_CLK,TFT_LED);

That is a constructor for software spi.

Try this constuctor instead for hardware spi but with CS 5.

// Constructor when using hardware SPI.  Faster, but must use SPI pins
// specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.)
TFT_22_ILI9225::TFT_22_ILI9225(int8_t rst, int8_t rs, int8_t cs, int8_t led) {

Please clarify -- sorry to be dense! First of all, a semicolon at the end of your TFT... line, yes? Do I have to enter the SPI pin values in that line, as I've defined them? What values do I use? Probably I need specific code as you've suggested it. :frowning:

This is how to put te values in the constructor to see if the library will use the same hardware spi bus as the sd card.
Please verify the pin numbers.

//TFT_22_ILI9225::TFT_22_ILI9225(int8_t rst, int8_t rs, int8_t cs, int8_t led); 
TFT_22_ILI9225::TFT_22_ILI9225(6, 7, 5, 0);

If this is what you meant:
// hardware SPI
#define TFT_RST 8
#define TFT_RS 9
//#define TFT_CS 10 // SS
// avoid conflicts with SD card, especially pin 10?
//#define TFT_RST 6
//#define TFT_RS 7
#define TFT_CS 5 // SS
#define TFT_SDI 11 // MOSI
#define TFT_CLK 13 // SCK
#define TFT_LED 0 // 0 if wired to +5V directly
#define TFT_BRIGHTNESS 200
const int width = 176, height = 220;
TFT_22_ILI9225 tft=TFT_22_ILI9225(TFT_RST,TFT_RS,TFT_CS,TFT_SDI,TFT_CLK,TFT_LED);

it makes no difference. Still doesn't get pack the TFT screen clear statement.

TFT_22_ILI9225 tft=TFT_22_ILI9225(TFT_RST,TFT_RS,TFT_CS,TFT_SDI,TFT_CLK,TFT_LED);

The constructor I recommended was

TFT_22_ILI9225 tft=TFT_22_ILI9225(TFT_RST,TFT_RS,TFT_CS,TFT_LED);

When the constructor doesn't have any specific pins mentioned for these pins is will chose the hardware spi which is being used for the sd card.

#define TFT_SDI 11 // MOSI
#define TFT_CLK 13 // SCK

I am really not clear about the source of the spi conflict between the display and the sd card and the attempts to get both instances on the same bus with different Chip Select pins may not really be what you need.

I really don't know where to go with this, and I would try to see if you can use both devices without the display library.

I really don't know what more assistance I can provide.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.