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

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

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

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

Только экран и карта памяти: https://wokwi.com/projects/378276902450486273
Проект целиком только вместо датчика температуры 18B20 будет стоять датчик напряжения: https://wokwi.com/projects/378136333356100609

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

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

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

#include

#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);
}
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
nava2002
@nava2002
Инженер
Внимательно проанализируйте по какой шине что подключено. SPI и I2C позволяют коммутацию нескольких устройств НО требуется организация этого процесса.
Судя по вопросу очевидно имеет место конфликт между несколькими устройствами работающими по одной шине.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
WizAnd
@WizAnd Автор вопроса
Borys Latysh Конфликт однозначно есть, но подключено только два устройства. А может быть такое, что много устройств и датчиков подключено к одному выходу напряжения и просто не хватает питания?

Правда, в песочнице я пока закомментировал все, что касается lcd - обойдусь светодиодами, а потом, когда придут железки буду уже тестировать на них
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы