Wie bringe ich Daten auf die SD-Karte?

Hallo zusammen.
Bin gänzlich neu hier und gleich folgende Frage zu einem ersten Projekt "Ultraschallsensor auslesen und auf SD-Karte schreiben":

Ich habe nach vielem Beispiele kopieren und versuchen in einigen Erwähnungen, Seiten und Clips gesehen, dass man die SD-Karte zuerst "öffnen" muss (digital versteht sich :)), damit sie "bereit" ist, beschrieben zu werden - danach mit "close" wieder schliessen.

Was mache ich alles falsch? Alle läuft einwandfrei, nur kriege ich keine USS-Werte auf die SD-Karte....

Ich stelle mal den ganzen Code rein - mit sehr vielen Ausklammerungen, aber wollte die Beispiele nicht erneut suchen, falls ich etwas ändere:

//Libraries importieren falls nötig oder gewünscht :)
#include <SPI.h>
#include <SD.h>
#include <Arduino.h>
#include <HCSR04.h>

//Deklarieren der Variablen und an welchen Pins die angeschlossen sind
HCSR04 hc(9, 8);

int LEDrt = 5;
int zaehler = 0;
int tiltsensor = 2;
int tiltVar;
int LEDtilt = 7;
const int buzzer = 4;
int i = 0;
const int chipSelect = 10;  // CS, wie auch MISO, MOSI, SCK ist vom Board (hier Arduino UNO R3) gem. Pinlayout gegeben!
int intArray[10];
int intArrAbstand[10];



  // ##################################################################
  // ##################################################################
  // ##################### START - VOID SETUP #########################
  // ##################################################################
  // ##################################################################

//Deklarieren aller Pins mit deren Funktion am Pin (IN- oder OUTPUT)
void setup() {
  // put your setup code here, to run once:
  pinMode(LEDrt, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(tiltsensor, INPUT);
  pinMode(LEDtilt, OUTPUT);
  digitalWrite(tiltsensor, HIGH);

  // ##################################################################
  // ##################### START - SD-Kartenleser #####################
  // ##################################################################

  // Text-Datei auf der SD-Karte erstellen. Hier der Name "integers.txt"
  String myFile = "Ultraschallwerte.txt";  // for ESP32: "/integers.txt";
  // int intArrAbstand[10] = { 442, 4124, 41242, 171, 12134, 516, 44, 11, 0, 7777 };
  //int intArrAbstand[10] = { 11, 22, 33, 171, 44, 55, 66, 33, 0, 1 };

  // Die Kommunikationsgeschwindigkeit des Arduinos mit der SD-Karte definieren
  Serial.begin(115200);
  //  while(!Serial){} // needed for some boards
  //  delay(1000); // helps in case of incomplete output on serial monitor

  // Feststellen, ob SD-Karte vorhanden ist
  if (!SD.begin(chipSelect)) {
    Serial.println("SD-Karte nicht vorhanden");  // Ausgabetext wenn nicht vorhanden
    while (1)
      ;
  } else {
    Serial.println("SD-Card initialisiert!");  // Ausgabetext, wenn SD-Karte vorhanden ist und auch initialisiert wurde
  }

  // Text-Datei entfernen bzw. Inhalt löschen (?? Hä? Wüki?)
  //SD.remove(myFile);

  // Text-Datei erstellen und fürs Beschreiben vorbereiten :D
  File dataFile = SD.open(myFile, FILE_WRITE);

  // Wenn Text-Datei erstellen ("open"), dann schreibe die Daten auf die SD-Karte
  if (dataFile) {
    dataFile.println("Text-Datei hiermit ready.");
    dataFile.close();
    Serial.println("Daten wurden auf SD-Karte geschrieben.");
  } else {
    Serial.println("Konnte Text-Datei nicht öffnen!");
  }

  // ##################################################################
  // ##################### START - FUNKTIONEN #########################
  // ##################################################################

// void valueAbstandSchreiben(int Abstand) {
//    dataFile = SD.open(myFile, FILE_WRITE);

//         int Abstand = 
//         float temperature = dht.readTemperature();
//         float humidity = dht.readHumidity();
//         float pressure = bmp.readPressure() / 100.0F;
//         float uvLevel = analogRead(A0);
        
//         dataFile.print("Temperature: ");
//         dataFile.print(temperature);
//         dataFile.println(" °C");
//         Serial.print("Temperature: ");
//         Serial.print(temperature);
//         Serial.println(" °C");

//   dataFile.close();
//   delay(1000);


//   dataFile.print(Abstand);
//   dataFile.println("  cm");
//   delay(20);
// }
  // ##################################################################
  // ##################### ENDE - FUNKTIONEN #########################
  // ##################################################################

  // if (dataFile) {
  //   for (int i = 0; i < 10; i++) {
  //     //dataFile.println(intArray[i]);
  //     dataFile.println(intArrAbstand[10]);
  //   }
  //   dataFile.close();
  //   Serial.println("Daten wurden auf SD-Karte geschrieben.");
  // } else {
  //   Serial.println("Konnte Text-Datei nicht öffnen!");
  // }
  // ##################################################################
  // ##################### ENDE - SD-Kartenleser #####################
  // ##################################################################

// Die Kommunikationsgeschwindigkeit des Arduinos für die Ausgabe auf dem "Serieller Monitor" der Software Arduino-IDE definieren
  Serial.begin(9600);
  tone(buzzer, 1000, 100);
  delay(50);

  while (zaehler < 3) {
    digitalWrite(LEDrt, HIGH);
    delay(250);
    digitalWrite(LEDrt, LOW);
    delay(250);

    zaehler++;
  }

}

  // ##################################################################
  // ##################################################################
  // ##################### ENDE - VOID SETUP #########################
  // ##################################################################
  // ##################################################################



void loop() {
  

  tiltVar = digitalRead(tiltsensor);
  delay(20);

  if (tiltVar == LOW) {

    digitalWrite(LEDtilt, LOW);


    while (i < 5) {
      delay(100);
      digitalWrite(LEDrt, HIGH);
      delay(50);
      digitalWrite(LEDrt, LOW);
      delay(50);
      i++;
    }

  }

  else {

    digitalWrite(LEDtilt, HIGH);


    digitalWrite(LEDrt, HIGH);
    delay(50);
    digitalWrite(LEDrt, LOW);
    delay(50);

    long Abstand = hc.dist();
    delay(20);

  dataFile = SD.open(myFile, FILE_WRITE);

        
        dataFile.println("Abstand: ");
        dataFile.print(Abstand);
        dataFile.println("  cm");

        Serial.println("Distanz: ");
        Serial.print(Abstand);
        Serial.println(" Zentimeter");

  dataFile.close();
  delay(1000);

    // if (Abstand != "") {
    //   valueAbstandSchreiben(Abstand);
    // };

    Serial.println(Abstand);  //return current distance (cm) in serial
    delay(60);                // we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal.

    //intArrAbstand[10] = { Abstand };

    switch (Abstand) {
      case 150 ... 200:
        tone(buzzer, 500, 20);
        //delay(500);
        digitalWrite(LEDrt, HIGH);
        delay(500);
        digitalWrite(LEDrt, LOW);
        delay(500);
        break;

      case 100 ... 149:
        tone(buzzer, 600, 20);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(500);
        digitalWrite(LEDrt, LOW);
        delay(500);
        break;

      case 50 ... 99:
        tone(buzzer, 700, 20);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(400);
        digitalWrite(LEDrt, LOW);
        delay(400);

        break;

      case 40 ... 49:
        tone(buzzer, 800, 20);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(250);
        digitalWrite(LEDrt, LOW);
        delay(250);

        break;

      case 30 ... 39:
        tone(buzzer, 900, 20);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(150);
        digitalWrite(LEDrt, LOW);
        delay(150);
        break;

      case 20 ... 29:
        tone(buzzer, 1000);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(100);
        digitalWrite(LEDrt, LOW);
        delay(100);
        break;
    }

    i = 0;
  }




  //   Serial.println("The distance to obstacles in front is: ");

  //  long Abstand = ultrasonic.MeasureInCentimeters(); // two measurements should keep an interval
  //  Serial.print(Abstand);//0~400cm
  //  Serial.println(" cm");
  //  delay(250);
}



Hey,
funktioniert diese Zeile denn? dataFile.println("Text-Datei hiermit ready."); also wird der Text auf die SD Karte geschrieben?
LG

Ich kann das noch nicht testen, weil es allg. Fehler hat...dachte aber - naja, schien mir logisch - dass es mit dieser einen Zeile dort auch genügen sollte...

Kommen dem im Seriellen Monitor Fehler?

Ich muss aber noch erwähnen, dass die SDKarte zuvor (ganz zu Beginn), einzelne Werte über Array schon funktioniert hat wie im Code ersichtlich.

Mein Problem bestand/besteht "nur" darin, wie ich oder wo ich welche SD-Karten-Befehle wo und wie platzieren muss...kapier' das echt nicht... und dies seit 2 Tagen Versuchen...

Nein.

Also wenn du den Code einmal laufen lässt und dann die sd Karte ausließt existiert die Datei dann und ist das hier drauf? Text-Datei hiermit ready.

Ich versuche mal alles ohne Auslesen zurückzustellen, also nur die Initialisierung etc der SDKarte....melde mich dann erneut.

Danke aber soweit mal..

Lg

Also:
Mit u.g. zurückgestelltem Code, kriege ich korrekt den Array von oberhalb, ohne Fehler im Ser. Monitor:


//Libraries importieren falls nötig oder gewünscht :)
#include <SPI.h>
#include <SD.h>
#include <Arduino.h>
#include <HCSR04.h>

//Deklarieren der Variablen und an welchen Pins die angeschlossen sind
HCSR04 hc(9, 8);

int LEDrt = 5;
int zaehler = 0;
int tiltsensor = 2;
int tiltVar;
int LEDtilt = 7;
const int buzzer = 4;
int i = 0;
const int chipSelect = 10;  // CS, wie auch MISO, MOSI, SCK ist vom Board (hier Arduino UNO R3) gem. Pinlayout gegeben!
int intArray[10];
int intArrAbstand[10];



  // ##################################################################
  // ##################################################################
  // ##################### START - VOID SETUP #########################
  // ##################################################################
  // ##################################################################

//Deklarieren aller Pins mit deren Funktion am Pin (IN- oder OUTPUT)
void setup() {
  // put your setup code here, to run once:
  pinMode(LEDrt, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(tiltsensor, INPUT);
  pinMode(LEDtilt, OUTPUT);
  digitalWrite(tiltsensor, HIGH);

  // ##################################################################
  // ##################### START - SD-Kartenleser #####################
  // ##################################################################

  // Text-Datei auf der SD-Karte erstellen. Hier der Name "integers.txt"
  String myFile = "integers.txt";  // for ESP32: "/integers.txt";
  int intArray[10] = { 442, 4124, 41242, 171, 12134, 516, 44, 11, 0, 7777 };
  //int intArrAbstand[10] = { 11, 22, 33, 171, 44, 55, 66, 33, 0, 1 };

  // Die Kommunikationsgeschwindigkeit des Arduinos mit der SD-Karte definieren
  Serial.begin(115200);
  //  while(!Serial){} // needed for some boards
  //  delay(1000); // helps in case of incomplete output on serial monitor

  // Feststellen, ob SD-Karte vorhanden ist
  if (!SD.begin(chipSelect)) {
    Serial.println("SD-Karte nicht vorhanden");  // Ausgabetext wenn nicht vorhanden
    while (1)
      ;
  } else {
    Serial.println("SD-Card initialisiert!");  // Ausgabetext, wenn SD-Karte vorhanden ist und auch initialisiert wurde
  }

  // Text-Datei entfernen bzw. Inhalt löschen (?? Hä? Wüki?)
  SD.remove(myFile);

  // Text-Datei erstellen und fürs Beschreiben vorbereiten :D
  File dataFile = SD.open(myFile, FILE_WRITE);

  // Wenn Text-Datei erstellen ("open"), dann schreibe die Daten auf die SD-Karte
  //if (dataFile) {
    //dataFile.println("Text-Datei hiermit ready.");
    if (dataFile) {
     for (int i = 0; i < 10; i++) {
       dataFile.println(intArray[i]);
  //     dataFile.println(intArrAbstand[10]);
     }
    dataFile.close();
    Serial.println("Daten wurden auf SD-Karte geschrieben.");
  } else {
    Serial.println("Konnte Text-Datei nicht öffnen!");
  }

  // ##################################################################
  // ##################### START - FUNKTIONEN #########################
  // ##################################################################

// void valueAbstandSchreiben(int Abstand) {
//    dataFile = SD.open(myFile, FILE_WRITE);

//         int Abstand = 
//         float temperature = dht.readTemperature();
//         float humidity = dht.readHumidity();
//         float pressure = bmp.readPressure() / 100.0F;
//         float uvLevel = analogRead(A0);
        
//         dataFile.print("Temperature: ");
//         dataFile.print(temperature);
//         dataFile.println(" °C");
//         Serial.print("Temperature: ");
//         Serial.print(temperature);
//         Serial.println(" °C");

//   dataFile.close();
//   delay(1000);


//   dataFile.print(Abstand);
//   dataFile.println("  cm");
//   delay(20);
// }
  // ##################################################################
  // ##################### ENDE - FUNKTIONEN #########################
  // ##################################################################

  // if (dataFile) {
  //   for (int i = 0; i < 10; i++) {
  //     //dataFile.println(intArray[i]);
  //     dataFile.println(intArrAbstand[10]);
  //   }
  //   dataFile.close();
  //   Serial.println("Daten wurden auf SD-Karte geschrieben.");
  // } else {
  //   Serial.println("Konnte Text-Datei nicht öffnen!");
  // }
  // ##################################################################
  // ##################### ENDE - SD-Kartenleser #####################
  // ##################################################################

// Die Kommunikationsgeschwindigkeit des Arduinos für die Ausgabe auf dem "Serieller Monitor" der Software Arduino-IDE definieren
  Serial.begin(9600);
  tone(buzzer, 1000, 100);
  delay(50);

  while (zaehler < 3) {
    digitalWrite(LEDrt, HIGH);
    delay(250);
    digitalWrite(LEDrt, LOW);
    delay(250);

    zaehler++;
  }

}

  // ##################################################################
  // ##################################################################
  // ##################### ENDE - VOID SETUP #########################
  // ##################################################################
  // ##################################################################



void loop() {
  

  tiltVar = digitalRead(tiltsensor);
  delay(20);

  if (tiltVar == LOW) {

    digitalWrite(LEDtilt, LOW);


    while (i < 5) {
      delay(100);
      digitalWrite(LEDrt, HIGH);
      delay(50);
      digitalWrite(LEDrt, LOW);
      delay(50);
      i++;
    }

  }

  else {

    digitalWrite(LEDtilt, HIGH);


    digitalWrite(LEDrt, HIGH);
    delay(50);
    digitalWrite(LEDrt, LOW);
    delay(50);

    long Abstand = hc.dist();
    delay(20);

  // dataFile = SD.open(myFile, FILE_WRITE);

        
  //       dataFile.println("Abstand: ");
  //       dataFile.print(Abstand);
  //       dataFile.println("  cm");

  //       Serial.println("Distanz: ");
  //       Serial.print(Abstand);
  //       Serial.println(" Zentimeter");

  // dataFile.close();
  // delay(1000);

    // if (Abstand != "") {
    //   valueAbstandSchreiben(Abstand);
    // };

    Serial.println(Abstand);  //return current distance (cm) in serial
    delay(60);                // we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal.

    //intArrAbstand[10] = { Abstand };

    switch (Abstand) {
      case 150 ... 200:
        tone(buzzer, 500, 20);
        //delay(500);
        digitalWrite(LEDrt, HIGH);
        delay(500);
        digitalWrite(LEDrt, LOW);
        delay(500);
        break;

      case 100 ... 149:
        tone(buzzer, 600, 20);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(500);
        digitalWrite(LEDrt, LOW);
        delay(500);
        break;

      case 50 ... 99:
        tone(buzzer, 700, 20);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(400);
        digitalWrite(LEDrt, LOW);
        delay(400);

        break;

      case 40 ... 49:
        tone(buzzer, 800, 20);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(250);
        digitalWrite(LEDrt, LOW);
        delay(250);

        break;

      case 30 ... 39:
        tone(buzzer, 900, 20);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(150);
        digitalWrite(LEDrt, LOW);
        delay(150);
        break;

      case 20 ... 29:
        tone(buzzer, 1000);
        delay(10);
        digitalWrite(LEDrt, HIGH);
        delay(100);
        digitalWrite(LEDrt, LOW);
        delay(100);
        break;
    }

    i = 0;
  }




  //   Serial.println("The distance to obstacles in front is: ");

  //  long Abstand = ultrasonic.MeasureInCentimeters(); // two measurements should keep an interval
  //  Serial.print(Abstand);//0~400cm
  //  Serial.println(" cm");
  //  delay(250);
}



Bekommst du den Array damit denn auch auf die SD Karte?

Ja, der 2. Screenshot

Wenn du das komplette Array auf die SD schreiben willst, brauchst du nur den Array Namen zu nehmen. In deinem Fall ist es "intArray".
Und wie du mit den Anweisungen für den SD-Reader umgehen musst, kannst du doch in der Library zum Reader nachlesen. Da gibt es immer Beispiele.

Hallo,

eine Frage zur Selbstbeantwortung.
Wie stellst du sicher das du dem Board und damit der Karte nicht in dem Moment den Strom entziehst, wenn sie gerade beim Schreiben ist? Man muss sicherstellen, dass man die Karte entfernt o.ä. wenn das File geschlossen ist und kein Zugriff mehr stattfindet. Ansonsten gibt es Datenmüll. Oder zieht jemand einen USB Stick während des Lese/Schreibvorgangs aus dem Rechner?

Programmiere dir einen Taster der als Toggle Switch funktioniert. Damit gibst du generell SD Karten Zugriffe frei oder sperrst diese. Besser noch mit Led Anzeige o.ä.. Damit kann man im laufenden Betrieb die Karte ziehen und nach einstecken macht man ein Init und weiter gehts.

ohne Fehler im Ser. Monitor

Na ja. Es sind nur Teile deines festen Texts ("Daten wurden auf SD-Karte geschrieben.")
verstümmelt worden. Da gilt generell: Wenn Unerklärliches passiert, kann man nicht wissen, wie schlimm es ist.

Je nach SD Library kann sein, dass

  • Datentyp String bei myFile nicht geht (Da sollte allerdings schon der Compiler meckern)
  • Der Dateiname nur 8.3 Buchhstaben lang sein darf. ("integers.txt" gut, "Ultraschallwerte.txt" schlecht)

Ich würde lieber ein kleines Beispiel das funktioniert, langsam erweitern, als ein großes durch Kommentarzeilen versuchen in den Griff zu kriegen.

Hallo.
Die Beispiele im Reader sind einfach zur Init. der SDK - und dies überall. Aber was man machen muss, um Daten vom Loop dort hineinzubringen auf die SDK...das finde ich leider nirgends...

Ok, werde dies nochmals von vorne angehen...

Danke für eure Hilfe schon mal.

Grüsse euch.

Und zu den Kommentarzeilen möcht ich noch anmerken, das sich das keiner antun wird, es zu lesen. Für deinen @deebee77 Fall solltest du besser nummerierte Kopien der Sketche anlegen und nur das im aktuellen Sketch lassen, was du tatsächlich brauchst.
Merke, das wird deutlich übersichtlicher. Auch für deine Helfer.

Welchen µC hast du? Die SD karte braucht 3.3V (nicht 5)

Na dann lies mal Hier nach.

Es gibt auch Boards für 5Volt mit Levelshifter.
Ok, wir wissen nicht, was verwendet wird.