SD Library "Datalogger" Beispiel funktioniert nicht

Hallo,

ich versuche basierend auf einem Uno R3 und diesem SD Card reader (beides von AZ Delivery) einen Datalogger zu bauen. Der Aufbau ist so angeschlossen wie im Handbuch abgebildet. Wenn ich das Beispiel "Datalogger" der SD Library laufen lassen funktioniert alles wunderbar, bis in der text datei auf der SD Karte ungefähr 850 Datensätze abgelegt wurden. Ab dann wird nur noch der Error "error opening log.txt" im Serial Monitor ausgegeben und keine weiteren Daten abgespeichert. Ein Reset hilft in diesem Fall auch nichts (gleiches Fehlerbild setzt sich fort). Wenn ich die SD Karte am PC auslese, die txt Datei lösche und das Programm erneut starte werden wieder ungefähr 850 Datensätze abgespeichert, bevor es zur gleichen Fehlermeldung kommt. Das Ganze ist mit verschiedenen SD Karten reproduzierbar.

Hat jemand eine Idee woran es liegen könnte oder wie man am besten vorgeht um den Fehler zu finden?

wie man am besten vorgeht um den Fehler zu finden?

Mit serial print Ausgaben auf die schliche kommen, was nicht funktioniert.

Crossposts - auch in anderer Sprache - sehen wir hier gar nicht gern:

melde einen deiner Posts als crossposts an die Moderation und ersuche einen löschen zu lassen oder zumindest sperren zu lassen.

noiasca: melde einen deiner Posts als crossposts an die Moderation und ersuche einen löschen zu lassen oder zumindest sperren zu lassen.

Wenn die Moderation oder der Autor in beiden Foren eine Crosspost-Bemerkung hinzufügt und hoch und heilig verspricht beide Threads als gelöst zu kennzeichnen, bräuchte IMO nichts gelöscht zu werden. Ich finde, dass Crosspostings absolut okay sind, wenn die Leser darüber informiert werden.

Ich finde, dass bei Anfängern da ein bisschen zu unfreundlich agiert wird. Vielen ist einfach nicht klar, dass so etwas als „Verstoß gegen irgendwelche Regeln“ gesehen wird.

Gruß

Gregor

ich sehe da nichts unfreundliches in meinem Post.

Falls dir das auch nicht bekannt sein sollte:

13. Forum etiquette Once you have made your post, here are a few other guidelines: Don't cross-post! We know you are anxious to get an answer to your problem, but re-posting the same question to multiple parts of the forum causes duplicate effort, and divides the focus on your problem. You'll get a better answer if everyone can discuss it in one place. Cross-posting is very annoying; the moderators will delete your extra posts, and you will get a warning. Save all the hassle, and just post the question once. It will be noticed.

Hat jemand eine Idee woran es liegen könnte

Schwere Frage, ich jedenfalls nicht wirklich.
850 Sätze sind ein Zeichen dafür, dass es generell funktioniert, auch was die Dateiverwaltung auf der SD - Karte angeht. Da sind schon lang mehrere Datenrecords (à 512 byte) aneinander gekettet worden.

Was nach längerer Zeit eher Probleme macht, ist das zwischenzeitliche Entfernen und wieder Einstecken der (vermeintlich) unveränderten Speicherkarte. Wenn man sowas vorhat, sollte nicht nur SD.open(), sondern auch SD.begin() wiederholt werden.

Ich rate mal, welches du mit “Datenlogger Beispiel” meinst.
Da würde ich mal (mindestens zum Test, um es auszuschließen) auf String Objekte verzichten.

[OT]:
Vielleicht wissen ja Leute, die regelmäßig das Storage Unterforum mitlesen, mehr.
Wenn du beide Foren über deine Ergebnisse auf dem Laufenden hältst, wird dir evtl. sogar hier das böse Crossposting verziehen. :slight_smile:
[/OT]

noiasca: ich sehe da nichts unfreundliches in meinem Post.

Ich auch nicht. Ich meinte nicht speziell Dich.

Falls dir das auch nicht bekannt sein sollte: ...

Doch, ist mir natürlich bekannt. Ich beziehe das aber auf mehrere Foren bei arduino.cc.

Ich habe nur ab und zu den Eindruck, dass von Neulingen (im Netz bzw. in Foren) manchmal ein bisschen zu viel „Kommunikations-Knowhow“ erwartet wird.

Gruß

Gregor

Danke für die schnellen Antworten. Ich bin davon Ausgegangen dass sich Crossposting auf mehrere Post mit dem gleichen Thema in verschiedenen Kategorien bezieht. Das stellen der gleichen Frage in verschiedenen Sprachen habe ich als erwünscht aufgefasst, da es ja eine Bereicherung für die Community darstellt. Wenn dem nicht so ist bitte löschen.

Zu meiner Frage und dem erhaltenen Input: Könnte das Problem durch überlaufen des RAM verursacht werden? Wie kann man sich die Speicherbelegung anzeigen lassen?

proasis: Zu meiner Frage und dem erhaltenen Input: Könnte das Problem durch überlaufen des RAM verursacht werden? Wie kann man sich die Speicherbelegung anzeigen lassen?

Was hast du denn außer dem SD-Reader noch am Uno dran ? Nur der Reader macht normalerweise keine Probleme mit der Ramauslastung.

Was zeigt denn die Speicherauslastung beim Flashen an ?

proasis: Könnte das Problem durch überlaufen des RAM verursacht werden?

Daher meinte ich ja, du solltest deine Serial Ausgaben zum debuggen nutzen.

Bei einer Heap/Stack Kollision sollte der Uno eigentlich resetten. Das müsstest du im Seriellen Monitor auch erkennen.

durch diese Zeilen sollte eigentlich klar sein, ob das Schreiben erfolgreich war:

Serial.println("saved in log.txt"); //successfully safed } else { Serial.println("error opening log.txt");//error message if file is not open/storing of data was not

oder vorher schon was passiert. Das solltest du im Serial Monitor sehen.

vieleicht hilft auch ein String reserve https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/reserve/

wenn es schon unbedingt String Objekte sein müssen.

Was hast du denn außer dem SD-Reader noch am Uno dran ?

Mittlerweile nichts mehr. Ich versuche lediglich das Datalogger Example der in der IDE von Natur aus hinterlegten SD Library laufen zu lassen. Das Beispiel ist bis auf chip select unverändert. Mein setup sieht genau so aus wie in der manual:

  • +5V wird mit 5V am Arduino verbunden

  • GND wird mit GND verbunden

  • MOSI wird mit D11 verbunden

  • MISO wird mit D12 verbunden

  • SCK wird mit D13 verbunden

  • CS wird mit D10 verbunden

Bei einer Heap/Stack Kollision sollte der Uno eigentlich resetten. Das müsstest du im Seriellen Monitor auch erkennen.

durch diese Zeilen sollte eigentlich klar sein, ob das Schreiben erfolgreich war:

Serial.println("saved in log.txt"); //successfully safed } else { Serial.println("error opening log.txt");//error message if file is not open/storing of data was not

Die serial monitor ausgaben sehe ich, hilft mir aber nicht wirklich weiter. Ab circa 850 samples steht da nur noch "error opening log.txt" und es werden keine Daten mehr abgelegt.

Wo anders wurde mir empfohlen die F() Funktion bei allen serial.print Befehlen zu verwenden. Hat am verhalten leider nichts verändert.

proasis: Wo anders wurde mir empfohlen die F() Funktion bei allen serial.print Befehlen zu verwenden.

Bei Deinem Problem Unsinn. Lösche die Datei, Fange an von vorn. Schreibe auf die Karte, bis Fehler auftritt. Las das alles so laufen wie es ist. Lade den Sketch "CardInfo" aus den SD-Beispielen. Komme dann mit der kompletten seriellen Ausgabe.

Ab circa 850 samples steht da nur noch "error opening log.txt" und es werden keine Daten mehr abgelegt.

  • Wird die Fehlermeldung denn regelmäßig geschrieben? Oder hängt der Sketch irgendwo nach dem Fehler?
  • Nach einem Reset des Uno werden wieder ca. 850 Sätze zu deiner Datei hinzugefügt, bis der Fehler wiederkommt?
  • Schonmal ohne Strings probiert?

Aber wenn es wirklich am RAM liegt, sollte es eigentlich schon früher knallen: Du hast ja mit SD auf dem Uno nicht mal mehr 800 Byte RAM frei. Dein Leck kann also nicht mit jedem Satz wachsen, sondern nur seltener.

Lösche die Datei,
Fange an von vorn

Ich habe das in der IDE hinterlegte Beispiel “Datalogger” nicht verändert, mit ausnahme des chipselect pins (von 4 auf 10) weil das so im Handbuch des Card-readers steht. CardInfo scheint zu funktionieren und gibt folgendes aus:

09:22:28.799 -> Card type:         SDHC
09:22:28.846 -> Clusters:          490466
09:22:28.893 -> Blocks x Cluster:  16
09:22:28.893 -> Total Blocks:      7847456
09:22:28.940 -> 
09:22:28.940 -> Volume type is:    FAT32
09:22:28.940 -> Volume size (Kb):  3923728
09:22:28.986 -> Volume size (Mb):  3831
09:22:28.986 -> Volume size (Gb):  3.74
09:22:29.033 -> 
09:22:29.033 -> Files found on the card (name, date and size in bytes): 
09:22:29.126 -> SYSTEM~1/     2021-02-18 17:53:14
09:22:29.126 ->   WPSETT~1.DAT  2021-02-18 17:53:14 12
09:22:29.172 ->   INDEXE~1      2021-02-18 17:53:14 76

Ich muss nach dem Hochladen des Sketches aber immer die SD Karte einmal raus und wieder rein machen damit sie initialisiert werden kann. Muss das so?

  • Wird die Fehlermeldung denn regelmäßig geschrieben? Oder hängt der Sketch irgendwo nach dem Fehler?
  • Nach einem Reset des Uno werden wieder ca. 850 Sätze zu deiner Datei hinzugefügt, bis der Fehler wiederkommt?
  • Schonmal ohne Strings probiert?

Ja, bei jedem neuen Sample wird dies im Serial Monitor ausgegeben und anschließend kommt der error “error opening log.txt”. Das Programm hängt also nicht, es wird nur nichts mehr auf der SD abgelegt.
Nach einem Reset setzt sich der Fehler unverändert fort. Die Karte wird erfolgreich initialisiert, die Samples im Serial monitor angezeigt und jedes mal wenn geschrieben werden soll kommt die Fehlermeldung “error opening log.txt”. Um wieder etwas auf die Karte schreiben zu können muss ich die log.txt erst manuell am PC löschen. Das umbenennen der log.txt im Programm bringt auch nichts, der Fehler tritt weiterhin auf, bis ich die Datei mit den ~830 Samples gelöscht habe.
Nein, wie gesagt ich versuche das in der IDE hinterlegte Beispiel zum Laufen zu bekommen. Das sollte doch ohne Änderungen lauffähig sein oder nicht?

proasis: Das umbenennen der log.txt im Programm bringt auch nichts, der Fehler tritt weiterhin auf, bis ich die Datei mit den ~830 Samples gelöscht habe.

Das habe ich mir gedacht, deshalb nochmal: Nimm deine datalogger und spiel sie auf den Arduino. las das laufen, bis der Fehler auftritt. Lade dann die cardinfo auf den Arduino und gib bekannt, was der DANN ausgibt.

Du brauchst nichts abstecken reseten oder sonst was - nur beides nacheinander.

Das habe ich mir gedacht, deshalb nochmal: Nimm deine datalogger und spiel sie auf den Arduino. las das laufen, bis der Fehler auftritt. Lade dann die cardinfo auf den Arduino und gib bekannt, was der DANN ausgibt.

Jetzt habe ich verstanden was du meinst! Habe das Datalogger Beispiel grade durchlaufen lassen bis der Fehler aufgetreten ist und dann CardInfo geladen:

10:02:03.328 -> 
10:02:03.328 -> Initializing SD card...initialization failed. Things to check:
10:02:05.436 -> * is a card inserted?
10:02:05.484 -> * is your wiring correct?
10:02:05.484 -> * did you change the chipSelect pin to match your shield or module?
10:02:29.856 -> 
10:02:29.856 -> Initializing SD card...Wiring is correct and a card is present.
10:02:30.747 -> 
10:02:30.747 -> Card type:         SDHC
10:02:30.792 -> Clusters:          490466
10:02:30.839 -> Blocks x Cluster:  16
10:02:30.839 -> Total Blocks:      7847456
10:02:30.885 -> 
10:02:30.885 -> Volume type is:    FAT32
10:02:30.885 -> Volume size (Kb):  3923728
10:02:30.931 -> Volume size (Mb):  3831
10:02:30.978 -> Volume size (Gb):  3.74
10:02:30.978 -> 
10:02:30.978 -> Files found on the card (name, date and size in bytes): 
10:02:31.025 -> SYSTEM~1/     2021-02-18 17:53:14
10:02:31.071 ->   WPSETT~1.DAT  2021-02-18 17:53:14 12
10:02:31.119 ->   INDEXE~1      2021-02-18 17:53:14 76
10:02:31.166 -> LOG.TXT       2000-01-01 01:00:00 30784

Die Karte kann nicht auf Anhieb initialisiert werden. Das war bei mir bisher immer so wenn ich einen neuen Sketch geladen habe. Damit die Karte erkannt wird muss ich sie einmal rein und raus machen und dann resetten, was man in der Ausgabe sieht. Muss das so?

proasis: Die Karte kann nicht auf Anhieb initialisiert werden. Das war bei mir bisher immer so wenn ich einen neuen Sketch geladen habe. Damit die Karte erkannt wird muss ich sie einmal rein und raus machen und dann resetten, was man in der Ausgabe sieht. Muss das so?

Nein. Hast Du noch irgendwas an dem Aufbau dran? Kannst Du die Karte mal mit dem SD Formatter im overwrite-Modus formatieren? https://www.sdcard.org/downloads/formatter/

Ich kann mir auch vorstellen, das das card-Modul nen Schuß hat.

Danke für den Hinweis, das kommt einer Lösung ja schon einen Schritt näher. Ich habe die Karte (und auch noch eine andere, zum testen) mit dem verlinkten Tool formatiert und dann erneut das Datalogger example laufen lassen. Jetzt habe ich sofort error und es wird nichts mehr auf die karte geschrieben:

11:05:23.753 -> Initializing SD card...card initialized.
11:05:24.408 -> error opening datalog.txt
11:05:25.903 -> 358,349,348
11:05:26.510 -> error opening datalog.txt
11:05:27.116 -> error opening datalog.txt
11:05:27.678 -> error opening datalog.txt
11:05:28.287 -> error opening datalog.txt
11:05:28.897 -> error opening datalog.txt
11:05:29.503 -> error opening datalog.txt
11:05:30.111 -> error opening datalog.txt
11:05:30.719 -> error opening datalog.txt
11:05:31.328 -> error opening datalog.txt
11:05:31.935 -> error opening datalog.txt
11:05:32.546 -> error opening datalog.txt
11:05:33.157 -> error opening datalog.txt
11:05:33.719 -> error opening datalog.txt
11:05:34.331 -> error opening datalog.txt
11:05:34.939 -> error opening datalog.txt
11:05:35.546 -> error opening datalog.txt
11:05:36.154 -> error opening datalog.txt
11:05:36.765 -> error opening datalog.txt
11:05:37.328 -> error opening datalog.txt

CardInfo direkt darauf folgend geladen gibt folgendes aus:

11:08:11.288 -> 
11:08:11.288 -> Initializing SD card...initialization failed. Things to check:
11:08:13.436 -> * is a card inserted?
11:08:13.483 -> * is your wiring correct?
11:08:13.530 -> * did you change the chipSelect pin to match your shield or module?
11:08:30.110 -> 
11:08:30.110 -> Initializing SD card...Wiring is correct and a card is present.
11:08:30.906 -> 
11:08:30.906 -> Card type:         SDHC
11:08:30.906 -> Clusters:          122624
11:08:30.953 -> Blocks x Cluster:  64
11:08:30.953 -> Total Blocks:      7847936
11:08:31.000 -> 
11:08:31.000 -> Volume type is:    FAT32
11:08:31.049 -> Volume size (Kb):  3923968
11:08:31.049 -> Volume size (Mb):  3832
11:08:31.095 -> Volume size (Gb):  3.74
11:08:31.095 -> 
11:08:31.095 -> Files found on the card (name, date and size in bytes): 
11:08:31.190 -> SYSTEM~1/     2021-02-23 11:04:36
11:08:31.237 ->   INDEXE~1      2021-02-23 11:04:36 76

Initialisieren der Karte ist wieder nur durch raus und rein stecken + reset möglich. Eine Datei wird nun gar nicht mehr angelegt (nichts anderes heißt der error ja auch). Hat jemand eine Idee wie das mit dem Formatieren der Karte zusammen hängt?

Ist ein neuer Card Reader fällig?

Edit: Am arduino hängt nichts außer dem Card Reader. Alles ist so verdrahtet wie in meinem Post oben beschrieben.

proasis: Hat jemand eine Idee wie das mit dem Formatieren der Karte zusammen hängt?

Ist ein neuer Card Reader fällig?

Wie und ob das zusammenhängt muss man sehen. Installier mal bitte SDFat.lib https://github.com/greiman/SdFat In deren Beispielen gibt es ein "formatting" einmal ausführen und den datalogger nochmal laufen lassen.

Wenn das nicht geht, ist der Reader mit hoher Wahrscheinlichkeit das Problem

Installier mal bitte nach der SDFat.lib
In deren Beispielen gibt es ein “formatting”

“formatting” gibt folgendes aus:

11:51:03.030 -> 
11:51:03.030 -> default formatting
11:51:03.077 ->    1    2    3    4    5    6    7    8    9   10
11:51:03.122 ->    2    4    6    8   10   12   14   16   18   20
11:51:03.169 ->    3    6    9   12   15   18   21   24   27   30
11:51:03.265 ->    4    8   12   16   20   24   28   32   36   40
11:51:03.311 ->    5   10   15   20   25   30   35   40   45   50
11:51:03.359 ->    6   12   18   24   30   36   42   48   54   60
11:51:03.407 ->    7   14   21   28   35   42   49   56   63   70
11:51:03.456 ->    8   16   24   32   40   48   56   64   72   80
11:51:03.501 ->    9   18   27   36   45   54   63   72   81   90
11:51:03.547 ->   10   20   30   40   50   60   70   80   90  100
11:51:03.594 -> 
11:51:03.594 -> showpos
11:51:03.641 ->   +1   +2   +3   +4   +5   +6   +7   +8   +9  +10
11:51:03.688 ->   +2   +4   +6   +8  +10  +12  +14  +16  +18  +20
11:51:03.734 ->   +3   +6   +9  +12  +15  +18  +21  +24  +27  +30
11:51:03.782 ->   +4   +8  +12  +16  +20  +24  +28  +32  +36  +40
11:51:03.828 ->   +5  +10  +15  +20  +25  +30  +35  +40  +45  +50
11:51:03.875 ->   +6  +12  +18  +24  +30  +36  +42  +48  +54  +60
11:51:03.967 ->   +7  +14  +21  +28  +35  +42  +49  +56  +63  +70
11:51:04.013 ->   +8  +16  +24  +32  +40  +48  +56  +64  +72  +80
11:51:04.060 ->   +9  +18  +27  +36  +45  +54  +63  +72  +81  +90
11:51:04.108 ->  +10  +20  +30  +40  +50  +60  +70  +80  +90 +100
11:51:04.154 -> 
11:51:04.154 -> hex left showbase
11:51:04.154 -> 0x1  0x2  0x3  0x4  0x5  0x6  0x7  0x8  0x9  0xa 
11:51:04.249 -> 0x2  0x4  0x6  0x8  0xa  0xc  0xe  0x10 0x12 0x14
11:51:04.295 -> 0x3  0x6  0x9  0xc  0xf  0x12 0x15 0x18 0x1b 0x1e
11:51:04.343 -> 0x4  0x8  0xc  0x10 0x14 0x18 0x1c 0x20 0x24 0x28
11:51:04.389 -> 0x5  0xa  0xf  0x14 0x19 0x1e 0x23 0x28 0x2d 0x32
11:51:04.435 -> 0x6  0xc  0x12 0x18 0x1e 0x24 0x2a 0x30 0x36 0x3c
11:51:04.482 -> 0x7  0xe  0x15 0x1c 0x23 0x2a 0x31 0x38 0x3f 0x46
11:51:04.529 -> 0x8  0x10 0x18 0x20 0x28 0x30 0x38 0x40 0x48 0x50
11:51:04.575 -> 0x9  0x12 0x1b 0x24 0x2d 0x36 0x3f 0x48 0x51 0x5a
11:51:04.668 -> 0xa  0x14 0x1e 0x28 0x32 0x3c 0x46 0x50 0x5a 0x64
11:51:04.715 -> 
11:51:04.715 -> uppercase hex internal showbase fill('0')
11:51:04.762 -> 0X01 0X02 0X03 0X04 0X05 0X06 0X07 0X08 0X09 0X0A
11:51:04.808 -> 0X02 0X04 0X06 0X08 0X0A 0X0C 0X0E 0X10 0X12 0X14
11:51:04.856 -> 0X03 0X06 0X09 0X0C 0X0F 0X12 0X15 0X18 0X1B 0X1E
11:51:04.902 -> 0X04 0X08 0X0C 0X10 0X14 0X18 0X1C 0X20 0X24 0X28
11:51:04.950 -> 0X05 0X0A 0X0F 0X14 0X19 0X1E 0X23 0X28 0X2D 0X32
11:51:04.996 -> 0X06 0X0C 0X12 0X18 0X1E 0X24 0X2A 0X30 0X36 0X3C
11:51:05.043 -> 0X07 0X0E 0X15 0X1C 0X23 0X2A 0X31 0X38 0X3F 0X46
11:51:05.138 -> 0X08 0X10 0X18 0X20 0X28 0X30 0X38 0X40 0X48 0X50
11:51:05.185 -> 0X09 0X12 0X1B 0X24 0X2D 0X36 0X3F 0X48 0X51 0X5A
11:51:05.232 -> 0X0A 0X14 0X1E 0X28 0X32 0X3C 0X46 0X50 0X5A 0X64
11:51:05.278 -> 
11:51:05.278 -> showDate example
11:51:05.278 -> 07/04/2011
11:51:05.326 -> 12/25/2011

Beim anschließenden durchlauf des Datalogger example tritt das gleiche Fehlerbild auf wie zuvor:

11:53:25.022 -> Initializing SD card...Card failed, or not present
11:53:34.769 -> Initializing SD card...card initialized.
11:53:36.176 -> error opening datalog.txt
11:53:37.676 -> 391,379,374
11:53:38.284 -> error opening datalog.txt
11:53:38.896 -> error opening datalog.txt
11:53:39.504 -> error opening datalog.txt
11:53:40.110 -> error opening datalog.txt
11:53:40.672 -> error opening datalog.txt
11:53:41.284 -> error opening datalog.txt
11:53:41.895 -> error opening datalog.txt
11:53:42.506 -> error opening datalog.txt
11:53:43.111 -> error opening datalog.txt
11:53:43.674 -> error opening datalog.txt
11:53:44.283 -> error opening datalog.txt
11:53:44.893 -> error opening datalog.txt

Initialisierung der Karte ist wieder nur durch ein und ausstecken der Karte + reset möglich, danach nur error und es wird keine txt Datei angelegt.

Dann werde ich wohl mal einen neuen card reader bestellen. Kann jemand ein gutes Modul empfehlen?

proasis:
Kann jemand ein gutes Modul empfehlen?

Da ich nur das Kombimodul mit dem Netzwerkanschluß nutze, kann ich da leider nicht helfen …