Hallo,
ich habe mir aus einem Arduino Nano, einem neo gps modul, einen kleinen Nokia Display und einem SD-Kartenmodul ein Fahrtenbuch gebaut. Wenn ich mit meinem Auto durch die Gegend fahre speichert es alle 3 Sekunden GPS-Koordinaten, Uhrzeit u.s.w. auf einer SD-Karten. Auf dem Display wird u.a. die aktuelle Geschwindigkeit angezeigt. Das Ganze hängt am 12V Zigaretten Anschluss mit regulären 5V KFZ-Adapter und USB. Das Ganze habe ich jetzt schon 1-2 Jahre
Problem: Funktioniert an sich super, nur es kommt ab und zu mal vor, dass Fahrten nicht aufgezeichnet werden. Entweder die Fahrten werden komplett aufgezeichnet, dann ist meist alles gut oder ich finde gar keine Dateien für die Fahrt auf der SD-Karte.
Man könnte jetzt vermuten, dass die ganze Apparatur abgestürzt ist. Ist aber auf dem Display wird aber die ganze Fahrt über alles richtig ausgegeben. Es scheint also ein Problem zu sein was entweder das SD-Modul (Stromversorgung) oder die die SD-Library betrifft.
Die SD-Karte wird bei Fahrtbeginn auch erkannt, weil in setup() wird auf !SD.begin(chipSelect) getestet, ansonsten würde das Programm gar nicht starten.
Das Ganze ist auch sicher nicht ganz optimal programmiert, man könnte sicher auch ein paar Dinge anders machen. Ich weiß nicht was da hängt und was man evtl. als "Testparameter" einbauen könnte.
Hier Auszug aus dem Programm:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>
#include <NOKIA5110_TEXT.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
const int chipSelect = 10;
String fahrtID;
String dateiname;
unsigned long zeitstempel = 0;
unsigned long wartezeit;
float strecke = 0;
int start = 0;
int abtastrate = 1000;
double hoehe = 0;
double gefaelle = 0;
NOKIA5110_TEXT mylcd(2, 9, 8, 6, 7);
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup()
{
Serial.begin(9600);
delay(10);
pinMode(5, OUTPUT); //PIN für Hintergrundbeleuchtung des Displays. Wird in bestimmten Situationen an-/ausgeschaltet geschaltet, z.B. wenn SD-Test nicht erfolgreich war damit ich das optisch durch ein leuchtendes Display mitbekomme.
delay(10);
mylcd.LCDInit(inverse, contrast, bias); // LCD initialisierung
mylcd.LCDClear(0x00); // Display löschen
mylcd.LCDFont(FontNumber); // Schriftart setzen
printLCD("Warte auf", "SD-Karten", "Test"); //Anzeige, dass jetzt SD-Karte getestet wird
digitalWrite(5, HIGH);
delay(500);
if (!SD.begin(chipSelect))
{
while (1); //Wenn SD nicht erkannt wird, dann wird auf dem Display "Warte auf SD-Karten Test" angezeigt und ich weiß, dass es ein Problem gibt.
}
delay(500);
printLCD("Warte auf", "GPS-Signal", "");
ss.begin(GPSBaud);
delay(1000);
wartezeit = millis();
digitalWrite(5, LOW);
}
....
//Der Programmteil der die Zeichenkette definiert, die alle paar Sekunden auf der SD-Karte gespeichert wird. Ich erstelle einmal eine .txt für jede Fahrt, da kann ich gezielter kontrollieren oder etwas nachschauen. Der gleiche Datensatz wird aber noch mal in "GPSLOG.txt" erstellt, wo dann die Datensätze von allen Fahrten gespeichert werden. Die GPSLOG.txt wird einmal in der Woche in die Datenbank importiert.
String datensatz = "(" + String(fahrtID) + ",'" + gps.date.year() + "-" + gps.date.month() + "-" + gps.date.day() + " " + gps.time.hour() + ":" + gps.time.minute() + ":" + gps.time.second() + "'," + String(gps.location.lat(), 6) + "," + String(gps.location.lng(), 6) + "," + gps.speed.kmph() + "," + gps.altitude.meters() + "," + gps.satellites.value() + "," + String(strecke/1000,2) + "),";
//Serial.println(datensatz);
if(geschwindigkeit >=1)
{
schreibeSD(SD.open(dateiname, FILE_WRITE), datensatz);
delay(50);
schreibeSD(SD.open("GPSLOG.txt", FILE_WRITE), datensatz);
delay(50);
}
else
{
//Serial.println("geschwindigkeit zu gering");
delay(100);
}
//Hier der Teil wo dann eigentlich auf die SD-geschrieben wird
void schreibeSD(File file, String datensatz)
{
if (file)
{
file.println(datensatz);
file.close();
}
}
I