Как осуществить запись на SD карту в два (три) столбика?

Тема в разделе "Arduino & Shields", создана пользователем РоманИ, 15 мар 2016.

  1. РоманИ

    РоманИ Нерд

    Уважаемые форумчане! Столкнулся с проблемой. Записываются данные температуры в текстовый файл на СД карту. Одновременно записывается три показателя. Все в один столбик. неудобно в обработке. Как организовать запись в два(три) столбика?. Где можно почитать? Тыкните плиз.
     
  2. Sindbad

    Sindbad Гик

  3. Jeid

    Jeid Нерд

    Разделять значения символов табуляции \t
    Либо любым другим символов, например | или #
     
  4. РоманИ

    РоманИ Нерд

  5. РоманИ

    РоманИ Нерд

    а можно пример синтаксиса?
     
  6. Limoney

    Limoney Гик

    dataFile.print(dateString1) // столбик 1
    dataFile.print('\t')
    dataFile.print(dateString2) // столбик 2
    dataFile.print('\t')
    dataFile.print(dateString3) // столбик 3
    dataFile.print('\n'); // новая строка
     
    Последнее редактирование: 15 мар 2016
    РоманИ нравится это.
  7. AlexVS

    AlexVS Гик

    Зачем какие то столбики выдумывать?
    Пишите в csv формат, т.е. с разделителями, а потом в Exel_е обрабатывайте.
     
  8. РоманИ

    РоманИ Нерд

    Именно к этому я и иду, но у меня пока не получается. все печатает в одну колонку. С файлами .TXT вроде разобрался. Если можно напишите пожалуйста синтаксис для .csv-файлов.
     
  9. Sindbad

    Sindbad Гик

    https://ru.wikipedia.org/wiki/CSV
    print() используйте, а не println(), тогда не будет новой строки для каждого значения.
     
  10. AlexVS

    AlexVS Гик

    Кусок кода, пишущий в файл на SD
    Код (C++):
    String logData;
    // Запись показаний датчиков на SD карту
    void SavaData2SD()
    {
      File logFile;
      char FileName[13];
      String fName;

      fName = String(year());
      fName += TwoDigit(month());
      fName += TwoDigit(day());
      fName += ".csv";
      fName.toCharArray(FileName,13);

      CreateLogString();
      logFile = SD.open(FileName, FILE_WRITE);
      if (logFile)
      {
        logFile.println(logData);
        logFile.close();
      } else {
        // если файл не открылся
        tone(speakerPin, 300, 300);
      }
    }
    void CreateLogString()
    {
      logData = TwoDigit(hour());
      logData += ":";
      logData += TwoDigit(minute());
      logData += ":";
      logData += TwoDigit(second());
      logData += ",";
      logData += round(sensor.T1);
      logData += ",";
      logData += round(sensor.T2);
      logData += ",";
      logData += round(sensor.T3);
      logData += ",";
      logData += round(sensor.T4);
      logData += ",";
      logData += round(sensor.T5);
      logData += ",";
      logData += round(sensor.T6);
    }
    String TwoDigit(int value)
    {
      String v;
      if (value < 10)
        v = "0";
      else
        v = "";
      v += value;
      return v;
    }
    В результате в файл пишутся строки вида:
    Код (C++):
    21:18:16,35,37,23,25,22,23
    21:23:16,35,37,23,25,22,23
    21:28:16,35,37,23,25,22,23
    21:33:16,36,37,23,25,22,23
    21:38:16,35,37,23,26,22,23
    21:43:16,36,37,23,26,22,23
     
     
    Последнее редактирование: 16 мар 2016
    Paul_S и Securbond нравится это.
  11. РоманИ

    РоманИ Нерд

    Sindbad спасибо. я пробовал. пишет все в одну строчку, но дьявол в мелочах - всё в одной ячейке, а хотелось бы в разных.:)
    AlexVS и Вам спасибо за пример. попытаюсь понять что к чему. Ут меня сразу возникает вопрос. я привык к наличию Void setup и void loop. а куда воткнуть (простите) void SavaData2SD и void CreateLogString () понять не могу. можно ли расположить подобный (переработанный) кусок скетча в Void Loop () или после Loop () располагается отдельным блоком. у меня в скетче запись идет в конце программы в блоке Void Loop () и активируется в случае наступления времени Х.
    Код (C++):

      unsigned long currentMillis = millis();
        //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > interval)
       {
        // сохраняем время последнего переключения
        previousMillis = currentMillis;
        String dataString = rtc.getDateStr();
        String dataStringh = rtc.getTimeStr();
    //Serial.println(dataStringh);Serial.println(" затупили dataStringh");
        File dataFile = SD.open("log.txt",FILE_WRITE);

        if (dataFile)
         {
          dataFile.println(dataString);
          dataFile.println(dataStringh);
          dataFile.print("kollektor"); dataFile.print('\t'); dataFile.print(temps1);dataFile.print('\t');
          dataFile.print("roof");dataFile.print('\t'); dataFile.print(temps2);dataFile.print('\t');
          dataFile.print("veranda");dataFile.print('\t'); dataFile.print(temps3);dataFile.print('\t');
          dataFile.print("street"); dataFile.print('\t'); dataFile.print(temps4);dataFile.print('\t');
          dataFile.print("home"); dataFile.print('\t'); dataFile.print(temps5);dataFile.print('\n');
          dataFile.close();digitalWrite(record,LOW);    
          }
        }
    }
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Почитайте любую статью про структуру программы на С/С++ и про функции.
     
  13. Sindbad

    Sindbad Гик

    Я же идею подсказал, не ограничивайте себя в её развитии. Если хотите разделять пробелами, для просмотра в блокноте, вставляйте между командами вывода значений
    Код (C++):
    dataFile.print(" ");
    Если хотите запятые для формирования .csv, вставляйте
    Код (C++):
    dataFile.print(",");
    Если хотите знаки табуляции -
    Код (C++):
    dataFile.print("\t");
    Все функции равносильны, в т.ч. setup() и loop()
     
  14. AlexVS

    AlexVS Гик

    SavaData2SD() и CreateLogString () располагаете в теле скета, например после setup() и loop(), и вызываете SavaData2SD() из loop(), "в случае наступления времени Х".
    А вообще да, вам бы азы усвоить для начала.
     
  15. CutToSleep

    CutToSleep Нерд

    И потом .csv можно открыть тем же Экселем.
     
  16. AlexVS

    AlexVS Гик

    Это что, вопрос?
     
  17. CutToSleep

    CutToSleep Нерд

    Нет, это утверждение. Правда, при простом открытии иногда Эксель не всегда корректно отображает (возможно, другой разделитель какой-то ищет), поэтому лучше экспортировать через "Данные -> Из текста"
     
  18. AlexVS

    AlexVS Гик

    Только не понятно, зачем вы это написали, если это и так было сказано
     
  19. vvr

    vvr Инженерище

    как красивенько и понятно написан код у AlexVS и какая нечитаемая каша у вас:)
     
  20. РоманИ

    РоманИ Нерд

    это да! может быть освою. скажем осваиваю как могу :) я то информатику изучал ровно 26 лет назад:). тогда по другому немного было. строчки нумеровали goto, gosub а ежеле кому не понятно тогда Петрович (учитель информатики) на доске носом нарисует. ниче арканоид на Бейсике работал.

    А как вызвать SavaData из loop?
    да я представляю. я месяц- полтора как первый раз начал кнопку "компилирование". я еще структуру программы не до конца представляю вот по кусочкам собираю :)