Логгер на SD Карту

Тема в разделе "Arduino & Shields", создана пользователем maximil, 4 июл 2019.

Метки:
  1. maximil

    maximil Нуб

    Здравствуйте! Стоит задача писать данные с 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 сек.
    }
     
  2. b707

    b707 Гуру

    вы при каждом проходе программы все прибавляете и прибавлете новые порции к переменной date - и нигде ее не очищаете. Вот она и переполняется...
     
    arkadyf и maximil нравится это.
  3. maximil

    maximil Нуб

    Спасибо, а не подскажите как правильно отчистить?
     
  4. Max_dk

    Max_dk Нерд

    Может стоить заменить на:
    Код (C++):
    date = year()-2000; //год
     
    maximil и b707 нравится это.
  5. b707

    b707 Гуру

    интересно, а вы что-то - вообще в этом коде ничего не понимаете? стырили в инете? - сказали бы сразу, - я бы не стал тратить время
     
  6. parovoZZ

    parovoZZ Гуру

    что сделать???
     
  7. maximil

    maximil Нуб

    Спасибо! всё работает я когда местами переставлял год и дату случайно добавил лишний +
     
  8. maximil

    maximil Нуб

    Сегодня в час ночи осваивал строки) я бы стырил но не смог найти такое в сети) в итоге собирал сам. Убил сутки с датой в названии
    Спасибо вам!