Hallo,
wenn der Taster nicht gedrückt wird, erhalte ich im Sekundentakt
“re-open”
“error re-opening test.txt”
Dürfte eigentlicht nicht sein. Denn die Karte sollte ausgelesen werden.
Wenn ich den Taster drücke unter Berücksichtigung der noch 1sec Verzögerung, dann wird etwas ordentlich geschrieben und richtig gelesen. Wenn ich nochmal drücke erhalte ich allerdings
“initialization failed”
Außerdem bleibt die LED13 irgendwann permanent an und geht nicht mehr aus bis zu einem Reset.
Wenn ich die Tasterabfrage mit if weglasse und alles wie aus dem Bsp. im setup() belasse funktioniert das. Wo liegt mein Denkfehler? Stört eine mir unbekannte Interruptfunktion den Ablauf?
/*
Arduino Mega 2560
SD card test
This example shows how use the utility libraries on which the'
SD library is based in order to get info about your SD card.
Very useful for testing a card when you're not sure whether its working or not.
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
** CS - depends on your SD card shield or module.
Pin 4 used here for consistency with other Arduino examples
created 28 Mar 2011
by Limor Fried
modified 9 Apr 2012
by Tom Igoe
*/
// include the SD library:
#include <SD.h>
int LED = 13; // an Pin 13
int analogPin = 0; // Poti am analog pin A0
int val = 0; // Potiwert speichern in val
int Zeitstempel = 0; // aktueller millis() Wert
int Taster = 44; // Taster an Pin 44
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
File myFile;
String valString = "";
String ZeitstempelString = "";
// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
const int chipSelect = 4;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(LED, OUTPUT); // LED Pins auf Ausgang setzen
digitalWrite(LED, HIGH); // kurzer LED Funktionstest
delay(500);
digitalWrite(LED, LOW); // Ende des LED Funktionstest
// digitalen Eingang mit PullUp aktivieren
pinMode(Taster, INPUT); // setzt pin als Eingang
digitalWrite(Taster, HIGH); // aktiviert den PullUp Widerstand
Serial.print("\nInitializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(53, OUTPUT); // change this to 53 on a mega, normal 10
// we'll use the initialization code from the utility libraries
// since we're just testing if the card is working!
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card is inserted?");
Serial.println("* Is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
return;
} else {
Serial.println("Wiring is correct and a card is present.");
}
// print the type of card
Serial.print("\nCard type: ");
switch(card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
return;
}
// print the type and size of the first FAT-type volume
uint32_t volumesize;
Serial.print("\nVolume type is FAT");
Serial.println(volume.fatType(), DEC);
Serial.println();
volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
volumesize *= volume.clusterCount(); // we'll have a lot of clusters
volumesize *= 512; // SD card blocks are always 512 bytes
Serial.print("Volume size (bytes): ");
Serial.println(volumesize);
Serial.print("Volume size (Kbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Mbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) {
val = analogRead(analogPin);
Zeitstempel = millis();
if (digitalRead(Taster) == LOW) {
digitalWrite(LED, HIGH); // LED 13 ein
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("new Writing");
valString = String(val);
myFile.println(valString);
ZeitstempelString = String(Zeitstempel);
myFile.println(ZeitstempelString);
myFile.close(); // close the file:
Serial.println("done.");
}
else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
digitalWrite(LED, LOW); // LED 13 aus
}
// re-open the file for reading:
Serial.println("re-open");
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close(); // close the file:
}
else {
// if the file didn't open, print an error:
Serial.println("error re-opening test.txt");
}
delay(1000);
}