SD.begin() klappt manchmal nicht (vor allem nach HTTP-Update)

Hi zusammen,

ich hab immer mal wieder den Fall, dass bei meinem ESP32 nach einem HTTP-Update (also neuen Sketch per HTTP-Update aufspielen) der SD-Kartenleser nicht initialisiert wird.

Man muss den ESP dann erst komplett vom Strom nehmen, neu einstecken und dann gehts meistens wieder.

Im Prinzip hab ich einfach im Setup gleich zu Beginn das hier drin:

if (!SD.begin(SDPin)) {
    // SD-Karte NICHT erkannt
} else {
   // SD-Karte erkannt
}

Im Loop prüfe ich an nur noch mit

if (!SD.exists("/")) {
  // Meldung am Frontend ausgeben, dass die SD-Karte nicht verfügbar ist
}

Wenn man den ESP neu startet, ist alles ok. Der SD-Kartenleser wird zu 99% erkannt.

Aber was desöfteren passiert:
Wenn ich eine neue Firmware per HTTP-Update aufspiele und nach dem Update-Prozess der ESP neu gestartet wird, wird der SD-Kartenleser oft nicht erkannt.
Erst wenn ich den ESP kurz vom Strom nehm und dann wieder ganz neu starte, klappt es.

Habt ihr dazu ne Idee?

Sollte ich im Loop statt SD.exists() auch lieber SD.begin() nehmen?

Oder sollte ich im Setup mit einer While-Schleife für x sekunden ein SD.begin() ausführen um der Sache mehr Zeit zu geben?

Danke für eure Tipps.

LG Daniel

Bei unerklärlichen Phänomenen fällt mein Verdacht sofort auf eine mangelhafte Stromversorgung, beim ESP32 auf die 3,3 V. Funk braucht viel Strom, ein Update also auch, danach sind die Kondensatoren alle und es reicht nicht mehr für den SD-Kartenleser.

Eine Pause könnte die Kondensatoren füllen und wäre einen Test wert. Besser ist eine eigene Stromversorgung für den SD-Kartenleser.

Wenn es das nicht ist, ist es was Anderes :slightly_smiling_face:

2 Likes

Könnte definitiv eine Ursache sein.
Versorgt wird der ESP über ein 5V Netzteil / 1A

Könnte der Unterschied nicht eher sein, dass es nicht geht, wenn du zwar die Software neu startest, die SD-Karte aber nie stromlos war?

und was machst du dann?

Das hat wenig zu sagen, maßgebend ist der Spanungswandler Spannungsregler auf dem ESP und der ist zu knapp Bemessen, wen bei mir die erste Unstimmigkeit gibt dann bekommt der ESP sofort 3,3V mit genug Saft (3A) drauf.
Öfters wird der Fehler gemach und versucht über VIN zu gehen, das ist Unsinn, den hinter Vin ist der kleiner Spannungsregler == Der Spaß geht vor vorne, man sucht sich zu Tode.

PS. bei manchen ESP gibt's kein VIn nur +5V ist aber fast das Gleiche == wird runter auf 3,3V gesetzt.

Das kann ich dir ehrlich gesagt gar nicht 100%ig sagen. Ich nutze halt den folgenden code, um einen Sketch per HTTP-Update aufzuspielen:


void update_sketch() {
    WiFiClientSecure client;
    client.setInsecure();

    t_httpUpdate_return ret = httpUpdate.update(client, "https://linkzumeinemserver");
    
    switch (ret) {
      case HTTP_UPDATE_FAILED:
        Serial.printf("HTTP_UPDATE_FAILED Error (%d): %s\n", httpUpdate.getLastError(), httpUpdate.getLastErrorString().c_str());
        break;

      case HTTP_UPDATE_NO_UPDATES:
        DEBUG_L("HTTP_UPDATE_NO_UPDATES");
        break;

      case HTTP_UPDATE_OK:
        DEBUG_L("HTTP_UPDATE OK");   
        break;
    }
}

Und nach dem Aufspielen startet der ESP32 neu....oder ist es nur der Sketch?
Ich kann mir durchaus vorstellen, dass da der Strom nie ganz weg ist oder evtl. nur für eine Millisekunde?

Aber selbst wenn nur der Sketch neu startet, wird doch im Setup wieder SD.begin() ausgeführt.

Dann geb ich eine Fehlermeldung aus, dass der SD-Kartenleser nicht initialisiert wurde und man den ESP neu starten muss.

Genau so mach ich es (und das wurde mir sogar mal hier im Forum und in einem anderen Forum vorgeschlagen - meine ich mich erinnern zu können.

Ich verwende einen ESP32 Mini D1. Was ist denn dann der korrekte Pin um den ESP korrekt mit Spannung zu versorgen? Und wieso heißt der Pin dann V"in" wenn man da nicht die Spannungsversorgung anklemmen kann? Das verwirrt mich jetzt.

LG Daniel

Kann man schon, nur das hilft nicht wen der ESP am quatchen ist == Die 3,3V sind nicht stabil. Ein Kondersator 400mikro F 10V zw. 3,3V und GND könnte helfen

Also ich hab jetz im Loop noch ein SD.begin() eingebaut und nun hatte ich den Fehler nicht mehr (hab 5 mal hintereinander ein Update aufgespielt).

Womöglich greift das SD.begin() im Setup manchmal nicht (evtl. ist genau in diesem Moment noch nicht genug "Saft" auf dem SD-Kartenleser?) und dann wird es im Loop nachgeholt.

Ich habs allerdings so geregelt, dass SD.begin() im loop nur einmal ausgeführt wird, reicht anscheinend aus.

Um das zu verifizieren vor dem SD.begin() einfach nen delay(1000) rein. Wenn es dann nicht mehr hakt, ist das bestätigt.

Und, warum sehe ich kein SD.end() bei dir?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.