Здравствуйте! Стоит задача писать данные с 5-7 датчиков каждые 3 секунды. Название файла это дата, а в файле пишется время и сами данные. После войны с строками и массивами вроде работает но определённое время потом вылетает "Не удалось открыть файл журнала". Где ошибка? почему перестаёт открывать? как исправить? если менять время задержки меняется время вылета ошибки Код (C++): setSyncProvider(RTC.get); //запрос данных с модуля часов date += year()-2000; //год //date += ","; if (month() < 10) date += "0"; date += month(); //месяц //date += ","; if (day() < 10) date += "0"; date += day(); //день char charBuf[7]; date.toCharArray(charBuf, 7); Serial.println(charBuf); // Открываем файл и записываем в него данные File dataFile = SD.open(charBuf, FILE_WRITE); if (dataFile) { if(hour()<10){dataFile.print(0);} dataFile.print(hour()); В порт выдаёт: 000027 29.00C,29.00%. 191231 000028 29.00C,29.00%. 191231 000029 29.00C,29.00%. 191231 Couldn't open log file 191231 Couldn't open log file 191231 Couldn't open log file Спойлер: Весь код Код (C++): #include <SD.h> // Подключаем библиотеку SD #include <dht11.h> #include <Time.h> #include <DS1307RTC.h> #define DHT11PIN 9 dht11 DHT11; #define CS_PIN 4 // Контакт выбора int y,m,d; String date; void setup() { Serial.begin(115200); // Инициализация последовательного соединения на скорости 9600 бод //setSyncProvider(RTC.get); // получаем время с Serial.println("Initializing Card"); // Распечатываем в мониторе последовательного порта "Initializing Card"("Инициализация карты") pinMode(CS_PIN, OUTPUT); // Определяем CS(контакт выбора) контакт как выход setSyncProvider(RTC.get); // получаем время с RTC if (timeStatus() != timeSet) Serial.println("Unable to sync with the RTC"); //синхронизация не удалась else Serial.println("RTC has set the system time"); //установим вручную 16.02.2016 12:53 TimeElements te; te.Second = 10; //секунды te.Minute = 59; //минуты te.Hour = 23; //часы te.Day = 31; //день te.Month = 12; // месяц te.Year = 2019 - 1970; //год в библиотеке отсчитывается с 1970 time_t timeVal = makeTime(te); RTC.set(timeVal); setTime(timeVal); // Инициализация SD-карты if (!SD.begin(CS_PIN)) { Serial.println("Card Failure"); // Распечатываем в мониторе последовательного порта "Card Failure"("Сбой подключения к SD-карте") return; // Останавливаем выполнение программы } Serial.println("Card Ready"); // Распечатываем в мониторе последовательного порта "Card Ready"("Карта готова к работе") } void loop() { int chk = DHT11.read(DHT11PIN); //String filename = (String)y + (String)m + (String)d; //String.toCharArray(charBufVar, 20); setSyncProvider(RTC.get); //запрос данных с модуля часов date += year()-2000; //год //date += ","; if (month() < 10) date += "0"; date += month(); //месяц //date += ","; if (day() < 10) date += "0"; date += day(); //день char charBuf[7]; date.toCharArray(charBuf, 7); Serial.println(charBuf); // Открываем файл и записываем в него данные File dataFile = SD.open(charBuf, FILE_WRITE); if (dataFile) { if(hour()<10){dataFile.print(0);} dataFile.print(hour()); if(minute()<10){dataFile.print(0);} dataFile.print(minute()); if(second()<10){dataFile.print(0);} dataFile.print(second()); dataFile.print(" "); dataFile.print((unsigned char)DHT11.temperature); dataFile.print("C,"); dataFile.print((unsigned char)DHT11.humidity); dataFile.println("%."); //file.println(a); dataFile.close(); // Внимание! Данные не будут записаны, пока вы не закроете соединение! // Распечатываем в мониторе последовательного порта те же данные для отладки if(hour()<10){Serial.print(0);} Serial.print(hour()); if(minute()<10){Serial.print(0);} Serial.print(minute()); if(second()<10){Serial.print(0);} Serial.print(second()); Serial.print(" "); Serial.print((float)DHT11.temperature); Serial.print("C,"); Serial.print((float)DHT11.humidity); Serial.println("%."); // Serial.println } else { Serial.println("Couldn't open log file"); // Распечатываем в мониторе последовательного порта "Couldn't open log file"("Не удалось открыть файл журнала") } delay(1000); // Задержка 5 сек. }
вы при каждом проходе программы все прибавляете и прибавлете новые порции к переменной date - и нигде ее не очищаете. Вот она и переполняется...
интересно, а вы что-то - вообще в этом коде ничего не понимаете? стырили в инете? - сказали бы сразу, - я бы не стал тратить время
Сегодня в час ночи осваивал строки) я бы стырил но не смог найти такое в сети) в итоге собирал сам. Убил сутки с датой в названии Спасибо вам!