Variablen über Datalogging schreiben und lesen?

Guten Morgen,

Ich sitze gerade an einem Projekt bei dem ich Sensordaten auslese und in einen string schreibe.
Diesen String speicher ich dann auf einer SD karte.

Für jede Messung wird also ein String gespeichert und eine Variable wird dabei als Zähler verwendet.

Jetzt möchte ich gerne die Messung unterbrechen, die SD karte entnehmen und die Daten auf den Pc übertragen. Anschließend die SD karte wieder in das Shield stecken und die Messung fortsetzen.

Problem hierbei: Der Zähler wird zurück gesetzt?

Kann ich den Zähler jedes mal auf der SD-Karte speichern und vor jedem Loop neu auslesen?
damit er erhalten bleibt?

void loop() {
  
  int Ini_1 = digitalRead(pinIni_1);
  int Ini_2 = digitalRead(pinIni_2);

  // Serial.println(Ini_1);
  //  Serial.println(Ini_2);
  if (Ini_1 == 0) {
    ++Zyklus_1;
    delay(wait);
    float LF = dht.readHumidity();
    float TP = dht.readTemperature();

    readDialGauge_1();
    decodeDialGauge();

    int units = digits[12];// 0=mm or 1=inch
    int decimal = digits[11];// 3 for mm and 5 for inch

    String info = " mm";
    if (units == 1 )
      info = " inch";

    String dataString = "M1,";
    dataString = dataString + Zyklus_1;
    dataString += ",";
    dataString += value;
    dataString += ",";
    dataString += LF;
    dataString += ",";
    dataString += TP;
 

    dataFile.println(dataString);

  }

  if (Ini_2 == 0) {
    ++Zyklus_2;
    delay(wait);
    float LF2 = dht.readHumidity();
    float TP2 = dht.readTemperature();



    readDialGauge_2();

    decodeDialGauge();
    int units = digits[12];// 0=mm or 1=inch
    int decimal = digits[11];// 3 for mm and 5 for inch


    String info = " mm";
    if (units == 1 )
      info = " inch";

    String dataString = "M2,";
    dataString = dataString + Zyklus_2;
    dataString += ",";
    dataString += value;
    dataString += ",";
    dataString += LF2;
    dataString += ",";
    dataString += TP2;

    dataFile.println(dataString);

  }

  while (digitalRead(pinIni_1) == 0 || digitalRead(pinIni_2) == 0) {
  }

  dataFile.flush();
  delay(100);

}

EEPROM-Speicher wird nicht reichen, da ich bis in die Mio. gehe mit den Zyklen.

92Rockstar:
EEPROM-Speicher wird nicht reichen, da ich bis in die Mio. gehe mit den Zyklen.

Hihi ... EEPROM war natürlich mein erster Gedanke.

Wie wär's, dem Arduino per Tastendruck bescheid zu geben, dass er den aktuellen Zählerstand ins EEPROM schreiben soll? Dann drückst Du die Taste halt und wechselst dann. Du musst den Zählerstand doch nicht bei jeder Änderung ins EEPROM schreiben(?)

Ansonsten: Wenn Du Strings auf SD-Karte speichern kannst, warum dann nicht auch eine Zahl? Zur Not benutzt Du halt itoa(), um einen C-String daraus zu machen und den zu speichern. Oder geht das nicht?

Gruß

Gregor (der noch nie mit Arduino+SD-Karte zu tun hatte)

Hallo,

Den Vorschlag mit dem Taster finde ich eigendlich gut, nur löst er das Problem nicht wirklich. Wenn Du 1Million mal den Zahler auf die SD Karte schreibst, dann sind das ja auch 1Milliion Messwerte , damit hättest Du das gleich Problem mit der SD Karte, oder ich habs was falsch verstanden. Eventuell kannst Du ja auch erst mal 100-200 Messwerte in ein Array schreiben und dann die zusammen einmal schreiben. Damit ist die Anzahl der Schreibzyklen entsprehend kleiner.

Heinz

Vielleicht könntest du den Arduino währenddessen weiter laufen lassen...?

Z.B. mit einem Taster ein Interrupt auslösen, darüber in eine Funktion außerhalb von Loop springen, in der du nur wartest, bis der Taster wieder gedrückt wird (z.B. wenn die Karte wieder drin ist), und dann gehts normal im Loop weiter...

Grüße, Benni

EDIT:
Natürlich muss es ein zweiter Taster oder eine andere Bedingung sein (Karte available oder so), mit einem Taster würde man ja immer wieder in die gleiche Interrupt Funktion springen...

Hallo,

du musst nur auf den Tastendruck hin eine klare Aktion folgen lassen.
Aktuellen Datensatz inkl. Zählerstand noch wegschreiben.
Oder generell den Datensatz inkl. Zählerstand schreiben.
SD Zugriff sperren, meinetwegen per Led anzeigen, Karte entnehmen.
Karte rein, Tastendruck, Led aus, weiter gehts ...

Warum der Zähler überhaupt genullt wird oder werden soll verstehe ich jedoch sowieso nicht.
Solange du den Arduino nicht ausschaltest wird nichts ohne dein zutun genullt. Außer du tust es.

Hi

Schau in die Beispiele - dort werden CSV-Files (Komma separierte Variablen ... oda so) - also Dateien, in Der die einzelnen Werte per Komma getrennt sind - Zeilenende CR/LF - erstellt.

Wenn EEprom nicht so töffte ist: FRam
Der kann beliebig oft in beliebiger Geschwindigkeit beschrieben und gelesen werden, ohne die Bedenkzeit des EEprom nach dem Schreiben.

Selber habe ich aber noch das Problem, daß LibreOfficeCalc (... Excel für Linux - gibt's aber auch für Win) mir die Daten - da Dezimal-Punkt - nicht als Komma-Werte interpretiert - hatte Das aber bisher nur sporadisch angegangen, auch Umwandlungsversuche per Terminal (also mit Linux-Werkzeugen, hat hier Nichts mit Arduino zu tun) waren bisher wenig erfolgreich.
Das Trennzeichen kann man auch anders wählen, z.B. ein Semikolon um dann die Punkte in Komma zu ändern - sollte aber auch nicht fruchten.
Bei mir sind's Temperaturen von ca. 20 Stück DS18B20, Die minütlich gespeichert werden.
(und noch NIE am PC ausgelesen wurden ... vermutlich ist die SD-Karte bereits randvoll und jeder Schreibzugriff wirft einen Error ... da sind die Beispiele leider auch etwas 'rudimentär')

MfG

PS: Das Nullen riecht nach einem Reset

Rentner:
Den Vorschlag mit dem Taster finde ich eigendlich gut, nur löst er das Problem nicht wirklich. Wenn Du 1Million mal den Zahler auf die SD Karte schreibst, dann sind das ja auch 1Milliion Messwerte ...

Naja, wenn jede Minute 1 x der Zählerstand auf die SD-Karte geschrieben würde (jede Minute wird das Ausschalten/SD-Wechseln „angekündigt“), wären nach 1 Mio. Minuten gut 277 Stunden rum, das sind immerhin 11 Tage. Mal ehrlich: Wer will jede Minute die SD-Karte wechseln?!

Das Schreiben der Messwerte in eine andere Datei ist davon ja erst mal unberührt.

Gruß

Gregor

Vielen Dank für die vielen Antworten.

Ja den reset habe ich manuell gemacht, da mein Programm nach dem entfernen und wieder einstecken der SD karte die Messwerte nicht mehr auf die SD schreibt.

Um das zu lösen müsste ich also den Code zum öffnen der Datei auf der SD karte mit in den void loop schreiben?

 dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (! dataFile) {
    Serial.println("error opening datalog.txt");
    // Wait forever since we cant write data
    while (1) ;

dieser steht momentan mit im void setup.

Ich probiere es mal aus

Hi

void ist NUR der Rückgabe-Typ der Funktion (setup() oder loop() ) - nämlich: Keiner/nicht vorhanden.

Auf meinen SD-Shields ist ein Kontakt vorhanden, Der 'auf eine eingelegte SD-Karte reagiert' - also kA, ob Der nur rein mechanisch irgendwas durchschaltet oder aktiv von 'egal Wem' gesetzt wird.

Damit könnte man zumindest ein Neu-Öffnen der SD-Karte auslösen.
Kurz vor dem Herausnehmen sollte man Diese auch geschlossen haben, sonst ist nicht sicher, ob Alles auf der SD-Karte angekommen ist.
Also einen Eject-Knopf vorsehen.
Man kann Diesen dann auch dafür verwenden, die neu eingelegte Karte wieder auf zu machen.

... denke, So werde ich Das angehen - klingt nämlich gar nicht so schlecht (bisher wird die SD-Karte nur bei entstromtem oder resettetem Arduino entnommen/gesteckt)

MfG

Problem Gelöst:

mit folgendem Codebaustein in meinem Loop konnte ich die SD-Karte entnehmen wieder einlegen und ohne reset des Arduinos weiter beschreiben.

    SD.begin(chipSelect);                           //SD begin an Pin Chiip Select
    dataFile = SD.open("datalog.txt", FILE_WRITE);  //öffnet Datalog.txt
    dataFile.println(dataString);                   //Schreibt String auf SD KARTE
    Serial.println(dataString);                     //Debugging
    dataFile.flush();                               //Beendet Schreibvorgang auf SD-KARTE

Also brauche ich meinen Zyklus nicht zwischenspeichern, solange der Arduino im betrieb ist.
Jetzt brauch ich nur noch eine Notfall-Stromversorgung