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" ;-(
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.
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)
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.
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
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.
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.
... 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.
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.