> Start > Schaltungen
 

OpenSeaMap Wassertiefe Datenlogger
Teil 3 - Auf eine SD Karte schreiben

Teil 3: Die ausgewählten NMEA Datensätze sollen nun auf eine SD Karte geschrieben werden.

Dazu wird das Arduino Wireless SD Shield auf dem Arduino Uno verwendet. Die SD Karten Library vom Arduino wird eingebunden, das vereinfacht die Sache erheblich. Ich verwende hier eine 4GB Micro SD Karte (Hinweise).

Uno + SD Shield + MAX232

Die Daten werden in die Datei osm.txt in das Hauptverzeichnis der SD Karte geschrieben, neue NMEA Daten werden hinten angehängt.

Pro Tag kommen so ca. 15 MB an Daten zusammen, wenn jede Sekunde der RMC und ein Tiefendatensatz geschrieben werden. Bei meiner 4GB Karte reicht das also für eine ca. 260 Tage durchgehende Aufzeichnung.

Die fertige Arduino 1.0.5 Datei zum Download.

Hier der Arduino Programmcode mit Kommentaren:

// Projekt OpenSeaMap Daten Logger
//
// Teil 3 : Datensätze auf eine SD Karte schreiben
// Hardware:  
// GPS mit NMEA 0183 Datenausgang
// MAX232N: RS232 > USART Wandler
// 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 1.12.2013 Version 0.3

#include <SD.h> // SD Karten Library einbinden

const int chipSelect = 4;
int inByte, start=0;
String nmea = "OSM Logger SD Karte schreiben, Version 0.3 Matthias Busse"; // reservieren

void setup() {
  Serial.begin(4800); // 4800 Baud Dateneingang und Konsole
  Serial.println(nmea);
  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 im Eingangspuffer
    inByte = Serial.read(); // dann lesen
    if ((start==0) && (inByte == '$')) {start=1; nmea="";} // bei $ starten
    if(start==1) {nmea.concat((char)inByte);} // das Zeichen anhängen
    if((inByte==13) && (start==1)) { // CR > Datensatzende > NMEA ausgeben
      start=0; 
      schreiben();
    } 
  }
}  

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

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

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

  File datei = SD.open("osm.txt", FILE_WRITE);
  if (datei) {
    datei.println(nmea);
    datei.close();
  }  
  else {
    Serial.println("Fehler: Datei konnte nicht geöffnet werden.");
  }
}

Das ist die Konsolenausgabe wenn alles funktioniert. Jede Sekunde kommt ein neuer Datensatz.

OSM Logger SD Karte schreiben, Version 0.3 Matthias Busse
SD Karte OK.
$GPRMC,145921.303,A,5415.6257,N,01004.9792,E,000.0,000.0,011213,002.0,E*63
$GPRMC,145922.304,A,5415.6257,N,01004.9793,E,000.0,000.0,011213,002.0,E*66
$GPRMC,145923.301,A,5415.6257,N,01004.9793,E,000.0,000.0,011213,002.0,E*62

Die Daten werden auf der SD Karte in der Datei osm.txt abgelegt. Diese Datei kann nach der Reiseauf den PC geladen werden und an OpenSeaMap geschickt werden.

$GPRMC,145921.303,A,5415.6257,N,01004.9792,E,000.0,000.0,011213,002.0,E*63
$GPRMC,145922.304,A,5415.6257,N,01004.9793,E,000.0,000.0,011213,002.0,E*66
$GPRMC,145923.301,A,5415.6257,N,01004.9793,E,000.0,000.0,011213,002.0,E*62
$GPRMC,145924.303,A,5415.6256,N,01004.9794,E,000.0,000.0,011213,002.0,E*61

Das Projekt: Teil 2 < > Teil 4

Fragen hierzu kann ich aus Zeitgründen nicht beantworten.
Hilfreiche Links sind: Arduino Wireless SD Shield, Hinweise zu SD Karten.

OpenSeaMap Wassertiefe Datenlogger
Teil 3 - Auf eine SD Karte schreiben

letzte Änderung 12.2013