ЭЛЕКТРОНИКА проблема с записью на sd карту

warsteiner

✩✩✩✩✩✩✩
1 Авг 2020
15
0
Оформи код соответствующим тэгом
Такова моя проблема:
Собрал некое устройство на mega2560pro mini, lcd128x64, rtc3231, модуль sd card, аналоговый датчик температуры и кнопки.
Заставил его выводить на экранчик текущее время, текущую температуру и минимум/максимум.
Теперь мне нужно сохранять эти данные на sd карту при условии флага "recstart" и настраиваемом периоде "rectime" (тип данных uint32_t)

if (recstart == true) {
u8g2.drawFrame(121,1,6,6);
if (!SD.begin(PIN_CHIP_SELECT)) {
u8g2.setFont(u8g2_font_5x8_t_cyrillic);
u8g2.setCursor(24, 32); u8g2.println("ЧТО ТО ПОШЛО НЕ ТАК");
Serial.println("ЧТО ТО ПОШЛО НЕ ТАК");
return;
}
File dataFile = SD.open("datalog.txt", FILE_WRITE);//начать запись
if (millis() - myTimer4 >= rectime) {
myTimer4 = millis();
u8g2.clearBuffer();
logStringData += String(steinhart);
logStringData += " ";
logStringData += (watch.gettime("H:i:s"));
logStringData += ",";

if (dataFile) {
dataFile.println(logStringData);
Serial.println(logStringData);
u8g2.drawBox(120, 1, 7, 7);
u8g2.sendBuffer();
u8g2.clearBuffer();
dataFile.close();
}
else {
Serial.println("error opening datalog.txt");
u8g2.setCursor(3, 24); u8g2.println("error opening datalog.txt");
u8g2.sendBuffer();
return;
}
}
u8g2.sendBuffer();
}

Столкнулся с проблемой вот какой:
Данные записываются исправно только в течение 3,5 - 4 мин

Pb1 = 43.66 12:26:51,
Pb1 = 43.54 12:27:22,
Pb1 = 43.31 12:27:53,
Pb1 = 43.20 12:28:23,
Pb1 = 43.20 12:28:54,
Pb1 = 43.31 12:29:24,
Pb1 = 43.31 12:29:55,
Pb1 = 43.31 12:30:26,
error opening datalog.txt
error opening datalog.txt
error opening datalog.txt

Пробовал записывать с периодом 10сек, 20сек, 30сек, - одно и то же. 3,5минуты и облом.
Попробовал перескочить проблемные 4мин и установил период 300сек(5мин).
Запись произошла всего один раз
Pb1 = 42.40 12:36:48,
error opening datalog.txt
error opening datalog.txt
error opening datalog.txt
error opening datalog.txt
error opening datalog.txt

В чем может быть проблема?
Поменять флешку на другую нет возможности, я эту то флешку еле нашел (надо было наверное покупать модуль под micro sd)
Я уже так настрадался с этим проектом, везде какие то подводные камни, то экран мерцает, то менюшка не пишется,
сейчас вот флешка отказывается работать...
Я уж молчу про вздувающуюся батарейку на RTC...
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,281
947
58
Марий-Эл
Я уж молчу про вздувающуюся батарейку на RTC...
Батарейка может взорваться если на неё подаётся большой ток заряда.
Ток заряда программируется в DS3231. Если ставится просто батарейка а не аккумулятор. Лучше эту функцию отключать.
 

warsteiner

✩✩✩✩✩✩✩
1 Авг 2020
15
0
Батарейка может взорваться если на неё подаётся большой ток заряда.
Ток заряда программируется в DS3231. Если ставится просто батарейка а не аккумулятор. Лучше эту функцию отключать.
Аккум уже заказан, а про какую то настройку впервые читаю. Нет там никаких настроек. Только резать ноги.
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
DS3231 распознаёт тип подключённого элемента: батарейка или аккумулятор, и не заряжает батарейку.
Другой вопрос, что китайцы делают на своих модулях цепь зарядки в обход внутренней.
 

warsteiner

✩✩✩✩✩✩✩
1 Авг 2020
15
0
Господа, с радостью почитаю советы про RTC в какой нибудь другой теме.
Мне бы хоть какой то совет про описаную беду с флешкой
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
1) Попробуй перед закрытием файла сделать flush
2) У меня в библиотеках рядом с библиотекой FD есть библиотека SD_fix. Что там за fix я не знаю, не изучал, но может стоит попробовать ?
 

poty

★★★★★★✩
19 Фев 2020
2,990
895
Ну, просто проблема с DS3231 очевиднее, Вам на неё сразу и ответили. Что касается кода:
  • не стоит инициализировать SD (SD.begin(PIN_CHIP_SELECT) ) в цикле, это нужно сделать один раз в setup;
  • строку
File dataFile = SD.open("datalog.txt", FILE_WRITE);//начать запись
нужно внести внутрь скобок условия, иначе получается, что открываете Вы каждый раз, а закрываете только тогда, когда сработал Ваш импровизированный таймер.
 
  • Лойс +1
Реакции: warsteiner

warsteiner

✩✩✩✩✩✩✩
1 Авг 2020
15
0
1) Попробуй перед закрытием файла сделать flush
2) У меня в библиотеках рядом с библиотекой FD есть библиотека SD_fix. Что там за fix я не знаю, не изучал, но может стоит попробовать ?
я уже ведро Flush выпил, флешка продолжает капризничать. Может я не тот flush использую?
Такая вот шутка несмешная получилась.
Совет, безусловно, крайне ценный, но как им пользоваться?
Куда, какой "flush" вписать то?
 

warsteiner

✩✩✩✩✩✩✩
1 Авг 2020
15
0
Ну, просто проблема с DS3231 очевиднее, Вам на неё сразу и ответили. Что касается кода:
  • не стоит инициализировать SD (SD.begin(PIN_CHIP_SELECT) ) в цикле, это нужно сделать один раз в setup;
  • строку
File dataFile = SD.open("datalog.txt", FILE_WRITE);//начать запись
нужно внести внутрь скобок условия, иначе получается, что открываете Вы каждый раз, а закрываете только тогда, когда сработал Ваш импровизированный таймер.
Выполнено. Жду "критические 3,5мин".
"rectime" 30 сек - 10мин. полет нормальный
"rectime" 300сек - ждём... 2 успешных записи.
Круто!!! Работает!!!
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
2,990
895
Ну вот видите, при системном подходе - всё получается. :)
 

warsteiner

✩✩✩✩✩✩✩
1 Авг 2020
15
0
Ну чтож. Видимо теперь будет голова болеть про написание "читалки данных"