Werte aus SD-Karte einlesen

Morgen zusammen,

ich möchte Daten aus einer SD-Karte einlesen und an einen Port ausgeben. Zwischen den einzelnen Werten soll eine fest programmierte Zeit liegen.

Die Daten auf der SD-Karte sehen so aus: 0x80,0x80,0x7E,0x7D,0x83,0x82,0x7D,0x7C,0x83,0x83,0x7C

Mein Problem ist nun, dass ich nicht weiß wie ich die Daten einlese um sie direkt an einem Port ausgeben kann.

Könnte mir hierbei evt. jemand behilflich sein?

Schönen Sonntag und einen schönen 4. Advent Gruß Tobi

Bei dieser Variante ist es wichtig, dass du die Zeile mit einem End-Zeichen abschließt:

0x80,0x80,0x7E,0x7D,0x83,0x82,0x7D,0x7C,0x83,0x83,0x7C**#**

Oder auch noch ein Komma:

0x80,0x80,0x7E,0x7D,0x83,0x82,0x7D,0x7C,0x83,0x83,0x7C,

Sonst erkennt er die letzte Zahl nicht. Kann man auch anders lösen, aber so geht es erst mal am einfachsten.

#include <SPI.h>
#include <SD.h>

File file;

void setup()
{
  Serial.begin(9600);
  pinMode(SS, OUTPUT);
  SD.begin();
}

void loop()
{
  file = SD.open("Test.txt", FILE_READ);
  if (file)
  {
    Serial.println(F("File opened"));
    char buffer[6];
    byte index = 0;

    char c = file.read();
    while (c >= 0)      //am Ende der Datei kommt hier -1 zurück
    {
      if (c == ',' || c == '#')    //Zahl oder Zeile zu Ende?
      {
        buffer[index] = '\0';     //String terminieren
        index = 0;

        byte value = strtoul(buffer, NULL, 16);   //konvertiere String mit Basis 16 in Integer
        Serial.println(value, HEX);                    //hier was mit dem Wert machen
      }
      else
      {
        buffer[index++] = c;      //aktuelles Zeichen abspeichern
      }

      c = file.read();      //nächstes Zeichen lesen
    }

    Serial.println(F("\n"));
    file.close();
  }
  else
  {
    Serial.println(F("File error"));
  }

  delay(1000);
}

Du kannst die gewandelten Werte auch erst mal in ein Array schreiben. Passe dabei aber tunlichst auf dass du nicht über den Speicher hinaus schreibst. Also die Länge des Arrays in einer Konstante angeben und dann überprüfen über Index noch innerhalb der Grenze liegt bevor man den aktuellen Wert abspeichert.

Tobi112:
Mein Problem ist nun, dass ich nicht weiß wie ich die Daten einlese um sie direkt an einem Port ausgeben kann.

Könnte mir hierbei evt. jemand behilflich sein?

Softwaremäßig werden die Daten mit der SD-Library ausgelesen, die bei Arduino dabei ist.

Hardwaremäßig wird eine SD-Karte mit 3.3V betrieben und Du benötigst zum Anschließen einer SD-Karte eine geeignete Schaltung mit passender Stromversorgung. Direkt verwenden kannst Du zum Beispiel Shields wie das “Ethernet-Shield”, die einen SD-Kartenschacht dabei haben. Oder SD-Breakout-Boards mit 5V Spannungswandler und Pegelwandler auf der Platine. Bei ganz einfachen SD-Breakout-Boards, die nur einen Spannungswandler drauf haben aber keinen Pegelwandler, mußt Du zwischen Arduino und SD-Board noch eine Pegelwandlerschaltung einbauen.

Wenn Du Probleme hast, beschreibst Du vielleicht nochmal genauer, was Du als Hardware hast, wie Du es angeschlossen hast, und was das eigentlich werden soll.

Unter “direkt an einem Port ausgeben” kann ich mir jetzt auch nicht direkt vorstellen, was Du meist. Meinst Du einen “seriellen Port”, also dass die Daten seriell ausgegeben werden sollen? Oder meinst Du ein Portregister des Atmega-Controllers, an dem die Daten-Bits parallel an 8 Port-Pins gelegt werden sollen?

Das oben ist auch nur Prinzip-Code. Praktischer ist es wahrscheinlich wenn man das einmal in setup() von der SD Karte liest, in ein Array schreibt und danach die Daten nur noch aus dem Array liest.