SD Shield

Hallo zusammen,

ich habe mir ein SD spielt gekauft:https://www.conrad.de/de/makerfactory-sd-karten-logging-shield-fuer-arduino-2-tlg-1612765.html

Ich möchte nun den Serial Monitor auf diese SD Karte schreiben eine andere Anleitung hat mir aus diesem Forum nicht geholfen. Ich habe ein Arduino Uno und die SD Karte ist in in FAT16 formatiert(2GB).

Vielen Dank schonmal :slight_smile: :slight_smile:

Hast Du das, was in der Anleitung bei Conrad steht (SD-Info) schon durchgeführt? Mit welchem Ergebnis?

Schaue Dir mal die Lib SDFat an und die Beispiele dazu.

Gruß Tommy

Dieses Shield ist jenem von Adafruit sehr ähnlich.
Es gibt ein ausführliches Tutorial hier: Shield Overview | Adafruit Data Logger Shield | Adafruit Learning System

Leider hat mir das Tutorial nicht weitergeholfen da, das leider nicht das gleiche Board ist. Im ersten Moment ja aber du du musst die Werbung von Conrad wegblicken.

Die Anleitung von Conrad hat mir nicht weitergeholfen, da die Beschriftung nicht auf mein Board passt.

Ich habe folgende Beschriftung: GND,3.3,+5,CS,MOSI,SCK,MISO.

:slight_smile:

Vielleicht gibt es einen andere Tutorial oder so.

Mach bitte mal ein Foto von deinem Board.
Ein Foto, auf dem man die Beschriftung (und alles andere) gut erkennen kann.

Es gibt nicht so viele verschiedene Möglichkeiten, wie man eine RTC (Real Time Clock) DS1302 und eine SD-Karte ansprechen kann.
Die SD-Karte über SPI (bei Arduino UNO: D11, D12, D13 und CS)
und die RTC mit I2C (bei Arduino UNO: A4, A5).
Dann braucht es noch einen Spannungsregler und einen Pegelwandler.
Das alles ist auf diesen Schields drauf.

Ich habe selber 3 Stück in Verwendung, die sind von unterschiedlichen Quellen und die Platinen haben unterschiedliche Farben und mal sind irgendwelche LEDs ein wenig weiter links und ein anderes mal etwas weiter rechts, aber die "inneren Werte" sind gleich, zumindest bei den Teilen, die ich habe.

Aber natürlich kann es sein, dass du ein etwas anderes Shield hast, dashalb: mach ein Foto.

Also hier das Foto. Ich möchte nur den Monitor als Datei auf die SD schreiben. Ich möchte keine Uhrzeit oder ist die irgendwie notwendig

Oh, das ist ja gar nicht das Shield aus deinem Link.
(Bild aus dem Link - siehe Anfangspost):

Im Gegensatz dazu dein Bild:


Das ist vielleich so etwas Ähnliches, scheint aber weder RTC noch Pegelwandler zu besitzen.
Oder ist auf der Unterseite der Platine noch etwas verbaut?

Da das Produkt ausverkauft ist musst oben rechts auf das + drücken dann siehst du das wirkliche produkt

Ah, ja.
Etwas verwirrend: das nennt sich "SD-Karten Logging-Shield für Arduino" und ist aber eigentlich kein Shield, denn Shields lassen sich normalerweise auf ein Controller-Board (z.B. Arduino UNO) aufstecken, das ist hier eher nicht der Fall.
Aber egal.
Wie Tommy56 schon geschrieben hat, solltest du zuerst mal einen Beispiel-Sketch erfolgreich zum Laufen bringen. Zum Beispiel so:

In der Arduino-IDE wähle Menü: Datei / Beispiele / SD / CardInfo

Normalerweise ist dort als CS (Chip Select) Pin 4 eingestellt.
Deshalb musst du entweder das Kabel "CS" auf Pin 4 stecken oder
const int chipSelect = 4;
ändern auf
const int chipSelect = 10;

Dieses Beispiel solltest du zuerst ausprobieren und zum Laufen bringen.
Am seriellen Monitor bekommst du Infos über die eingelegte SD-Card.

Erst danach kann es weitergehen.

Aus den verschiedenen Beispielen ("SD Basics" und "Serial Basics") hab ich folgendes "zusammengestellt":
Die serielle Schnittstelle wird eingelesen und immer bei Zeilenende wird diese Zeile auf die SD-Karte geschrieben. Das "Zeilenendzeichen" muss auf "newLine" eingestellt werden.

/*
  Logger: Serial to SD Card

  Circuit:
  SD card attached to SPI bus as follows:
    MOSI - pin 11
    MISO - pin 12
    CLK  - pin 13
    CS   - pin 10

  Die Daten der seriellen Schnittstelle werden bis zum Zeilenende
  eingelesen und dann auf die SD-Card geschrieben.
  Am Zeilenende muss <newLine> stehen (Line Feed, LF, \n, ASCII: 10).
  Stelle am seriellen Monitor "Neue Zeile" ein.
*/

#include <SD.h>
const byte chipSelect = 10;

const byte SERIAL_BUFFER_SIZE = 31;     // die maximale Zeilenlänge +1. entsprechend anpassen
char serialBuffer[SERIAL_BUFFER_SIZE];


void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card... ");
  pinMode(chipSelect, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("card failed, or not present");
    // don't do anything more:
    while (1) {}
  }
  Serial.println("card initialized.");
}


void loop() {
  if (readSerial(Serial)) {
    writeToSdCard();
  }
}


// So lange die seriellen Daten einlesen bis das Endzeichen (LF) kommt:
bool readSerial(Stream& stream) {    // liefert true wenn LF eingelesen wurde
  static byte index;
  while (stream.available()) {
    char c = stream.read();
    if (c == '\n' && index > 0) {       // wenn LF eingelesen und String laenger als 0 ist
      serialBuffer[index] = '\0';       // String terminieren
      index = 0;
      return true;               // melden dass String fertig eingelesen wurde
    }
    else if (index < SERIAL_BUFFER_SIZE - 1) {   // solange noch Platz im Puffer ist...
      serialBuffer[index++] = c;    // das Zeichen abspeichern und Index inkrementieren
    }
  }
  return false;        // noch nicht fertig (Zeilenende noch nicht erreicht)
}


void writeToSdCard(void) {
  // open the file. note that only one file can be open at a time
  // filename may not have more than 8.3 characters
  File dataFile = SD.open("serlog.txt", FILE_WRITE);
  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(serialBuffer);
    dataFile.close();
    Serial.print("written to card: ");  // debug
    Serial.println(serialBuffer);       // debug
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening serlog.txt");
  }
}

Den Code musst du eventuell noch an deine Bedürfnisse anpassen. Vor allem die maximale Zeilenlänge SERIAL_BUFFER_SIZE ist wichtig.
Die Frage ist auch, welche Daten du loggen willst. Das obige Beispiel ist für "menschenlesbare" Daten geeignet.

Also das Beispiel funktioniert und die SD karte wird auch erkannt.
Jetzt du deinem Code, er zeigt an das er die Sd karte erkannt hat aber er schreibt die Daten eines Ultraschallsensors nicht auf die Sd karte.

Schreibt er beim Beispiel von uxomm?

Lade Dir mal diesen SD-Formatter runter und formatiere die Karte damit.

Wenn das alles nichts bringt, probiere mal die Lib SdFat.

Gruß Tommy

pronicolas:
Jetzt zu deinem Code, er zeigt an das er die Sd karte erkannt hat aber er schreibt die Daten eines Ultraschallsensors nicht auf die Sd karte.

Welchen Ultraschallsensor verwendest du? Hast du vielleicht einen Link?
Welche Daten liefert dieser und in welcher Form? Hast du ein Beispiel?

Der Code aus #8 ist dafür gedacht, Daten, die über die serielle Schnittstellt kommen, auf die SD-Karte zu schreiben. Jede Zeile muss dabei mit LF (Line Feed) beendet werden.
Wenn du das ausprobieren willst, dann lade den Sketch auf deinen UNO, öffne den Seriellen Monitor, stelle dort das Zeilenende auf "Neue Zeile" und die "Geschwindigkeit" auf 9600 Baud. Dann tippe einfach ein paar kurze Zeilen im Seriellen Monitor der Arduino-IDE ein.
Diese sollten dann in die Datei "SERLOG.TXT" auf die SD-Karte geschrieben werden.

Hallo, es ist dieser Ultraschallsensor:https://www.amazon.de/Aukru-Ultraschall-HC-SR04-Abstand-Sensor/dp/B00LSJWRXU/ref=sr_1_6?ie=UTF8&qid=1536862333&sr=8-6&keywords=ultraschallsensor.
Der Sensor zeigt im Monitor normalerweise einfach die Entfernung in Zentimeter an und diese Zahlen sollen dann auf dem Sensor gespeichert werden.
Hier der Code.

/*
  Logger: Serial to SD Card

  Circuit:
  SD card attached to SPI bus as follows:
    MOSI - pin 11
    MISO - pin 12
    CLK  - pin 13
    CS   - pin 10

  Die Daten der seriellen Schnittstelle werden bis zum Zeilenende
  eingelesen und dann auf die SD-Card geschrieben.
  Am Zeilenende muss <newLine> stehen (Line Feed, LF, \n, ASCII: 10).
  Stelle am seriellen Monitor "Neue Zeile" ein.
*/

#include <SD.h>
const byte chipSelect = 10;

const byte SERIAL_BUFFER_SIZE = 31;     // die maximale Zeilenlänge +1. entsprechend anpassen
char serialBuffer[SERIAL_BUFFER_SIZE];
int trigger=7; 
int echo=6;  
long dauer=0;  
long entfernung=0;


void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card... ");
  pinMode(chipSelect, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("card failed, or not present");
    // don't do anything more:
    while (1) {}
  }
  Serial.println("card initialized.");
  pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT);
}


void loop() {
  if (readSerial(Serial)) {
    writeToSdCard();
  }
}



bool readSerial(Stream& stream) {   
  static byte index;
  while (stream.available()) {
    char c = stream.read();
    if (c == '\n' && index > 0) {       
      serialBuffer[index] = '\0';      
      index = 0;
      return true;             
    }
    else if (index < SERIAL_BUFFER_SIZE - 1) {   
      serialBuffer[index++] = c;    
    }
  }
  return false;       
}


void writeToSdCard(void) {
  
  File dataFile = SD.open("serlog.txt", FILE_WRITE);
  
  if (dataFile) {
    dataFile.println(serialBuffer);
    dataFile.close();
    Serial.print("written to card: ");  
    Serial.println(serialBuffer);       
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening serlog.txt");
  }
 digitalWrite(trigger, LOW); 
digitalWrite(trigger, HIGH); 
delay(10); 
digitalWrite(trigger, LOW);
dauer = pulseIn(echo, HIGH); 
entfernung = (dauer/2) * 0.03432; 
if (entfernung >= 500 || entfernung <= 0) 
{
Serial.println("Kein Messwert"); 
}
else //  Ansonsten…
{
Serial.print(entfernung);  
Serial.println(" cm"); 
}
delay(1000); 
}

Naja, das hat mit dem seriellen Monitor eigentlich kaum etwas zu tun.
So wie es aussieht möchtest du die Ergebnisse der Ultraschall-Entfernungsmessung auf die SD-Karte schreiben.
Das ginge etwa so:

/*
  Logger: Ultraschall-Sensor to SD Card

  Circuit:
  SD card attached to SPI bus as follows:
    MOSI - pin 11
    MISO - pin 12
    CLK  - pin 13
    CS   - pin 10

*/

#include <SD.h>
const byte chipSelect = 10;

const byte trigger = 7;
const byte echo = 6;
long dauer = 0;
long entfernung = 0;


void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card... ");
  pinMode(chipSelect, OUTPUT);

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("card failed, or not present");
    // don't do anything more:
    while (1) {}
  }
  Serial.println("card initialized.");
  pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
  pinMode(echo, INPUT);
}


void loop() {
  digitalWrite(trigger, HIGH);
  delay(10);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer / 2) * 0.03432;
  if (entfernung >= 500 || entfernung <= 0) {
    Serial.println("Kein Messwert");
  }
  else {
    Serial.print(entfernung);
    Serial.println(" cm");
    writeToSdCard(entfernung);
  }
  delay(1000);
}


void writeToSdCard(long distance) {
  File dataFile = SD.open("log.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.println(distance);
    dataFile.close();
    Serial.print("written to card: ");  // debug
    Serial.println(distance);           // debug
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening serlog.txt");
  }
}

Aber das ist im Prinzip das Beispiel: Menü / Beispiele / SD / Datalogger

Super jetzt funktioniert. Vielen Dank