Помогите найти ошибку отвала карты памяти(LCD + SDCard+другие датчики)

Делаю небольшой проект: Мониторинг наличия напряжение в электросети. Лог по замеру напряжения пишется в файл. Также, хочу чтобы фактическое напряжение выводилось на экран.

Если экран не подключен, то все пишется, карта не отваливается. Если добавляю экран, то появляется проблема с файлом

Если убрать все лишние датчики, оставив только экран и карту памяти, то тоже все нормально.

Только экран и карта памяти: Only_card_and_LCD - Wokwi ESP32, STM32, Arduino Simulator
Проект целиком только вместо датчика температуры 18B20 будет стоять датчик напряжения: Monitoring_temperature - Wokwi ESP32, STM32, Arduino Simulator

Подскажите, пожалуйста, в чем может быть проблема.

#include "DHT.h"
#include <LiquidCrystal_I2C.h>
//----------------------
#include "SdFat.h"
#define SPI_SPEED SD_SCK_MHZ(4)
#define CS_PIN 10
LiquidCrystal_I2C lcd(0x27,16,2);



SdFat sd;
//-----------------------
#include <Wire.h>                           // Подключаем библиотеку Wire                           
#include <TimeLib.h>                        // Подключаем библиотеку TimeLib
#include <DS1307RTC.h>    
//-----------------------

#include <ZMPT101B.h>

#define SENSITIVITY 500.0f

File myFile;

// ZMPT101B sensor output connected to analog pin A0
// and the voltage source frequency is 50 Hz.
ZMPT101B voltageSensor(A0, 50.0);

#define DHTPIN 2 // Тот самый номер пина, о котором упоминалось выше
// Одна из следующих строк закоментирована. Снимите комментарий, если подключаете датчик DHT11 к arduino
DHT dht(DHTPIN, DHT22); //Инициация датчика
//DHT dht(DHTPIN, DHT11);
void setup() {

  lcd.init();
  //lcd.backlight();
  
  
  lcd.setCursor(0,0);
  lcd.print("My name is Yousef");
  lcd.setCursor(1,1);
  lcd.print("       Welcome    ");
  lcd.print("Hi...");

  lcd.setCursor(0,0);

  

  byte alarm1 = 0; // Пропадение напряжения (1 - напряжения нет; 0 - напряжение есть)
  byte alarm2 = 0; // Превышение уровня влажности (1 - превышение; 0 - превышения нет)

  Serial.begin(9600);

  dht.begin();
  //-----------------------------------
  //  Serial.begin(115200);
  if (!sd.begin(CS_PIN, SPI_SPEED)) {
    if (sd.card()->errorCode()) {
      Serial.println("SD initialization failed.");
    } else if (sd.vol()->fatType() == 0) {
      Serial.println("Can't find a valid FAT16/FAT32 partition.");
    } else {
      Serial.println("Can't determine error type");
    }
    return;
  }

  voltageSensor.setSensitivity(SENSITIVITY);

}
void loop() {
  delay(4000); // 4 секунды задержки
  //Serial.println(analogRead(A0));
  float h = dht.readHumidity(); //Измеряем влажность
  float t = dht.readTemperature(); //Измеряем температуру
  float voltage = voltageSensor.getRmsVoltage();
  Serial.println(voltage);

  if (isnan(h) || isnan(t)) {  // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
    Serial.println("Ошибка считывания");
    return;
  }
  tmElements_t tm;                          
 
  if (RTC.read(tm)) {
    Serial.print("Time");
    Serial.print("|");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print("|");
    Serial.print("Date");
    Serial.print("|");
    Serial.print(tm.Day);
    Serial.write('.');
    Serial.print(tm.Month);
    Serial.write('.');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.print("|");
    Serial.println();
    Serial.print("Влажность:");
    Serial.print("|");
    Serial.print(h);
    Serial.print("|");
//  Serial.print(" %\t");
    Serial.print("Температура: ");
    Serial.print("|");
    Serial.print(t);
    Serial.print("|");
    Serial.print("Напряжение");
    Serial.println(voltage);
//  Serial.println(" *C "); //Вывод показателей на экран
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  myFile = sd.open("logs.txt", FILE_WRITE);
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to logs.txt...");
    myFile.print(tm.Day);
    myFile.print('.');
    myFile.print(tm.Month);
    myFile.print('.');
    myFile.print(tmYearToCalendar(tm.Year));
    myFile.print("|");
    myFile.print(tm.Hour);
    myFile.print(':');
    myFile.print(tm.Minute);
    myFile.print(':');
    myFile.print(tm.Second);
    myFile.print("|");
    if (t == 0) {
      myFile.print("Отключение электроэнергии");
    }
    else {
      myFile.print("t");
    }
    myFile.print("t");
    myFile.print("|");
    myFile.print("h");
    myFile.print("|");
    myFile.print(voltage);

    // close the file:
    myFile.close();
    sd.ls(LS_R | LS_SIZE); //Нужно для отладки чтобы видеть что файл увеличивается

  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening logs.txt");
  }

}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

офигенно понятно

Срабатывает данная часть кода:
if (myFile) {
Serial.print(“Writing to logs.txt…”);

} else {
// if the file didn’t open, print an error:
Serial.println(“error opening logs.txt”);

Да, непонятно, поэтому я прислал ссылки на песочницы

ОЗУ не хватает видимо …

1 лайк