Логгер данных на sd карту (gps логгер)

pixel28
Offline
Зарегистрирован: 23.11.2015

Собственно есть код gps логгера на NEO 6MV. Данные записывает при включении на sd карту. Создается файл LOG.GPS и все что приходит в виртуальный serial записывается на карту. Если этот файл уже есть, дописывается в него. 

Как сдедать так, что при каждом включении будет создаваться новый файл (LOG1.GPS ; LOG2.GPS и т.д)?

 

#include <SoftwareSerial.h> 
#include <SD.h>
SoftwareSerial mySerial(2, 3);  //сюда gps модуль 
File GPS;
char buf[128];
byte bufSize;
bool waiting = true;
void setup() {
  delay(800);
  pinMode(4, OUTPUT);
  while (!SD.begin()) {
digitalWrite(4,HIGH);  delay(100);
digitalWrite(4,LOW); delay(100);
digitalWrite(4,HIGH);  delay(100);
digitalWrite(4,LOW); delay(300);
  }
  GPS = SD.open("LOG.GPS", FILE_WRITE);
  if (!GPS)
    while (true) {                        
digitalWrite(4,HIGH);  delay(100);
digitalWrite(4,LOW); delay(100);
digitalWrite(4,HIGH);  delay(100);
digitalWrite(4,LOW); delay(300);
    }
  mySerial.begin(38400); // скорость GPS порта
  Serial.begin(57600); //скорость порта 
  digitalWrite(4,HIGH);
}
void loop() {
  digitalWrite(4,LOW);
  while (mySerial.available()) {
    bufSize = mySerial.readBytesUntil('\n', buf, 128);
    if (waiting) {
      if (bufSize > 70) {
        waiting = false;
        
        GPS.write(buf, bufSize);
        Serial.println(buf);  
      }
    } else if (bufSize > 0)
      GPS.write(buf, bufSize);
      Serial.println(buf);
      digitalWrite(4,HIGH);
  }
  GPS.flush();
}

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Писать номер файла в ЭСППЗУ, при включении считывать номер, инкрементировать и создавать новый файл, куда и писать лог. Сохранить в ЭСППЗУ текущий номер файла.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Ну что за бред ?  А чистую карту вставили ?

Не изящней ли, в цикле выполнить SD.exists("LOGxx.GPS")? где хх число от 0 до (сколько хватит фантазии), главгное не переборщить.

если файла нет, создаем его и пишем в него, есть один косяк, если есть файлы LOG0.GPS-LOG3.GPS и LOG5.GPS-LOG9.GPS

при таком подходе начнем писать в файл LOG4.GPS

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Предлагаю вам не так резко высказывать своё мнение. Мой метод не претендует на 100% надёжность и помехозащищённость, но ТС не указывал, что карты будут меняться...а так можно дойти и до учитывания влияния ветра на Марсе...нет предела совершенству.

Мой метод, в условиях ограниченной защищённости, займёт меньше памяти и выполнится быстрее. Нет перебора десятков (а возможно десятков тысяч) файлов-с.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Да, ладно, не обижайтесь.

Еще идея: 

В сетапе дожидаемся GPS потока, выдергиваем из него дату и время, упаковываем их в DWORD и создаем файл с уникальным именем. будет что то типа "013E55AF.LOG".

drop
Offline
Зарегистрирован: 23.08.2017
Может кому и пригодится, хоть и старый пост. Разбираюсь с ардуино первые недели(поэтому возможно и топорно),реализовал вот так.    
 
 
int NoFile = 0;                    // Порядковый номер файла  
String NameFile ="Cap_";   // Переменная с названием файла без порядкового номера
String NameFileFull ="";     // Переменная для полного название файла с порядковым номером
 
void setup()
   {
      NameFileFull = NameFile +  String(NoFile, DEC)+ ".crv";  //формируем название файла,вначале он будет Cap_0
      while (SD.exists(NameFileFull))    //ищем последний порядковый номер
     {
       NoFile++;
       NameFileFull = NameFile +  String(NoFile, DEC)+ ".crv"; //формируем название файла
      }
   }
b707
Offline
Зарегистрирован: 26.05.2017

Не вижу, чем ваш метод отличается от предложенного в #2.