Go Down

Topic: Gpsdaten auf Sd karte loggen (Read 1 time) previous topic - next topic

Chillkroete

Moinsen!
Ich bin relativ neu im Umgang mit den Arduino und hab ein paar fragen.
Code: [Select]
#include <nmea.h>
#include <SoftwareSerial.h>

#define rxPin 9
#define txPin 3
// create a GPS data connection to GPRMC sentence type
NMEA gps(GPRMC);
SoftwareSerial portOne(rxPin, txPin);
void setup() {
  Serial.begin(9600);
  portOne.begin(9600);
}
String dataString = "";
void loop() {
  if (portOne.available() > 0 ) {
    // read incoming character from GPS
    char c = portOne.read();

    // check if the character completes a valid GPS sentence
    if (gps.decode(c)) {
      // check if GPS positioning was active
      dataString = gps.sentence();
      delay(10);
      Serial.print(dataString);
    }
  }
}


Ausgabe ist wunderbar:
$GPRMC,095453.00,V,,,,,,,270412,,,N*71$GPRMC,095453.99,V,,,,,,,270412,,,N*71$GPRMC,095455.00,V,,,,,,,270412,,,N*77$GPRMC,095456.00,V,,,,,,,270412,,,N*74$GPRMC,095456.99,V,,,,,,,270412,,,N*74$GPRMC,095458.00,V,,,,,,,270412,,,N*7A$GPRMC,095459.00,V,,,,,,,270412,,,N*7B$GPRMC,095459.99,V,,,,,,,270412,,,N*7B$GPRMC,095501.00,V,,,,,,,270412,,,N*77$GPRMC,095502.00,V,,,,,,,270412,,,N*74$GPRMC,095502.99,V,,,,,,,270412,,,N*74$GPRMC,095504.00,V,,,,,,,270412,,,N*72$GPRMC,095505.00,V,,,,,,,270412,,,N*73$GPRMC,095505.99,V,,,,,,,270412,,,N*73$GPRMC,095507.00,V,,,,,,,270412,,,N*71

Ich befinde mich im Raum, deswegen nur so halbe GPS Daten...
Jetzt möchte ich diese daten auf Sd-Karte wegspeichern.
Code: [Select]

#include <nmea.h>
#include <SoftwareSerial.h>
#include <SD.h>

#define rxPin 9
#define txPin 3
// create a GPS data connection to GPRMC sentence type
NMEA gps(GPRMC);
SoftwareSerial portOne(rxPin, txPin);
const int D1_PIN = A1;
const int D2_PIN = 4;
const int chipSelect = 10;
void setup() {
  pinMode(D1_PIN, OUTPUT);
  pinMode(D2_PIN, OUTPUT);
  Serial.begin(9600);
  portOne.begin(9600);
  Serial.print("Initializing SD card...");
 
  pinMode(10, OUTPUT);
   digitalWrite(D1_PIN, HIGH);
  if (!SD.begin(chipSelect)) {
    digitalWrite(D1_PIN, LOW);
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
}

void err_out(int err_code){
  digitalWrite(D1_PIN, HIGH);
  digitalWrite(D2_PIN, LOW);
  while(true){
    delay(1000);
    for(int i=0; i < err_code; i++){
      digitalWrite(D2_PIN, HIGH);
      delay(200);
      digitalWrite(D2_PIN, LOW);
      delay(200);
    }
  }
}
unsigned long count = 0;
String dataString = "";
void loop() {
  if (portOne.available() > 0 ) {
    // read incoming character from GPS
    char c = portOne.read();

    // check if the character completes a valid GPS sentence
    if (gps.decode(c)) {
      // check if GPS positioning was active
      dataString = gps.sentence();
      delay(10);
      Serial.print(dataString);
      File myFile = SD.open("test.txt", FILE_WRITE);
     
      if (myFile) {
    digitalWrite(D1_PIN, LOW);
    digitalWrite(D2_PIN, HIGH);
    delay(30);
    Serial.println("Writing to test.txt...");
    myFile.println(dataString);
    // close the file:
    myFile.close();
    count++;
  }
  else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
    err_out(1);
  }
 
    }
  }
  if(count == 10){
    while(1) delay(1000); // stop it already
  }
}

Ausgabe :
Initializing SD card...  initialization done. 
Initializing SD card...  initialization done. 
Initializing SD card...  initialization done. 
Initializing SD card...  initialization done. 
Dabei dachte ich, dass void setup() immer nur genau einmal ausgeführt wird. Wie kann es dann, dass er das void setup() als schleife durchläuft?
Hoffe ihr könnt mir helfen..

Dieses Sd karten breadboard benutze ich:
http://www.olimex.com/dev/OTHER/MOD-SDMMC/MOD-SD_MMC.pdf

mkl0815

Sieht so aus, als würde Dein Arduino resets bekommen / ausführen, denn dann wird jedesmal wieder die setup() aufgerufen.
Wie schnell hintereinander kommen denn die Ausgaben?

danimath

Nur so'n Schuss ins Blaue: versorgst Du das Ganze nur über USB mit Strom, oder hast Du 'ne externe Stromversorgung? Ich hatte so einen Effekt mal, weil das ganze angeschlossen Zeugs zu viel Strom gezogen hat, und dann die Spannung zusammengebrochen ist. USB liefert nicht sooo viel.

viele Grüße
Andreas
http://danimathblog.blogspot.com

#define true '/'/'/'
#define false '-'-'-'

Chillkroete

Darüber hab ich auch schon nachgedacht.. Die Werte kommen ca. jede Sekunde.. Ich hab mir ein standalone arduino mit dem 328p nachgebaut. Ich habe den Bootloader mit meine avrispmkII drauf gepackt und so war dann ein delay(1000) auch eine sekunde Verzögerung. Ich habe den reset taster nicht implementiert, somit kann es auch nicht daran liegen. Kann mir nicht erklären, wie es zu einem reset kommen kann..

Ps: externe Stromversorgung

Chillkroete


Darüber hab ich auch schon nachgedacht.. Die Werte kommen ca. jede Sekunde.. Ich hab mir ein standalone arduino mit dem 328p nachgebaut. Ich habe den Bootloader mit meine avrispmkII drauf gepackt und so war dann ein delay(1000) auch eine sekunde Verzögerung. Ich habe den reset taster nicht implementiert, somit kann es auch nicht daran liegen. Kann mir nicht erklären, wie es zu einem reset kommen kann..

Ps: externe Stromversorgung
Code: [Select]

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  This example code is in the public domain.
*/

void setup() {               
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(2, LOW);    // set the LED off
  delay(1000); 
  Serial.begin(9600);
  Serial.println("hallo");
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}


recht einfach und funktioniert. Led blink einmal auf und geht wieder aus. Seriellen Monitor zeigt einmal "hallo" an und danach blink die andere Led die ganze Zeit.

kann es denn an der Sd.h liegen? Am Anfang fande ich die Arduinos noch ganz cool, da alles recht einfach und schnell zu implementieren ist, allerdings finde ich verliert man schnell den Überblick bei der Fehlersuche. Nach diesem Projekt werde ich wohl wieder auf die normalen AVR´s um switchen und in C proggn. Da kann ich mir meine eigenen Routinen erstellen und steig da besser durch.

Go Up