Делаю небольшой проект: Мониторинг наличия напряжение в электросети. Лог по замеру напряжения пишется в файл. Также, хочу чтобы фактическое напряжение выводилось на экран.
Если экран не подключен, то все пишется, карта не отваливается. Если добавляю экран, то появляется проблема с файлом
Если убрать все лишние датчики, оставив только экран и карту памяти, то тоже все нормально.
Только экран и карта памяти:
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);
}