Datenlogger schreibt nicht auf SD

Ich bastel gerade in einem Praktikum an einem Daten logger, dabei ist mir eine Besonderheit aufgefallen - die ich nicht verstehe und die mich leider etwas in meiner Arbeit behindert. Vielleicht kann mir ja jemand erklären was abläuft und mir helfen.

Um den wichtigsten Fragen vorzugreifen: IDE ist die 1.0.5, der Arduino ist ein Uno R3 mit einem Ardafruit Datalogging Shield mit SD und ner Dallas RTC. Ich benutze flush() um die Daten direkt zu speichern :). Ach und falls das was ausmacht der Serielle Port läuft bei 57600 Baud.

Ich habe auch schon ein wenig Erfahrung in Sachen Programmierung, allerdings primär Java und auch sehr rostig, da lange nicht genutzt.

Grundlegend tut das gute Stück was ich will, die Daten werden gelesen, bei Referenzmessungen stellen sie sich als genau raus und in der Regel werden sie auch auf die SD Karte geschrieben.

Ich gebe meine Daten für leichtere Fehleranalyse parallel Seriell und auf die SD Karte aus, das fällt zwar später weg, aber gerade ist es natürlich recht praktisch.
Anfangs ist mir folgendes Aufgefallen: Ich initialisiere meine csv Datei und die Serielle Ausgabe mit folgenden Zeilen um einen ordentlichen Kopf zu haben (in void setup):

//Header für Ausgabe - Spaltenüberschriften bei Serieller Ausgabe in Datei und Terminal müssen gleich sein!!
  dataFile.println("BIGAFLOW Kuevette");
  dataFile.print("Start der Messung:");
  dataFile.print(now.day(),DEC); dataFile.print("."); dataFile.print(now.month(),DEC); dataFile.print("."); dataFile.print(now.year(),DEC); dataFile.print(" "); dataFile.print(now.hour(),DEC); dataFile.print(":"); dataFile.println(now.minute(),DEC);
  dataFile.println("Zeit \t Tag \t Monat \t Jahr \t Bub/30s \t Bub/30s(f) \t Temperatur \t p \t i \t Size"); 
  
  //Header für Ausgabe 
  Serial.println("BIGAFLOW Kuevette 1.5");
  Serial.print("Start der Messung:");
  Serial.print(now.day(),DEC); Serial.print("."); Serial.print(now.month(),DEC); Serial.print("."); Serial.print(now.year(),DEC); Serial.print(" "); Serial.print(now.hour(),DEC); Serial.print(":"); Serial.println(now.minute(),DEC);
  Serial.println("Zeit \t Tag \t Monat \t Jahr \t Bub/30s \t Bub/30s(f) \t Temperatur \t p \t i \t Size");

Man sieht es ja schon am Kommentar, sobald ich bei den Header unterschiedliche Zeilen ausgebe (z.B. dt statt Zeit in der Seriellen-Ausgabe) schreibt er einfach nicht mehr auf die SD Karte, die Datei wird zwar erzeugt, ist aber komplett leer.

Das hat mich zwar gewundert, aber es ist ja nicht so ein großes Problem.
Nun habe ich begonnen die Ausgabe meiner Daten in eine Funktion mit For Schleife auszulagern, damit das ganze etwas ordentlicher aussieht (Speicherplatz spart man damit ja nicht gerade ^^), das ganze sieht so aus.

void Ausgabe(int St, int Min, int Se, int Tag, int Monat, int Jahr, long b1000, float b30, float v, float t, long p, int i) {
 float ausgabe[12] = {St, Min, Se, Tag, Monat, Jahr, b1000, b30, t, p, i, v};
 int dez[12] = {0,0,0,0,0,0,0,2,2,0,0,6}; //Länge der Ausgabe
 
 for (int x = 0; x < 2; x++) {
   Serial.print(ausgabe[x],0);
   dataFile.print(ausgabe[x],0);
   Serial.print(":");
   dataFile.print(":");
 }
 Serial.print(ausgabe[2], 0);
 dataFile.print(ausgabe[2], 0);
  
  for (int x = 3; x < 11; x++) {
   Serial.print("\t"); 
   dataFile.print("\t");
   Serial.print(ausgabe[x],dez[x]);
   dataFile.print(ausgabe[x],dez[x]);
   }
   Serial.print("\t"); 
   Serial.println(ausgabe[11],6);
   dataFile.print("\t"); 
   dataFile.println(ausgabe[11],6);
 }

Da ich gerade daran rumbastel, ist es etwas Kraut und Rüben eigentlich sollte bei allen prints dez[ x ], respektive dez[Zahl] (außerhalb der Schleifen) stehen. Trage ich überall direkt Zahlen ein, wie es momentan z.B. in der letzten Zeile gemacht wurde, läuft das tadellos. Allerdings sobald ich alle oder einen Teil der Ausgaben durch das integer array dez ersetze in dem meine Dezimalstellen stehen, wird das ganze wunderbar im Terminal ausgegeben, aber auf der SD Karte tut sich nichts.

Kann mir einer erklären, was hier überhaupt falsch läuft und mir einen Lösungsvorschlag unterbreiten?

Da du uns nicht den ganzen Sketch zeigst, vermute ich, dass das ganze deutlich größer ist, und du ein Problem mit den 2k RAM hast, die zu einem Großteil für die SD Library draufgehen.
Das Ganze geht nur halbwegs, weil der Compiler gleiche Texte nur einmal anlegt.
Mit 2 unterschiedlichen Headern hast du dann nicht genug RAM. (Meine Vermutung)

Eine Abhilfe ist, feste Texte nicht im RAM zu haben:
Such mal nach dem F-Makro Serial.print( F("Text im Flash") ); , PROGMEM, und wie man dem Compiler noch helfen kann, gleiche Texte nur einmal anzulegen.

Ja der Sketch ist sehr groß, da dort einige Libaries angesteuert werden :wink:

Dann werde ich mich mal schlau machen, dank dir für den Tipp :slight_smile:

Grosi:
Dann werde ich mich mal schlau machen, dank dir für den Tipp :slight_smile:

Kleiner Tipp:
Für Anwendungen, die mehr Speicher benötigen als ein UNO hat, gibt es die MEGA Boards. Die MEGA2560 Boards haben nicht nur mehr Ein- und Ausgänge, sondern auch mehr RAM-Speicher und mehr Flash-Programmspeicher als ein UNO.

Danke das ist ein super Tipp :roll_eyes: