Arduino – Wert von SD-Karte lesen und einer Variable zuweisen

Um einer Variable einen Wert zuzuweisen ohne dass man das Sketch nachträglich bearbeiten muss, kann man diesen z.B. in eine Textdatei speichern die auf einer am Arduino angeschlossenen SD-Karte gespeichert wird. Wenn ich nun den Wert der Variable ändern wil, dann muss ich die SD-Karte nur entnehmen, diese an meinem Rechner anschließen und den Wert in der zugehörigen Textdatei anpassen.

Ich selber nutze diese Möglichkeiten in einem meiner Projekte, um nachträglich das Interval, in dem Sensor-Daten an ein PHP-Script gesendet werden, nachträglich ändern zu können.

 

Uno+EthernetShield+SDKarte

 

Vorbereitung

Für dieses Beispiel verwende ich einen Arduino Uno mit Ethernet Shield, auf dem sich zugleich auch der Micro-SD Kartenslot befindet. Da man mit der Standard SD Library nicht so viel anfangen kann, habe ich mir die SdFat Library hier heruntergeladen und diese im Libraries Ordner installiert.

Die neue MicroSD-Karte habe ich zuvor mit dem SdFormater Sketch, das man in den Beispielen unter „Datei->Beispiele->SdFat“ finden kann,  formatiert. Auf die Karte habe ich eine einfache Textdatei mit dem Namen „INTERVAL.TXT“ kopiert in der sich lediglich eine Zahl befindet.

Diese Zahl, in meinem Beispiel die 180, stellt die Sekundenzahl dar, die anschließend der Variable „interval“ zugewiesen werden soll. Wenn diese Zahl von der SD-Karte eingelesen und der Variable zugewiesen wurde, wird diese noch mit 1000 multipliziert um sie in Millisekunden umzurechnen.

Wichtig zu erwähnen wäre noch, dass die Dateinamen auf der SD-Karte, aufgrund der Beschränkungen des FAT-Dateisystems, mit dem die Karte formatiert wurde, auf 8.3 Eichen beschränkt sind.

 

Variable von SD-Karte lesen

Arduino Sketch

 

#include <SdFat.h>

const int chipSelect = 4;     // SD card chip select pin (Uno = 4)
int interval = 600;           // Interval in Sekunden 
SdFat sd;                     // file system auf SD-Karte

static const int BUFSIZE=50; 
static char buffer[BUFSIZE]; 

void setup()
{
  Serial.begin(9600);

  //SD-Karte initialisieren
  //if(!sd.begin(chipSelect, SPI_HALF_SPEED)) sd.initErrorHalt();
  if(sd.begin(chipSelect, SPI_HALF_SPEED))
  {
    //Interval aus Textdatei "interval.txt" von SD-Karte laden und der Variablen interval zuweisen
    if(readIntFromFile("INTERVAL.TXT"))
      interval = readIntFromFile("INTERVAL.TXT");
    else
      Serial.println("INTERVAL.TXT konnte nicht ausgelesen werden");
  } else Serial.println("Fehler beim initialisieren der SD-Karte!");

  interval = interval * 1000;  //in MilliSekunden umrechnen

  Serial.println("Interval = ");
  Serial.print(interval);
}

/* Int aus Textdatei von SD-Karte auslesen */
int readIntFromFile(const char* filename) 
{
  int pos=0;
  SdFile myFile(filename, O_RDWR);
  if (myFile.isOpen()) {
    while (myFile.available() && pos < (BUFSIZE-1)) {
      buffer[pos++] = myFile.read();
    }
    myFile.close();
    buffer[pos]=0; // EndeKennung 
    return (atoi(buffer));
  } else return 0; // Fehler: Datei nicht gefunden
}

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast. nefilim3006 ist auch bei Google+ vertreten

7 Kommentare zu “Arduino – Wert von SD-Karte lesen und einer Variable zuweisen

  1. Pingback: Arduino - Netzwerksettings von SD-Karte laden

  2. Moin!

    Funktioniert leider nicht, schon in Zeile 3 (SdFat sd; ) kommt die Fehlermeldung:
    “ ‚SdFat‘ does not name a type“.

  3. Hallo,

    ich bitte um Unterstützung, da ich keine Ahnung habe woher mein Fehler kommt.

    SdFat ist eingebunden ( auch nochmals aus einer 2.Quelle)
    Fehler: error: ‚class SdFile‘ has no member named ‚available‘

    Auch die in der Lib. enthaltenen Beispiele lassen sich nicht kompilieren.
    – Die anderen Lib.s sind ok.-

    Vielen Dank im Voraus!
    Gruß Helmut

  4. Hi,
    ich versuche gerade eine Bild-Datei IMAGE.JPG von der SD auf dem Ethernet shield zu lesen und das Bild dann auf der Webpage darzustellen. Wie kann man denn die Datei lesen?
    Ich habe versucht im sketch im Abschnitt der HTML-Seite den Tag client.println(„“);
    einzufügen. Geht leider nicht. Kein Bild auf der Webpage.

    // Create a client connection
    EthernetClient client = server.available();
    if (client) {
    while (client.connected()) {
    if (client.available()) {
    char c = client.read();

    //read char by char HTTP request
    if (readString.length() < 100) {
    //store characters to string
    readString += c;
    //Serial.print(c);
    }

    //if HTTP request has ended
    if (c == '\n') {
    Serial.println(readString); //print to serial monitor for debuging

    client.println("HTTP/1.1 200 OK"); //send new page
    client.println("Content-Type: text/html");
    client.println("Refresh: 1"); // refresh the page automatically every 1 sec
    client.println();
    client.println("“);
    client.println(„“);
    client.println(„Ethernet-Camera“);
    client.println(„“);
    client.println(„“);
    client.println(„Arduino Ethernet-Camera“);
    client.println(„“);
    client.println(„“);
    client.println(„“);
    client.println(„Take picture „);
    client.println(„“);
    client.println(„“);
    client.println(„“);
    client.println(„“);
    client.println(„“);
    // Show the taken picture in the Browser
    client.println(„“);
    client.println(„“);
    client.println(„“);
    client.println(„“);
    client.println(„“);
    client.println(„Arduino_Ethernet_Camera.ino“);
    client.println(„“);
    client.println(„“);
    client.println(„“);
    delay(1);
    //stopping client
    client.stop();

  5. Hallo,
    habe da auch mal eine Frage: Ich habe das Problem, dass wenn während einer laufenden Messung die Stromzufuhr unterbrochen wird, mein Arduino dann keine Daten mehr auf der SD-Karte speichert. Ich habe das alles über einen Schalter gesteuert. Bei AN wird eine Messung aufgenommen, bei AUS wird gestoppt und es passiert nichts, bis wieder mit AN eine neue Messung gestartet wird. Das Hochzählen des Dateinamens funktioniert auch, das einzige Problem ist, dass wenn ich den Strom zwischendurch kappe oder die SD-Karte entnehme, dann keine Messung mehr gestartet werden kann. Ich denke, das Problem ist, dass mein Programm die SD-Karte neu initialisiert und wieder bei Messung 1 anfangen möchte, welche aber schon besteht und dann nicht weiter weiß. Habe schon alles mögliche an Schleifen und Tricks aus verschiedenen Foren ausprobiert, bisher aber ohne Ergebnis.
    Vielleicht kann hier ja jemand helfen?

Kommentar verfassen