ESP32 и SD-карта, сохранение данных с датчиков

DakonS

✩✩✩✩✩✩✩
2 Фев 2023
34
5
Есть задача: Реализовать сохранение данных с датчиков с сохранением времени в данный момент времени. По сути - это просто логи.

Вроде бы простая задача, полно скетчей, но есть проблема.


Касательно аппаратной части:

  • ESP32 devkit v1
  • Модуль для записи данных на SD: MH-SD Card Module HW-203
  • SD-карта: Kingston Canvas Select Plus SDHC (SDS2/32GB), UHS-I, U1, class 10

Работаю в среде ардуино через PlatformIO

Использую следующий скетч:
Скетч:
#include <SPI.h>
#include <SD.h>

const int chipSelect = 4; // Пин CS (Chip Select) для SD-карты
File dataFile;            // Объект для работы с файлом на SD-карте

float getData();

void setup()
{
  // Инициализация SD-карты
  Serial.begin(115200);
  if (!SD.begin(chipSelect))
  {
    Serial.println("Ошибка инициализации SD-карты.");
    while (1)
      ;
  }

  // Открытие файла на запись
  dataFile = SD.open("/data.txt", FILE_WRITE);

  dataFile.println("time,data");


  dataFile.println("16574,4");
  dataFile.println("16574,4");
  dataFile.println("16574,4");
  dataFile.println("16574,4");
  dataFile.println("time,data");

  dataFile.close();

  dataFile = SD.open("/data.txt", FILE_WRITE);

  dataFile.println("000.0033");

  dataFile.close();

}

void loop()
{
}


То, что я сейчас пишу в скетче - не важно. В дальнейшем я просто буду фиксировать данные с датчиков.



Какая, собственно, проблема возникает.


Исходя из скетча должен сохраниться файл data.txt

Со следующим содержанием:

time,data
16574,4
16574,4
16574,4
16574,4
time,data
000.0033

Но по итогу на SD карте файл data.txt c одной строчкой в которой написано:
000.0033


Путём комбинаций кода я понял, что строка
Кусочек:
dataFile = SD.open("/data.txt", FILE_WRITE);
просто обнуляет файл и начинает запись с нуля.


Вопрос прост. В чём проблема, как пофиксить?)
 

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

★★★★★★✩
23 Сен 2019
2,413
978
58
Марий-Эл
Если открываете файл один раз, на запись, будет добавляться инфа. Если открываете после закрытия, нужно открывать на добавление, а не повторное создание.
 

DakonS

✩✩✩✩✩✩✩
2 Фев 2023
34
5
@poty, Да, я прописываю dataFile.close() после записи информации в файл

@DakonS,

Здесь как раз написано, что mode может быть либо FILE_READ либо FILE_WRITE1693418925277.png
 
Изменено:

DakonS

✩✩✩✩✩✩✩
2 Фев 2023
34
5
Нашел решение проблемы.
Нужно использовать mode: FILE_APPEND, вместо того, чтобы юзать FILE_WRITE.


Chat gpt помог.. Вот его ответ.


Проблема возникает из-за того, что вы каждый раз, когда вызываете dataFile = SD.open("/data.txt", FILE_WRITE);, открываете файл для записи в режиме FILE_WRITE, что очищает содержимое файла и начинает запись с нуля. Таким образом, вы постоянно перезаписываете файл.

Если вы хотите добавлять данные к существующему файлу, то вам нужно открывать файл в режиме FILE_APPEND, который позволит добавлять данные в конец файла, не затирая его содержимое.