Daten Schreiben auf SD Karte bricht nach ca 170 Datensaetzen ab

Liebes Forum,

ich habe hier ein kleines Datenloggerprogramm, bei dem ich die Lade- und Entladekurve meines Rasenmäherakkus aufzeichnen möchte. Der Aufbau mit Stromsensor ACS712, LCD 16x2 und SD Karte (levelshifted) funktioniert. Erstmal... Die Daten werden gemessen, erfasst und als jeweiliger Datensatz auf die SD Karte geschrieben. Allerdings bei so ca. 150- 180 Datensätzen ist dann Schluss. Die SD Karte schreibt nicht mehr, die Messungen laufen aber unauffällig weiter und ich kann den Fortschritt am LCD sehen. Was ich einzig bei der SD Karte feststelle, ist dass bei anscheinend funktionierenden Schreibvorgang die LED auf dem Modul kurz aufblinkt, während nachdem das Schreiben scheinbar nicht mehr funktioniert diese LED wesentlich länger leuchtet.
Alles mit Arduino NANO realisiert. Kompilermeldungen für mich unauffällig: Der Sketch verwendet 17104 Bytes (55%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 1522 Bytes (74%) des dynamischen Speichers, 526 Bytes für lokale Variablen verbleiben.

Vielleicht wieder einmal ein Kapazitätsproblem? Aber warum schreibt er dann die 150 Datensätze???
Ich hoffe auf eure Hilfe.


```
#include <Arduino.h>
#include <SD.h>
#include <SPI.h>

#define chipSelect 10
File StromXX;

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

bool measuring = false;
unsigned int zaehler = 0;
const int PinLED = 7;      //Gruene LED
const int PinLED_Stop = 8; //blaue LED

//Messdatenermittlung mit ACS712
const int ACS712_Pin = A0;
const float vRef = 4.99;  //Spannung mit DMM Multimeter (Aref zu GND) gemessen. vRef = 5.0 bei 12V Spannungsquelle
float rawVoltage = 0;
float current = 0;
const float zeroCurrentValue = 510.8;
static unsigned long zeitgeber = 0;  //globale Variable, wird nur einmal angelegt , verhält sich wie eine lokale Variable
unsigned long zeitgeberCount = 0;

const int button1Pin = 5; // Pin für Taster 1
const int button2Pin = 6; // Pin für Taster 2       //hier nur fuer diesen Taster

int button1State = HIGH; // Aktueller Zustand von Taster 1
int button2State = HIGH; // Aktueller Zustand von Taster 2

int button1PreviousState = HIGH; // Vorheriger Zustand von Taster 1
int button2PreviousState = HIGH; // Vorheriger Zustand von Taster 2

unsigned long button1PressStartTime = 0; // Startzeit des Taster-Drucks von Taster 1
unsigned long button2PressStartTime = 0; // Startzeit des Taster-Drucks von Taster 2

const unsigned long debounceDelay = 50; // Entprellungsverzögerung (in Millisekunden)
const unsigned long longPressDelay = 1000; // Zeit für langen Tasterdruck (in Millisekunden)

int counter = 0; // Variable zum Hoch- und Herunterzählen
bool button2LongPressDetected = false; // Flag für erkannten Long-Press von Taster 2
bool freigabe = true;

void header() {
  StromXX = SD.open("Strom_2.csv", FILE_WRITE);      //Schreiben der HeaderZeile
  if (StromXX) {
    StromXX.print("Strommessung mit ACS712 (5-Ampere) Sensor");
    StromXX.print("Messung");
    StromXX.print(",");
    StromXX.print(" Volt[RAW]");
    StromXX.print(",");
    StromXX.print(" Volt[V]");
    StromXX.print(",");
    StromXX.print("Strom[mA]");
    StromXX.print(",");
    StromXX.print("Messdauer[ms]");
    StromXX.print(",");
    StromXX.println();
    StromXX.close();
  }
  lcd.setCursor(0, 1);
  lcd.print(" Header geschr.");
  delay(1000);
  lcd.setCursor(0, 0);
  lcd.print("Header angelegt");
  lcd.setCursor(0, 1);
  lcd.print("  Start->short ");
}

void loopblink(void) {

  if (millis() - zeitgeber > 5000) {
    zeitgeberCount = millis() - zeitgeber;
    zeitgeber = millis();
    zaehler += 1;
    //arbeitsteil:
    lcd.setCursor(9, 0);
    lcd.print("       ");
    startMeasurement();         //Beginne die Messung
    lcd.setCursor(2, 0);
    lcd.print(zaehler);
    lcd.setCursor(9, 0);
    lcd.print(current, 1);
    datenlogger();              //Aufzeichnung der Messung
    //digitalWrite(PinLED, !digitalRead(PinLED));  //Arbeitsteil
  }
}
void startMeasurement() {
  digitalWrite(PinLED, !digitalRead(PinLED));  //Arbeitsteil LED Statusaenderung, Zeigt Messintervalle an
  long rawValue = 0;
  for (int i = 0; i < 500; i++) {            //fuehre 1000 Messungen durch (Messschwankungen des ACS712) ACHTUNG: dauert 2 Sekunden
    rawValue += analogRead(ACS712_Pin);
    delay(2);
  }
  rawVoltage = rawValue / 500.0;
  current = (rawVoltage - zeroCurrentValue) * vRef / 1.024 / 0.185;
 }
void stopMeasurement() {
  if (measuring) {
    measuring = false;            //Beende das Messprogramm und schiesst sicher die SD Karte
    StromXX = SD.open("Strom_2.csv", FILE_WRITE);
    if (StromXX) {
      StromXX.println("Messung beendet");
      StromXX.print("Insgesamt : ");
      StromXX.print(zaehler);
      StromXX.println("  Messungen durchgefuehrt");
      StromXX.println("***** NEUE MESSUNG *****");
    }
    StromXX.close();
    //  Serial.println("CARD Close");
    digitalWrite (PinLED, LOW);
    digitalWrite (PinLED_Stop, HIGH);
    lcd.clear();
    lcd.setCursor(1, 0);
    lcd.print("SD-Card closed");
    lcd.setCursor(0, 1);
    lcd.print("Anz: ");
    lcd.print(zaehler);
    lcd.setCursor(11, 1);
    lcd.print(" Mes.");
  }
}
void datenlogger() {
  StromXX = SD.open("Strom_2.csv", FILE_WRITE);    //schreibt die Messdaten in die EXCEL Datei Strom_1.xls
  if (StromXX) {
    StromXX.print(zaehler);
    StromXX.print(" ), ");
    StromXX.print(rawVoltage);
    StromXX.print(", ");
    StromXX.print(rawVoltage * vRef / 1024);
    StromXX.print(", ");
    StromXX.print(current);
    StromXX.print(", ");
    StromXX.print(zeitgeberCount);
    StromXX.println(", ");
    delay(50);
    StromXX.close();
  }
}
void setup() {
  //  Serial.begin(115200);
  pinMode(button1Pin, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-Up-Widerstand
  pinMode(button2Pin, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-Up-Widerstand
  //  Serial.println("Initialisierung");
  pinMode(chipSelect, OUTPUT);
  pinMode(PinLED, OUTPUT);
  pinMode(PinLED_Stop, OUTPUT);
  digitalWrite (PinLED, LOW);
  digitalWrite (PinLED_Stop, LOW);
  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);                            ////an Pos 3 in Zeile 0
  lcd.print("Initialisierung");
  // Initialisiere die SD-Karte
  if (!SD.begin(chipSelect)) {
    //  Serial.println("SD-Kartenfehler");
    lcd.setCursor(0, 1);
    lcd.print("SD-Kartenfehler");
    while (true) {                                          //Kartenfehler: abwechselndes Blinken der beiden LEDs
      digitalWrite(PinLED, !digitalRead(PinLED));
      delay(200);
      digitalWrite(PinLED_Stop, !digitalRead(PinLED_Stop));
      delay(200);
    }
  }
  else {
    lcd.clear();
    //   Serial.println("Karte Initialisiert");
    lcd.setCursor(1, 0);
    lcd.print("Initialisiert");
    lcd.setCursor(2, 1);
    lcd.print("Start->short");
  }
}

void loop() {
  if (measuring == true) loopblink();             //wenn der Taster 2 kurz gedrueckt, Starte das Messprogramm.
  int button1Reading = digitalRead(button1Pin);
  int button2Reading = digitalRead(button2Pin);

  // Entprellen von Taster 1;  Taster hat in diesem Programm keine Funktion!
  if (button1Reading != button1PreviousState) {
    button1PressStartTime = millis();
  }
  if (millis() - button1PressStartTime > debounceDelay) {
    if (button1Reading != button1State) {
      button1State = button1Reading;

      // Kurzer Tasterdruck auf Taster 1
      if (button1State == LOW) {
        counter++;
        Serial.print("Counter+: "); Serial.println (counter);
      }
    }
  }

  // Entprellen von Taster 2
  if (button2Reading != button2PreviousState) {
    button2PressStartTime = millis();
  }
  if (millis() - button2PressStartTime > debounceDelay) {     //pruefe ob Taster kurz gedrueckt wurde
    if (button2Reading != button2State) {
      button2State = button2Reading;

      // Taster 2 gedrückt bei PULL UP ist LOW gedrueckt und HIGH losgelassen
      if (button2State == LOW) {
        button2LongPressDetected = false; // Setze Long-Press-Flag zurück
      } else {
        // Taster 2 losgelassen
        if (!button2LongPressDetected) {                        // Kurzer Tasterdruck auf Taster 2
          // Starte Messung
          digitalWrite (PinLED_Stop, LOW);
          zaehler = 0;
          header();
          //Serial.println("Start Messung");
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Z:");
          lcd.setCursor(6, 0);
          lcd.print("mA: ");
          lcd.setCursor(0, 1);
          lcd.print(" Stop -> long");
          measuring = true;                                     // Starte Messung
        }
      }
    }
  }
  // Prüfe auf Long-Press von Taster 2
  if (button2State == LOW && !button2LongPressDetected && millis() - button2PressStartTime >= longPressDelay) {
    button2LongPressDetected = true;
    // Ergebnis der Variable verwenden
    // Hier kannst du den gewünschten Code für das weitere Programm einfügen
    //   Serial.println("Stop Messung");
    stopMeasurement();                                          //Stoppe Messung (Taster 2 wurde lange gedrueckt)
  }
  // Speichere den aktuellen Zustand der Taster für den nächsten Schleifendurchlauf
  button1PreviousState = button1Reading;
  button2PreviousState = button2Reading;
}
```

Einen ESP32 nehmen und die Daten per UDP an einen PC senden
oder
per serieller Schnittstelle an einen PC übertragen und vom Terminalprogramm auf dei Festplatte schreiben
oder
nach 100 Datensätzen eine neue Datei anfangen.

vgs

Das dürfte ein Problem sein! (wenn nicht sogar DAS Problem)
Da meines Wissens nach die SD Lib 512 Byte dynamisch reserviert.
Für den Stack bleibt da quasi nix mehr übrig.

Der gleiche Code.


#include <Arduino.h>
#include <SD.h>
#include <SPI.h>

#define chipSelect 10
File StromXX;
const char fileName[] = {"Strom_2.csv"};
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

bool measuring = false;
unsigned int zaehler = 0;
constexpr byte PinLED {7};      //Gruene LED
constexpr byte PinLED_Stop {8}; //blaue LED

//Messdatenermittlung mit ACS712
constexpr byte ACS712_Pin {A0};
const float vRef = 4.99;  //Spannung mit DMM Multimeter (Aref zu GND) gemessen. vRef = 5.0 bei 12V Spannungsquelle
float rawVoltage = 0;
float current = 0;
const float zeroCurrentValue = 510.8;
static unsigned long zeitgeber = 0;  //globale Variable, wird nur einmal angelegt , verhält sich wie eine lokale Variable
unsigned long zeitgeberCount = 0;

constexpr byte button1Pin {5}; // Pin für Taster 1
constexpr byte button2Pin {6}; // Pin für Taster 2       //hier nur fuer diesen Taster

bool button1State = HIGH; // Aktueller Zustand von Taster 1
bool button2State = HIGH; // Aktueller Zustand von Taster 2

bool button1PreviousState = HIGH; // Vorheriger Zustand von Taster 1
bool button2PreviousState = HIGH; // Vorheriger Zustand von Taster 2

unsigned long button1PressStartTime = 0; // Startzeit des Taster-Drucks von Taster 1
unsigned long button2PressStartTime = 0; // Startzeit des Taster-Drucks von Taster 2

constexpr unsigned long debounceDelay {50}; // Entprellungsverzögerung (in Millisekunden)
constexpr unsigned long longPressDelay {1000}; // Zeit für langen Tasterdruck (in Millisekunden)

uint16_t counter = 0; // Variable zum Hoch- und Herunterzählen
bool button2LongPressDetected = false; // Flag für erkannten Long-Press von Taster 2
bool freigabe = true;

void header()
{
  StromXX = SD.open(fileName, FILE_WRITE);      //Schreiben der HeaderZeile
  if (StromXX)
  {
    StromXX.println("Strommessung mit ACS712 (5-Ampere) Sensor Messung, Volt[RAW], Volt[V], Strom[mA], Messdauer[ms],");
  }
  StromXX.close();
  lcd.setCursor(0, 1);
  lcd.print(F(" Header geschr."));
  delay(1000);
  lcd.setCursor(0, 0);
  lcd.print(F("Header angelegt"));
  lcd.setCursor(0, 1);
  lcd.print(F("  Start->short "));
}

void loopblink(void)
{
  if (millis() - zeitgeber > 5000)
  {
    zeitgeberCount = millis() - zeitgeber;
    zeitgeber = millis();
    zaehler += 1;
    //arbeitsteil:
    lcd.setCursor(9, 0);
    lcd.print(F("       "));
    startMeasurement();         //Beginne die Messung
    lcd.setCursor(2, 0);
    lcd.print(zaehler);
    lcd.setCursor(9, 0);
    lcd.print(current, 1);
    datenlogger();              //Aufzeichnung der Messung
    //digitalWrite(PinLED, !digitalRead(PinLED));  //Arbeitsteil
  }
}
void startMeasurement()
{
  digitalWrite(PinLED, !digitalRead(PinLED));  //Arbeitsteil LED Statusaenderung, Zeigt Messintervalle an
  long rawValue = 0;
  for (int i = 0; i < 500; i++)              //fuehre 1000 Messungen durch (Messschwankungen des ACS712) ACHTUNG: dauert 2 Sekunden
  {
    rawValue += analogRead(ACS712_Pin);
    delay(2);
  }
  rawVoltage = rawValue / 500.0;
  current = (rawVoltage - zeroCurrentValue) * vRef / 1.024 / 0.185;
}
void stopMeasurement()
{
  if (measuring)
  {
    measuring = false;            //Beende das Messprogramm und schiesst sicher die SD Karte
    StromXX = SD.open(fileName, FILE_WRITE);
    if (StromXX)
    {
      StromXX.println(F("Messung beendet"));
      StromXX.print(F("Insgesamt : "));
      StromXX.print(zaehler);
      StromXX.println(F("  Messungen durchgefuehrt"));
      StromXX.println(F("***** NEUE MESSUNG *****"));
    }
    StromXX.close();
    //  Serial.println("CARD Close");
    digitalWrite (PinLED, LOW);
    digitalWrite (PinLED_Stop, HIGH);
    lcd.clear();
    lcd.setCursor(1, 0);
    lcd.print(F("SD-Card closed"));
    lcd.setCursor(0, 1);
    lcd.print(F("Anz: "));
    lcd.print(zaehler);
    lcd.setCursor(11, 1);
    lcd.print(F(" Mes."));
  }
}
void datenlogger()
{
  StromXX = SD.open(fileName, FILE_WRITE);    //schreibt die Messdaten in die EXCEL Datei Strom_1.xls
  if (StromXX)
  {
    StromXX.print(zaehler);
    StromXX.print(" ), ");
    StromXX.print(rawVoltage);
    StromXX.print(", ");
    StromXX.print(rawVoltage * vRef / 1024);
    StromXX.print(", ");
    StromXX.print(current);
    StromXX.print(", ");
    StromXX.print(zeitgeberCount);
    StromXX.println(", ");
    delay(50);
  }
  StromXX.close();
}
void setup()
{
  //  Serial.begin(115200);
  pinMode(button1Pin, INPUT_PULLUP); // Taster 1 als Eingang mit Pull-Up-Widerstand
  pinMode(button2Pin, INPUT_PULLUP); // Taster 2 als Eingang mit Pull-Up-Widerstand
  //  Serial.println("Initialisierung");
  pinMode(chipSelect, OUTPUT);
  pinMode(PinLED, OUTPUT);
  pinMode(PinLED_Stop, OUTPUT);
  digitalWrite (PinLED, LOW);
  digitalWrite (PinLED_Stop, LOW);
  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0, 0);                            ////an Pos 3 in Zeile 0
  lcd.print(F("Initialisierung"));
  // Initialisiere die SD-Karte
  if (!SD.begin(chipSelect))
  {
    //  Serial.println("SD-Kartenfehler");
    lcd.setCursor(0, 1);
    lcd.print(F("SD-Kartenfehler"));
    while (true)                                            //Kartenfehler: abwechselndes Blinken der beiden LEDs
    {
      digitalWrite(PinLED, !digitalRead(PinLED));
      delay(200);
      digitalWrite(PinLED_Stop, !digitalRead(PinLED_Stop));
      delay(200);
    }
  }
  else
  {
    lcd.clear();
    //   Serial.println("Karte Initialisiert");
    lcd.setCursor(1, 0);
    lcd.print(F("Initialisiert"));
    lcd.setCursor(2, 1);
    lcd.print(F("Start->short"));
  }
}

void loop()
{
  if (measuring == true)
  {
    loopblink();  //wenn der Taster 2 kurz gedrueckt, Starte das Messprogramm.
  }
  int button1Reading = digitalRead(button1Pin);
  int button2Reading = digitalRead(button2Pin);
  // Entprellen von Taster 1;  Taster hat in diesem Programm keine Funktion!
  if (button1Reading != button1PreviousState)
  {
    button1PressStartTime = millis();
  }
  if (millis() - button1PressStartTime > debounceDelay)
  {
    if (button1Reading != button1State)
    {
      button1State = button1Reading;
      // Kurzer Tasterdruck auf Taster 1
      if (button1State == LOW)
      {
        counter++;
        Serial.print(F("Counter+: "));
        Serial.println (counter);
      }
    }
  }
  // Entprellen von Taster 2
  if (button2Reading != button2PreviousState)
  {
    button2PressStartTime = millis();
  }
  if (millis() - button2PressStartTime > debounceDelay)       //pruefe ob Taster kurz gedrueckt wurde
  {
    if (button2Reading != button2State)
    {
      button2State = button2Reading;
      // Taster 2 gedrückt bei PULL UP ist LOW gedrueckt und HIGH losgelassen
      if (button2State == LOW)
      {
        button2LongPressDetected = false; // Setze Long-Press-Flag zurück
      }
      else
      {
        // Taster 2 losgelassen
        if (!button2LongPressDetected)                          // Kurzer Tasterdruck auf Taster 2
        {
          // Starte Messung
          digitalWrite (PinLED_Stop, LOW);
          zaehler = 0;
          header();
          //Serial.println("Start Messung");
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Z:");
          lcd.setCursor(6, 0);
          lcd.print(F("mA: "));
          lcd.setCursor(0, 1);
          lcd.print(F(" Stop -> long"));
          measuring = true;                                     // Starte Messung
        }
      }
    }
  }
  // Prüfe auf Long-Press von Taster 2
  if (button2State == LOW && !button2LongPressDetected && millis() - button2PressStartTime >= longPressDelay)
  {
    button2LongPressDetected = true;
    // Ergebnis der Variable verwenden
    // Hier kannst du den gewünschten Code für das weitere Programm einfügen
    //   Serial.println("Stop Messung");
    stopMeasurement();                                          //Stoppe Messung (Taster 2 wurde lange gedrueckt)
  }
  // Speichere den aktuellen Zustand der Taster für den nächsten Schleifendurchlauf
  button1PreviousState = button1Reading;
  button2PreviousState = button2Reading;
}
Der Sketch verwendet 17004 Bytes (52%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 1266 Bytes (61%) des dynamischen Speichers, 782 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Und da ist noch Luft nach oben um Platz zu schaffen.

Brauch man nichts senden, schon ESP8266 hat mit den par Daten kein Problem das auf SD Schreiben, selber schreibe viel mehr, einzelner Unterschied, schreibe alle 10Min nicht jede Sekunde.

Hi combie, danke für den Hinweis. So etwas hatte ich schon mit einem anderen Programm. Echt schade, dass das der Kompiler nicht auch mit ausgeben kann. Und den Stack braucht er wohl um die Daten zwischen zu speichern, oder? Bliebe für mich nur noch zu verstehen, warum das Programm denn noch ca.150 Sätze schreibt. Ich hätte gedacht, dass sich der Stack automatisch wieder leert.

Heute bin ich unterwegs, wenn ich aber am So. wieder zu Hause bin probier ich das aus. Muss mit nun erstmal die Unterschiede ansehen. Kann bestimmt daraus noch lernen. Vielen Dank. Ist immer wieder eine Freude mit euch.

Hi Stefan,
ja, wenn es denn am Stack liegt und der Nano keinen Platz mehr hat kann das eine Lösung sein. Ist halt nur so, das ich das ja nicht sehen konnte, da der Kompiler das nicht anzeigt.
An den PC anschließen ist ein bisschen kompliziert, weil der Mäher im Garten seht.
Die Idee mit den 100 Datensätzen könnte funktionieren???? Wenn der NANO doch ein Problem mit dem Stack hat, müsste denn nicht auch dann beim weiteren Schreiben Probleme zu erwarten sein? Lerne ja gern immer was dazu.

Tipp zum RAM sparen: Alle konstanten Zeichenkettein in print ins F-Macro und damit ins Flash verlegen:

// Alt
xxx.print("Ein Text");
// besser
xxx.print(F("Ein Text"));

Passt für alle xxx.print/println, bei denen xxx von Print erbt.

Gruß Tommy

Das ist nicht weiter schwer. :wink:

das passiert im Regelfall auch.

Wir hatten hier mal einen Fall, da wurde auch nach einer bestimmten Anzahl Aufrufe der SD-Write Funktion abgebrochen.
Nach langer Suche kam dann raus, dass IMHO 8 mal ein sd.open() drin war, aber kein .close() gegriffen hat.

Hab ich im übrigen in Deinem Code auch geändert. Einmal war es richtig, da war das close() nicht von der Bedingung abhängig.

Verräter.... :wink:

Wer? Ich? Wieso?? :wink: :wink:

1 Like

Hi my_xy_projekt,
ich habe das obige nun alles berücksichtigt und bin (incl Entfernung des Tastere 1) auf noch verfügbare Bytes von 888 gelandet. Sieht doch eigentlich schon ganz gut aus. Btw, die Deklaration constexpr hab ich mit übernommen, verstehe aber die Funktion noch nicht.... Aber was solls erstmal, keine Fehlermeldung. Leider hat das optimieren des Codes das Problem nicht behoben. Auch der Umbau auf den Mega2650 zeigt den Abbruch bei ca 170 Datensätzen. Der hat dann noch geschmeidige 7032 Bytes frei. Alternative SD Karte half auch nix. Habt ihr noch irgendeine Idee woran das liegen könnte????

Vielen Dank Tommy, Das das mit allen Print Befehlen geht kannte ich nicht. Das werde ich künftig immer anwenden.

Was ist mit der Variante nach 100 Datensätzen eine neue Datei zu beginnen?

Abbruch nach ca 170 Datensätzen

Heißt das es bricht
mal bei 120
mal bei 150
mal bei 169 ab?

Konnest du irgendwie einen Zusammenhang feststellen mit
Programm läuft so und so lange?
Bestimmte Tageszeit?
bestimmer Ladezustand des Akkus?

Hallo Stefan, die Idee mit den neuen Dateien kann aus meiner Sicht natürlich funktionieren, wäre aber eigentlich keine gute Lösung, da ich dann immer noch nicht weiß was ich hier falsch mache und habe dann beim nächsten mal wieder das gleiche Problem. Scheint ja nur bei mir aufzutreten. Das mit den neuen Dateien werde ich mal ausprobieren, vorausgesetzt ich schaffe das mit meinen Programmierkenntnissen.
Der Abbruch kommt immer so bei der Anzahl von Datensätzen.
Von den beiden letzten Tests habe ich noch die Daten. Das sind einmal 14 Min und beim Anderen ca 15:30Min.
Das läuft bei mir derzeit noch alles am Laptop (der hängt am Netz), mit USB Versorgung zum MC.

Lässt du über serielle Schnittstelle mitloggen?
Da könnte man nachschauen ob es einen ganz allgemeinen Abbruch gibt und das Programm gar nicht mehr läuft

Hast du mal nachgeschaut ob in den Energiesparoptionen etwas drinsteht was die USB-Geräte bei nicht-Aktivität abschaltet=

Alternativ könntest du den Ardu auch mal über ein Handyladegerät mit Strom versorgen

Hast du mal ausprobiert wie es sich verhält wenn du jede Sekunde einen Datensatz schreiben lässt?

Hast du mal ausprobiert wie es sich verhält wenn du nur alle 5-10 Minuten einen Datensatz schreiben lässt?

1 Like

Hi Stefan, so nun hab ich auch das ausprobiert und zum schluss stellt sich wohl wieder mal ein, dass systematische Fehlersuche zum Erfolg führen kann.
Aber erst noch kurz die Ergebnisse. Schreiben bricht ab nach ca 170 schreibvorgängen, fast reproduzierbar. Egal ob die Schreibfrequenz 1 sek, 5 sec oder 60 sek beträgt, auch egal ob am Netz oder USB.
Der Fehler lag hier an der SD Karte. Nachdem ich die ausgetauscht hatte werden alle Datensätze problemlos beschrieben. Alles läuft nun wie es soll.
Danke an alle, die mir bei dem Problem geholfen haben. Habe ja auch wieder einiges neues gelernt über Speicheroptimierung etc (...print(F(...)); z.B. Und vielleicht bekomme ich ja auch noch den Vorteil von "constexpr " raus.

1 Like

Schwierig..... wenn das bisher noch nicht geklappt hat.
constexpr ist mittlerweile 12 Jahre alt.

Hi Combie, bin ja erst vorgestern darauf gestoßen, das es das überhaupt gibt. Ich arbeite ja nur mit der IDE und der C++ Arduinoversion. Das eigentliche C++ mit den Unterschieden und Möglichkeiten hab ich noch nicht mal angekratzt. Und schließlich gibt es kein constexpr in der Arduino Referenz. (Meine nur, lesen tu ich Doks schon manchmal....)