Probleme beim speichern auf SD

Moin ich habe ein Problem an dem ich seid 3 Tagen sitze und ich komme nicht vorwärts! Das ist das erste mal das ich etwas im Bereich programmieren mache und bestimmt findet Ihr direkt mehr als einen Fehler :wink:

Also mein Problem kurz beschrieben. Ich ver√§ndere √ľber einen Poti eine Spannung bis es zu einem Durchschlag kommt. Wird dieser registriert werden Werte auf eine SD gespeichert. Mein Problem ist anfangs hat das alles wunderbar funktioniert aber durch irgendwelche √Ąnderungen die ich vorgenommen habe nun nicht mehr. Und ich finde den Fehler nicht. Jedesmal wenn ich einen Durchschlag messe st√ľrzt das Programm im State LOG an der Stelle SD.open ab. Das komische ich habe in meinem Hauptmen√ľ eine TEstoption eingebaut in der ich automatisch das speichern ausl√∂sen kann. Wenn ich die benutze und auf die SD einmal gespeichert wurde (nat√ľrlich alle Werte dann Nullen) und ich das Programm von da an weiter laufen lasse. Bzw nach dem ersten speichern abbreche und dann die normale Messung beginne geht alles wunderbar :o

Ich weiß wirklich nicht wo mein Fehler liegt und verzweifle langsam an meiner Inkompetenz!

MfG Flo

Wenn ich hier √ľber 9 Manuell das speichern ausw√§hle kann ich nach einem ersten manuellen speichern auch mein Programm ganz normal durchlaufen lassen‚Ķ

void loop(){
////////////////////////// button section ///////////////////    
  key=mkeypad.getKey();
  if(key!=NO_KEY){  
    if(key>='0' && key<='9'){
      key-='0';                         
    }
    update_display = true;
    Serial.print("Taste ");
    Serial.print(key,DEC);
    Serial.println(" gedrueckt");
    if(state==STATE_MAIN_MENU){
    // lade default werte
      data.OilTemp = default_data.OilTemp;
      data.RampTime = default_data.RampTime;    
      data.Voltmax = default_data.Volt;
      data.total_iteration = default_data.total_iteration;
      data.modus = default_data.modus;
      data.V_UP = default_data.V_UP;
      data.V_WAIT = default_data.V_WAIT;
      data.IMP_HOLD = default_data.IMP_HOLD;
      data.mixingtime = default_data.mixingtime;
      if(key==1){
        state = STATE_ABSTAND_1;
      }
      else if(key==2){
        state = STATE_MODUS_KONTROLLE;
      }
      else if(key==3){
       state = 3;
      }
¬† ¬† ¬† else if(key==9){¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† ¬† //Was genau passiert hier und warum extra dr√ľcken?
        int filenumber = 0;
        bool filecheck = true;
        Serial.println("SD-KArte checken");
        while(filecheck && filenumber<100){
          sprintf(filename, "log%03i.txt", filenumber);
          filecheck = SD.exists(filename);
          filenumber++;
        }
        state = STATE_LOG;
      }

In diesem Bereich w√ľrde meine Messung laufen wenn ich meine Parameter zuvor im Men√ľ ausgew√§hlt habe. Nur st√ľrzt das Programm im State Log bei SD.open ab und ich muss den Arduino neu starten.

if(state==STATE_PRE_INIT_MESSUNG){
    
    int filenumber = 0;
    bool filecheck = true;
    Serial.println("SD-Karte checken");
    while(filecheck && filenumber<100){
      sprintf(filename, "log%03i.txt", filenumber);
      filecheck = SD.exists(filename);
      filenumber++;
      Serial.print("Filename:");
      Serial.println(filename);
    }
 ¬† ¬†MaxVolt_Counter = 0; //Den Counter f√ľr abgebrochene Messungen nullen ¬† ¬†
    state=STATE_INIT_MESSUNG;
  }


//Code entfernt //

  else if(state==STATE_MESSUNG){

      
      if(data.ruehren == false && data.heizen == false){
        value1 = analogRead(pinEDM); //Einlesen der anliegenden Spannung  
        value2 = analogRead(pinEDM); // dieser state braucht pro durchaulauf etwa 0.2ms
        
        if(value1 >= noiseEDM && value2 >= noiseEDM){           // Kontrolle ob Rauschen oder Durchschlag 
          Serial.println("Durchschlag erfasst");
          V_Durchschlag1 = value1;
          V_Durchschlag2 = value2;
          digitalWrite(pinRelaisVPlus, HIGH);                   // Stromversorgung aus
          state=STATE_DURCHSCHLAG;
        }
        else if(data.modus == 1){
          if((millis()-lastStep)>=tSchritt){           // Zunahme des Poti ergibt sich aus Messdauer
            if(level<PotiMaxWert){                     // Poti maximales Level begrenzen 
              level++;
              Serial.print("setze poti auf level ");
              Serial.println(level);
              digitalPotWrite(0, level, 2);
            } 
            else {                // Bei Erreichen der max. Spannung ohne Durchschlag in den state Maxvolterreicht springen und Eingabe abwarten
              digitalWrite(pinRelaisVPlus, HIGH);
              digitalPotWrite(0, 0, 2);
              wartezeit = millis();
              update_display=true;
              if(MaxVolt_Counter <= 1){
                Serial.println("im Counter");
                MaxVolt_Counter++;
                state=STATE_AUTO_RETRY;
              }
              else{
                state=STATE_MAXVOLTERREICHT;
                Serial.println("Maximal Spannung erreicht");                  
              }
            }
            lastStep = millis();
           }
        }
        else if(data.modus == 2){
          Serial.println("Impuls Modus");
 ¬† ¬† ¬† ¬† ¬†if(level<PotiMaxWert){ ¬† ¬† ¬† ¬† ¬†// Wenn der Wert knapp drunter liegt kann je nach Impuls danach deutlich dr√ľber liegen...
            Serial.println("level kleiner Poti");
            if((millis()-lastImpulsTime)>=data.V_WAIT && (millis()-lastImpulsTime)<=(data.V_WAIT+data.IMP_HOLD)){      
              Serial.println("IM IMPULS");
              Impuls=data.V_UP/VproLevel;
              level=level+Impuls;
              Serial.print("Imp, setze poti auf level ");
              Serial.println(level);
              digitalPotWrite(0, level, 2);       //Poti auf Impulswert setzen
         Serial.println("LastStep");
         lastImpulsTime=millis();
              }
              else{
                Serial.println("Imp Pause");
                digitalPotWrite(0, 0, 2);       // Poti auf null setzen
              }
            }
            else {                // Bei Erreichen der max. Spannung ohne Durchschlag in den state Maxvolterreicht springen und Eingabe abwarten
              digitalWrite(pinRelaisVPlus, HIGH);
              update_display=true;
              digitalPotWrite(0, 0, 2);
              wartezeit = millis();
              if(MaxVolt_Counter <= 1){
                Serial.println("im Counter");
                MaxVolt_Counter++;
                state=STATE_AUTO_RETRY;
              }
              else{
                state=STATE_MAXVOLTERREICHT;
                Serial.println("Maximal Spannung erreicht");                  
              } 
            }
          }
          
 ¬† ¬†} // Ende if r√ľhren und heizen false
    else{
      update_display=true;
      state = STATE_INIT_MESSUNG;
    }
  } //Ende state 21
  else if(state==STATE_DURCHSCHLAG){
    VoltDurchschlag = level; //Speichert nur den Zähler level aber nicht den zugehörigen Wert VOLT.
    level = 0; // Zur Sicherheit dem Poti noch einmal den Wert 0 zuweisen.
    digitalPotWrite(0, level, 2);                                            
    Messdauer = millis()-start_Messung;               
    Serial.print("Messdauer: ");
    Serial.println(Messdauer);
 ¬† ¬†OilTempDurchschlag = get_temp(); ¬† ¬† ¬† ¬† ¬† ¬† ¬†//aktuelle √Ėltemperatur speichern
    Serial.println("Temp erfassung geht");
    ruehren_on();
    state = STATE_LOG;
    //Anzeige schreiben
    //update_display = true;
  }  
  else if(state==STATE_LOG){ // Probleme beim speichern

    if(data.iteration == 0){
      dataString = "Modus";
      dataString += ";";
      dataString += "Dauer bis Durchschlag";
      dataString += ";";
      dataString += "Schrittweite [ms]";
      dataString += ";";
      dataString += "Poti Level";
      dataString += ";";
      dataString += "Value 1 [V]";
      dataString += ";";
      dataString += "Value 2 [V]";
      dataString += ";";
      dataString += "Oel Temperatur [Grad C]";
      dataString += ";";
      dataString += "Abstand der Elektroden";
      dataString += ";";
      dataString += "Messung";
      dataString += ";";
      dataString += "retry(Vmax erreicht)";
      dataString += "\n";
      dataString += String(data.modus);
      dataString += ";";
      dataString += String(Messdauer);
      dataString += ";";
      dataString += String(lastStep); // ist das hier wirklich was wir wollen?
      dataString += ";";
      dataString += String(VoltDurchschlag);
      dataString += ";";
      dataString += String(V_Durchschlag1);
      dataString += ";";
      dataString += String(V_Durchschlag2);
      dataString += ";";
      dataString += String(OilTempDurchschlag);
      dataString += ";";
      dataString += String(data.Abstand);
      dataString += ";";
      dataString += String(data.iteration);
      dataString += ";";
      dataString += String(MaxVolt_Counter);
      dataString += ";";
    }
    else{
      dataString = String(data.modus);
      dataString += ";";
      dataString += String(Messdauer);
      dataString += ";";
      dataString += String(lastStep); // ist das hier wirklich was wir wollen?
      dataString += ";";
      dataString += String(VoltDurchschlag);
      dataString += ";";
      dataString += String(V_Durchschlag1);
      dataString += ";";
      dataString += String(V_Durchschlag2);
      dataString += ";";
      dataString += String(OilTempDurchschlag);
      dataString += ";";
      dataString += String(data.Abstand);
      dataString += ";";
      dataString += String(data.iteration);
      dataString += ";";
      dataString += String(MaxVolt_Counter);
    }
    delay(1000);
    Serial.println(dataString);
    Serial.println(filename);   // Filename ist das letzte was ich sehen kann im Seriellen Monitor!!!
    delay(1000);
    DataFile = SD.open(filename, FILE_WRITE);    //wo ist das Problem???? HIer Absturz!!!!!
    delay(1000);
    Serial.println("SD Open geht");
    if(DataFile){
      Serial.println("File geoeffnet");
      DataFile.println(dataString);
      DataFile.close();
      EndPause = data.mixingtime + millis(); 
      state = STATE_WAIT;
      update_display = true;
      Serial.println("State Wait springen");
    }else {
      Serial.println("File nicht geoeffnet");
      state = STATE_FAIL_WRITE;                              
      update_display = true;
    }
  }
  else if(state==STATE_WAIT){                         

      Serial.print("Mixingtime:");
      Serial.println(data.mixingtime);
      Serial.print("Endpause:");
      Serial.println(EndPause);
    
    if(millis()>EndPause){
      Serial.print("Iteration ");
      Serial.print(data.iteration);
      Serial.print("von ");
      Serial.println(data.total_iteration);
      
      if(data.iteration>=data.total_iteration){
        update_display=true;
        state=STATE_FINAL;
        Serial.println("state FINAL");
      }
      else{
        data.iteration++;
        update_display=true;
        state=STATE_INIT_MESSUNG;
        Serial.println("state INIT Messung");
      }
    }
  }

Mein Code ist zu lang ich h√§nge also mein Programm komplett an falls jemand sich die M√ľhe machen m√∂chte und einmal durchschauen.

State_Machine_Durchschlag.ino (48.3 KB)

Welchen Arduino verwendest du?

Es ist ein Arduino Due

F√ľr meinen Due habe ich kein SD Breakout, damit keine Erfahrungen mit der Gesamtkonfiguration, sorry.

Falls das noch einen Einfluss hat!?!

Ich benutze das Arduino TFT mit dem integrierten SD-Modul.

Und kannst du generell etwas auf der SD speichern?
Mit einem sketch von 5 bis 15 Zeilen?

Falls nein, und du weisst da auch nicht warum, schauen wir uns alle lieber das Problem direkt an. Du auch.

Das nächste Problem ist dann eventuell, dass kaum einer einen Due hat.
Mit ‚Äúdas Arduino TFT mit dem integrierten SD-Modul‚ÄĚ meinst du dieses?

the module is compatible with every Arduino AVR based (like UNO, Leonardo etc).

Arduino Official Store | Boards Shields Kits Accessories
Das klingt nicht sehr gut…

Moin und vielen Dank f√ľr Eure M√ľhe mir ist √ľber nacht (die dritte die ich gr√ľbel‚Ķ) die L√∂sung eingefallen. Ich benutze in meinem Men√ľ sprintf und habe dort zu wenig speicher f√ľr meinen Buffer hinterlegt‚Ķ

D√§mlich ich wei√ü‚Ķ Aber ich kann verk√ľnden bin happy und alles l√§uft!