Проблеммы с sd картой

partisanos
Offline
Зарегистрирован: 24.05.2017

Ребята такая штука. вот скетч записи данных с датчика температуры на сд карту., как бы все работает, но есть проблемам большая, если отключить/ включить питание данные уже перестают писаться на эту карту, и пишутся дальше только если я создам новый файл, как решить вопрос что бы продолжало запись после ребута? 

 

#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);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, что за версия библиотеки SD у Вас. В некоторых для записи в конец существующего файла обязательно указывать O_APPEND при отрытии, (у Вас это 28 строка) в некоторых - не обязательно. Поройте в этом направлении.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

partisanos пишет:
как решить вопрос что бы продолжало запись после ребута?

Реализуете электронное включение-отключение питания, а не просто тумблером рвёте цепь.
Под "электронным" я имею ввиду то, что при сигнале отключения у Вас с МК не сразу снимается питание, а после выполнения нужных действий.  В данном случае - закрываете файл, пишете в ЕЕПРОМ флаг, что нужно продолжать запись после ребута. При загрузке проверяете флаг и открываете файл, если это требуется.
Пример схемки. Я её уже делал - нормально работает.

КашыLot
Offline
Зарегистрирован: 24.05.2017

OlegK пишет:
partisanos пишет:
как решить вопрос что бы продолжало запись после ребута?

Реализуете электронное включение-отключение питания, а не просто тумблером рвёте цепь.
Под "электронным" я имею ввиду то, что при сигнале отключения у Вас с МК не сразу снимается питание, а после выполнения нужных действий.  В данном случае - закрываете файл, пишете в ЕЕПРОМ флаг, что нужно продолжать запись после ребута. При загрузке проверяете флаг и открываете файл, если это требуется. Пример схемки. Я её уже делал - нормально работает.

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

 

partisanos
Offline
Зарегистрирован: 24.05.2017

Пытался создавать новые файлы используя датчик времени, что бы имя нового файла создавалось такое же какое сейчас время вот так 

myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE); 

вместо

 myFile = SD.open("test.txt", FILE_WRITE);

но так ничего не создается

JasKo
Offline
Зарегистрирован: 21.11.2015

Скобки не допустимы в имени файла - подумайте над вашей командой myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE); еще.

КашыLot
Offline
Зарегистрирован: 24.05.2017

[quote=partisanos]

Пытался создавать новые файлы используя датчик времени, что бы имя нового файла создавалось такое же какое сейчас время вот так 

myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE);

Заключив функцию в кавычки, то есть неявно инициализируя строку const char ,  вы пытаетесь создать файл с постоянным  именем  (rtc.getTimeStr()).txt 

Преобразуйте время в строку при помощи ltoa(), добавьте в конце ".txt" и   распечатайте для проверки через Serial.print(). Затем создавайте файл с оглядкой на длину имени и запреты некоторых символов типа наклонной черты и др.  в имени файла

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

partisanos пишет:

myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE); 

Кавычки-то уберите.

КашыLot
Offline
Зарегистрирован: 24.05.2017

ЕвгенийП пишет:
partisanos пишет:
myFile = SD.open("(rtc.getTimeStr()).txt", FILE_WRITE);
Кавычки-то уберите.
Если он просто уберет кавычки, расширение  ".txt" станет синтаксически неуместным для выражения. Можно убрать необязательное расширение имени файла или объединять эти две строки.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

КашыLot пишет:

Если он просто уберет кавычки, расширение  ".txt" станет синтаксически неуместным для выражения. Можно убрать необязательное расширение имени файла или объединять эти две строки.

Я то подумал, что getTimeStr возвращет объект, у которого есть свойство txt :)

А так, да, конечно, объединять строки.