SD-Karte während dem laufenden Betrieb raus und wieder rein

Hi zusammen,

ich steh mal wieder auf dem Schlauch ;-(

Ich nutze einen Wemos D1 Mini und ein SD Shield.
Wie kann ich zuverlässig prüfen, ob eine SD-Karte eingesetzt ist und ob diese lesbar ist - und zwar auch, wenn

  • die SD-Karte beim Start des Loops noch nicht eingesetzt ist, also erst nachträglich eingesetzt wird
  • die SD-Karte nach dem Einsetzen nachträglich rausgenommen und dann wieder eingesetzt wird

Hier ist mein Sketch-Versuch.
Ich nutze eine externe Button-Bibliothek.
Immer wenn der Button gedrückt wird, will ich den Status der SD-Karte prüfen.

#include <SPI.h>
#include <SD.h> // SD-Kartenleser
#include <Button2.h>

#define BUTTON_PIN 0
Button2 button = Button2(BUTTON_PIN);

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_PIN,INPUT_PULLUP);
  button.setTapHandler(button_press);
  if (!SD.begin(15)) {
    Serial.println("SD-Karte NICHT erkannt!");
  } else {
    Serial.println("SD-Karte erkannt."); 
  }
}

void loop() {
  button.loop();
  delay(100);
}


void button_press(Button2& btn){
  if (!SD.begin(15)) {
      Serial.println("SD-Karte NICHT erkannt!");
  } else {
      Serial.println("SD-Karte erkannt."); 
      if (SD.open("/")) {
        Serial.println("SD-Karte kann gelesen werden!");
      } else {
        Serial.println("SD-Karte kann nicht gelesen werden!");
      }
  }
}

Aktuell ist es so, dass - sobald der Status einmal "SD-Karte erkannt" erreicht hat- dieser Status auch so bleibt. D.h. wenn ich die SD-Karte dann rausnehme und den Button drücke, kommt trotzdem "SD-Karte erkannt!" und "SD-Karte kann gelesen werden" ;-(

Könnt ihr mir vom Schlauch runterhelfen?

LG Daniel

zeig mal, was Du für ein Modul benutzt.

Hi,

ich nutz das hier:

https://www.reichelt.de/d1-shield-microsd-d1z-microsd-p266070.html?CCOUNTRY=445&LANGUAGE=de&trstct=pos_13&nbc=1&&r=1

Grüßle
Daniel

Kannst Du mit einem Lötkolben umgehen?
Das shield wäre dann das:


Dazu die Doku:

Wenn Du auf das Bild schaust, müsstest Du vom 2.ten Lötpad (von rechts) des micro-SD-Halters eine Verbindung zu einem freien Pin bauen.
Dann kannst den PIN abfragen, ob die Karte gesteckt ist oder nicht.

Wenn das nicht geht, musst Du auf der Karte eine Datei anlegen die Du mit .exist() abfragst.

1 Like

Absolut, ich löte sogar richtig gerne. Hab mir schon ein paar Gitarren und Gitarrenverstärker gebaut und das auch noch mit bleihaltigem Lötzinn :wink:

Aber: Ich werde dann doch den "Software"-Weg nehmen, also .exists().

Was mich aber trotzdem wundert ist, dass trotz nicht eingesetzter SD-Karte das SD.open("/") ein true übermittelt.

Denn dIe Doku sagt ja, dass ein false übermittelt wird.

Aber anscheinend bleibt der Zustand - wenn einmal auf true gesetzt - immer auf true :wink:

Wenn die Karte im laufenden Betrieb gewechselt wird, und dann auch evtl. mal fehlen kann, musst du jedesmal in loop mit SD.begin() anfangen.
Und dir überlegen was du tun willst, wenn Schreiben nicht geht.
Und checken, ob die Library SD.end() [als Gegenstück zu SD.begin()] kennt, oder mehrfach SD.begin() richtig macht...
(Das ging jedenfalls früher mal nicht)

1 Like

Hi,

teste ich nachher dann gleich mal aus.
Danke dir!

LG
Daniel

... Und möglichst schon vor SD.begin() eine Alarm-LED anschalten, die einen davor warnen sollte, während des Schreibens an der Karte rumzufummeln.

So, ich hab jetzt mal eine Mischung aus den beiden Antworten verwurstet, leider ohne Erfolg ;-(
Die Datei "test.txt" existiert natürlich auf der SD-Karte.

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

#define BUTTON_PIN 0
Button2 button = Button2(BUTTON_PIN);

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_PIN,INPUT_PULLUP);
  button.setTapHandler(button_press);
  if (!SD.begin(15)) {
    Serial.println("SD-Karte NICHT erkannt!");
  } else {
    Serial.println("SD-Karte erkannt."); 
  }
}

void loop() {
  button.loop();
  SD.begin(15);
  delay(100);
}

void button_press(Button2& btn){
    if (SD.exists("test.txt")) {
      Serial.println("SD-Karte erkannt");
    } else {
      Serial.println("SD-Karte NICHT  erkannt");
    }
}

Ablaufverhalten 1:

  • ESP mit eingesetzter SD-Karte gestartet, Button gedrückt --> "SD Karte erkannt"
  • SD-Karte entfernt, Button gedrückt --> "SD-Karte nicht erkannt"
  • SD-Karte wieder eingesetzt, Button gedrückt --> "SD-Karte nicht erkannt"

Ab jetzt keine Chance mehr. Die Karte wird erst wieder erkannt, wenn der ESP neu gestartet wird.

Ablaufverhalten 2:

  • ESP OHNE eingesetzte SD-Karte gestartet, Button gedrückt --> "SD Karte nicht erkannt"
  • SD-Karte eingesetzt, Button gedrückt --> "SD-Karte erkannt"
  • SD-Karte wieder entfernt, Button gedrückt --> "SD-Karte nicht erkannt"
  • SD-Karte wieder eingesetzt, Button gedrückt --> "SD-Karte nicht erkannt"

Ab jetzt keine Chance mehr. Die Karte wird erst wieder erkannt, wenn der ESP neu gestartet wird.

Aber wenn das einfach so ist, dann kann man sich damit natürlich auch abfinden :wink:
Während des laufenden Betriebs eine SD-Karte rausrupfen soll man ja sowieso tunlichst vermeiden.

Wenn ihr trotzdem noch eine Idee habt, freu ich mich.
Ansonsten schließe ich das Thema dann hiermit ab.

LG
Daniel

Alle 100 ms ein SD.begin() halte ich auch nicht für zielführend.

Gruß Tommy

Ja, da magst du Recht haben :wink:

durchscrollen

Die aktuellen SD.h für Arduino sind ein Wrapper um SdFat. Da ist das drin.
Die ESP haben eigene Libs, da sie mehrere Filesysteme (z.B. SDFS, LittleFS) aufrufkompatibel zueinander halten wollen.

Gruß Tommy

... ah ja. ich hab halt noch immer keinen.
Aber da sollte man doch trotzdem rankommen und ggfls. Hand anlegen können?

Ansonsten würde ich versuchen, auf die Karte eine Datei zu öffnen - geht nicht fehlerfrei? - begin aufrufen - neu versuchen - geht nicht - zeit abwarten - begin aufrufen und von vorn....

Ja, aber einfach in jedem loop-Durchlauf ein SD.begin() machen, geht daneben.
Der Patch an der alten SD (wenn vorhanden, dann erst löschen) ist in den SDFS-Files enthalten.
Auch wenn Du keinen ESP8266 hast, kannst Du Dir ja den Core installieren. Da kannst Du wenigstens in die Sourcen rein schauen.

Gruß Tommy

magst testen?

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

#define BUTTON_PIN 0
Button2 button = Button2(BUTTON_PIN);


bool setTimer = false;
unsigned long lastmillis = 0;


void setup()
{
  Serial.begin(115200);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  button.setTapHandler(button_press);
  if (!SD.begin(15))
  {
    Serial.println("SD-Karte NICHT erkannt!");
  }
  else
  {
    Serial.println("SD-Karte erkannt.");
  }
}

void loop()
{
  button.loop();
  if (setTimer)tikSD();
  delay(100);
}

void button_press(Button2 &btn)
{
  setTimer = false;
  tikSD();
}
void tikSD()
{
  if (!setTimer || (millis() - lastmillis > 2000)))
  {
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    if (!dataFile)
    {
      SD.begin(15);
      if (!dataFile)
      {
        Serial.println("nicht schick");
        lastmillis = millis();
        setTimer = true;
      }
    }
    else
    {
      Serial.println("schick");
      SD.close();
      SD.remove("datalog.txt");
      setTimer = false;
    }
  }
}

rudimentär - ich will nur hören, ob du irgendwann den Wechsel merkst.

Ich habe keine Ahnung, was ich da gemacht habe .... aber alle 2 sekunden wird nachgesehen...

1 Like

Danke für's Wiederfinden, @my_xy_projekt. Da war mal was vor x Jahren, war mir noch im Hinterkopf. Dass ich auch damals beteiligt war, sollte eigentlich klar sein, sonst wär's ja nicht in meinem Hinterkopf.

Muss man halt nochmal genau schauen, bei der aktuell verwendeten Library.

Wenn einfach warten und begin() wiederholen keine Lösung ist, fehlt evtl. sowas wie damals, als ein
if (root.isOpen()) root.close(); // allows repeated calls
in begin() hinzugefügt wurde. Dafür sind ja alle Libraries im Quelltext vorhanden.

Plattform-unabhängig für LittleFS und Konsorten ist dann aber wieder was anderes.
Was passiert, wenn mehrere clients sich um einen LittleFS - Dateizugriff auf dem server zanken? Sollte man evtl. lieber "richtigen" Systemen überlassen.

Danke, muss ich morgen gleich mal testen.
Auf jeden Fall scheint das ganze Thema nicht ohne ein Workaround umsetzbar zu sein ;-(

Danke für eure Hilfe und guts nächtle allerseits.

Lg Daniel

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