> Start > Schaltungen
 

OpenSeaMap Wassertiefe Datenlogger
Teil 5 - Logdatei fortlaufend nummerieren

Teil 5: Der Log-Dateiname wir fortlaufend neu nummeriert.

Wenn die Datei auf der SD Karte defekt oder beschädigt sein sollte, kann nicht weiter aufgezeichnet werden. Deshalb wird bei jedem Neustart ein neuer Dateiname erzeugt, das heisst jeden Tag eine neue Logdatei. Die Dateinummer wird im EEPROM gespeichert und bei jedem Neustart hochgezählt. Da nur ein Byte abgespeichert wird zählt der Dateiname von 1 bis 256 und fängt dann von vorn an.

Dazu habe ich ersteinmal mit einer neuen Programm nur zum Testen angefangen.
Die Arduino 1.0.5 Testdatei zum Download.

Hier der Arduino Programmcode der Testdatei:

// Dateinummer in EEPROM ablegen und hochzählen
//
// Matthias Busse 14.12.2013 Testversion 0.1

#include <SD.h> // SD Karten Library einbinden
#include <EEPROM.h> // EEPROM Library einbinden
const int chipSelect = 4;

String dateiname;
char cdateiname[13];

void setup()
{
  Serial.begin(4800);
//  EEPROM.write(0,256); // ggf. auf 1 setzen
  dateiname = getlogdateiname(0); // Dateinummer aus EEPROM lesen
  Serial.println(dateiname);
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("SD Karte nicht vorhanden");
  return;
  }
  Serial.println("SD Karte OK.");;
}

void loop()
{
  dateiname.toCharArray(cdateiname,13);
  File datei = SD.open(cdateiname, FILE_WRITE);
  if (datei) {
    datei.println("Hallo");
    datei.close();
  }  
  else {
    Serial.println("Fehler: Datei konnte nicht geoeffnet werden.");
  }
  delay(1000);
}

String getlogdateiname(int adr) {
// Dateinamen fortlaufend nummerieren 
// osm1.txt bis osm256.txt und dann wieder von vorne
// Nummer im EEPROM ablegen und beim Programmstart +1 erhöhen.
//
// Matthias Busse 14.12.2013 Version 0.1
  
  String name;
  char sb[4];
  int wert;
  
  wert = EEPROM.read(adr);
  wert++;
  EEPROM.write(adr, wert);
  name= "osm";
  itoa(wert, sb, 10);
  name += sb;
  name += ".txt";
  return name;
}

Das wird nun in die OSM Datei eingefügt.
Die fertige Arduino 1.0.5 Datei zum Download.

Hier der Arduino Programmcode mit Kommentaren:

// Projekt OpenSeaMap Daten Logger
//
// Teil 5 : Die Log-Dateinamen werden durch nummeriert
// Hardware:  
// GPS mit NMEA 0183 Datenausgang
// MAX232N: RS232 > USART Wandler, Pin 13 > 12 & 8 > 9
// 5 x 1uF Kondensatoren
// Arduino Uno
// Wireless SD Shield http://arduino.cc/en/Main/ArduinoWirelessShield
// MicroSD Karte (ich verwende hier eine 4GB MicroSD Karte)
//
// MOSI - pin 11
// MISO - pin 12
// CLK - pin 13
// CS - pin 4
//
// Matthias Busse 14.12.2013 Version 0.5

#include <SD.h> // SD Karten Library einbinden
#include <EEPROM.h> // EEPROM Library einbinden
#include <AltSoftSerial.h>
// Library von http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html
AltSoftSerial port2; // RX=8, TX=9

const int chipSelect = 4;
int inByte1, inByte2, start1=0, start2=0;
String nmea1 = "OSM Logger SD Karte schreiben, Version 0.4 Matthias Busse"; // reserv.
String nmea2 = "OSM Logger SD Karte schreiben, Version 0.4 Matthias Busse"; // reserv.
String dateiname;
char cdateiname[13];

void setup() {
  Serial.begin(4800); // 4800 Baud Dateneingang und Konsole
  port2.begin(4800);
  Serial.println(nmea1);
  dateiname = getlogdateiname(0); // Dateinummer aus EEPROM lesen
  Serial.println(dateiname);
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("SD Karte nicht vorhanden");
    return;
  }
  Serial.println("SD Karte OK.");
}

void loop() {
    if (Serial.available()) { // Sind Daten an Port 1 ?
    inByte1 = Serial.read(); // dann lesen
    if ((start1==0) && (inByte1 == '$')) {start1=1; nmea1="";} // bei $ starten
    if(start1==1) {nmea1.concat((char)inByte1);} // das Zeichen anhängen
    if((inByte1==13) && (start1==1)) { // CR > Datensatzende > NMEA ausgeben
      start1=0; 
      schreiben(nmea1);
    } 
  }
  if (port2.available()) { // Sind Daten an Port 2 ?
    inByte2 = port2.read(); // dann lesen
    if ((start2==0) && (inByte2 == '$')) {start2=1; nmea2="";} // bei $ starten
    if(start2==1) {nmea2.concat((char)inByte2);} // das Zeichen anhängen
    if((inByte2==13) && (start2==1)) { // CR > Datensatzende > NMEA ausgeben
      start2=0; 
      schreiben(nmea2);
    } 
  }
}  

void schreiben(String nmeawrite) { 
// Nur die gewünschten Datensätze rausschreiben.
// http://wiki.openstreetmap.org/wiki/DE:Water_Depth
// RMC, DPT, DBK, DBS, DBT

  if (nmeawrite.substring(3,6) == "RMC") { // $--RMC
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
  if (nmeawrite.substring(3,6) == "DPT") { // $--DPT
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
  if (nmeawrite.substring(3,6) == "DBK") { // $--DBK
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
  if (nmeawrite.substring(3,6) == "DBS") { // $--DBS
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
  if (nmeawrite.substring(3,6) == "DBT") { // $--DBT
    Serial.println(nmeawrite);
    schreibeSD(nmeawrite);
    return;
  } 
}

void schreibeSD(String nmeasd) {
// Einen Datensatz auf die SD Karte scheiben
//
// Matthias Busse 1.12.2013 Version 0.2

  dateiname.toCharArray(cdateiname,13);
  File datei = SD.open(cdateiname, FILE_WRITE);
  if (datei) {
    datei.println(nmeasd);
    datei.close();
  }  
  else {
    Serial.println("Fehler: Datei konnte nicht geoeffnet werden.");
  }
}

String getlogdateiname(int adr) {
// Dateinamen fortlaufend nummerieren 
// osm1.txt bis osm256.txt und dann wieder von vorne
// Nummer im EEPROM ablegen und beim Programmstart +1 erhöhen.
//
// Matthias Busse 14.12.2013 Version 0.1
  
  String name;
  char sb[4];
  int wert;
  
  wert = EEPROM.read(adr);
  wert++;
  EEPROM.write(adr, wert);
  name= "osm";
  itoa(wert, sb, 10);
  name += sb;
  name += ".txt";
  return name;
}

Das Projekt: Teil 4 < > Teil 6 folgt.

Fragen hierzu kann ich aus Zeitgründen nicht beantworten.
Hilfreiche Links sind: Arduino EEPROM Library

OpenSeaMap Wassertiefe Datenlogger
Teil 5 - Logdatei fortlaufend nummerieren

letzte Änderung 12.2013