Проблеммы с sd картой
- Войдите на сайт для отправки комментариев
Ср, 24/05/2017 - 11:53
Ребята такая штука. вот скетч записи данных с датчика температуры на сд карту., как бы все работает, но есть проблемам большая, если отключить/ включить питание данные уже перестают писаться на эту карту, и пишутся дальше только если я создам новый файл, как решить вопрос что бы продолжало запись после ребута?
#include "DHT.h" //библиотека датчика темп.
#include <SPI.h> //spi библиотека
#include <SD.h> //cд библиотека
#define DHTPIN 2 // пин датчика темп.
#define DHTTYPE DHT22 // тип датчика
DHT dht(DHTPIN, DHTTYPE);
File myFile;
void setup() {
Serial.begin(9600);
dht.begin();
while (!Serial) {
;
}
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
}
void loop() {
float t = dht.readTemperature();
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
myFile = SD.open("text.txt", FILE_WRITE);
myFile.println(String(t));
myFile.close();
delay (1000);
Не знаю, что за версия библиотеки SD у Вас. В некоторых для записи в конец существующего файла обязательно указывать O_APPEND при отрытии, (у Вас это 28 строка) в некоторых - не обязательно. Поройте в этом направлении.
Реализуете электронное включение-отключение питания, а не просто тумблером рвёте цепь.
Под "электронным" я имею ввиду то, что при сигнале отключения у Вас с МК не сразу снимается питание, а после выполнения нужных действий. В данном случае - закрываете файл, пишете в ЕЕПРОМ флаг, что нужно продолжать запись после ребута. При загрузке проверяете флаг и открываете файл, если это требуется.
Пример схемки. Я её уже делал - нормально работает.
Реализуете электронное включение-отключение питания, а не просто тумблером рвёте цепь.
Под "электронным" я имею ввиду то, что при сигнале отключения у Вас с МК не сразу снимается питание, а после выполнения нужных действий. В данном случае - закрываете файл, пишете в ЕЕПРОМ флаг, что нужно продолжать запись после ребута. При загрузке проверяете флаг и открываете файл, если это требуется. Пример схемки. Я её уже делал - нормально работает.
Из ненадежной пушки по воробьям. ЕвгенийП описал простой способ - открывать и писать в конец файла. Или при новом старте проверять существование файла , создавать новый с другим именени и писать в него.
Пытался создавать новые файлы используя датчик времени, что бы имя нового файла создавалось такое же какое сейчас время вот так
myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE);вместо
myFile = SD.open("test.txt", FILE_WRITE);но так ничего не создается
Скобки не допустимы в имени файла - подумайте над вашей командой myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE); еще.
[quote=partisanos]
Пытался создавать новые файлы используя датчик времени, что бы имя нового файла создавалось такое же какое сейчас время вот так
myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE);Заключив функцию в кавычки, то есть неявно инициализируя строку const char , вы пытаетесь создать файл с постоянным именем (rtc.getTimeStr()).txt
Преобразуйте время в строку при помощи ltoa(), добавьте в конце ".txt" и распечатайте для проверки через Serial.print(). Затем создавайте файл с оглядкой на длину имени и запреты некоторых символов типа наклонной черты и др. в имени файла
myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE);
Кавычки-то уберите.
Если он просто уберет кавычки, расширение ".txt" станет синтаксически неуместным для выражения. Можно убрать необязательное расширение имени файла или объединять эти две строки.
Я то подумал, что getTimeStr возвращет объект, у которого есть свойство txt :)
А так, да, конечно, объединять строки.