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

Ein Kommentar zu “Arduino – Wert von SD-Karte lesen und einer Variable zuweisen

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

Kommentar verfassen