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).
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.
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.
Das ist vielleich so etwas Ähnliches, scheint aber weder RTC noch Pegelwandler zu besitzen.
Oder ist auf der Unterseite der Platine noch etwas verbaut?
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.
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.
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