Werte von einer SD Karte Variablen zuweisen.

Hallo zusammen,

ich bin gerade dabei eine Terrarium steuerung zu basteln und möchte die Steuerzeiten über die SD Karte einlesen.

Die Daten liegen dort wie Folgt vor (soweit der Plan)
01.01.2017,08:00:00,16:00:00,09:30:00,14:45:00,12:00:00,20:00:00

zuerst der Tag darauf die einschalt und ausschalt zeiten der verschiedenen Lampen

Mein Problem liegt nun darin die daten bis zum "," auszulesen diese der zugehörigen variablen zuzuordnen und den nächsten teil lesen usw.

Für ander vorgehensweisen bin ich offen.

samohTPie:
Für ander vorgehensweisen bin ich offen.

Setze die Werte doch in einzelne Zeilen, also untereinander.
Dann fragst du die Zeilen ab.

wenn Du die ganze Zeile in eine string Variable einliest,
kannst Du danach mit variable.substring, die entsprechenden Teile rausschneiden und in einzele string Variablen ablegen.

Bsp.: Codefragment

myFile = SD.open("arduino.txt");       // Einlesen der Daten von der SD Card arduino.txt
      i = 1;                          //Zeilenzähler Daten ausgeben
      j = 0;                          //Geburtstagszähler
      if (myFile) {
        while (myFile.available()) { // read from the file until there's nothing else in it:
          tempstring = myFile.read(); //Zeichenweise einlesen
          if (tempstring != '\n') {   //Erkennen von Zeilenumbruch
            input += tempstring;      //String aufaddieren
          } else {                    //Zeilenumbruch gefunden, String complete
            mydate = input.substring(0, 10); //Aufteilen des Strings Datum 10 Zeichen 01.01.1970
            //            Serial.println(mydate);                 //Ausgabe von Text in Zeile
            myshortdate = input.substring(0, 6); //Aufteilen des Strings KurzDatum 6 Zeichen 01.01.
            //            Serial.println(myshortdate);                 //Ausgabe von Text in Zeile
            myyear = input.substring(6, 10); //Aufteilen des Strings Jahr 4 Zeichen 1970
            //            Serial.println(myyear);                 //Ausgabe von Text in Zeile
            myart = input.substring(11, input.length() - 1); //Auslesen des Eriegnisses
            input = "";                //Löschen des Strings
  ......

Joerg_L:
wenn Du die ganze Zeile in eine string Variable einliest,
kannst Du danach mit variable.substring, die entsprechenden Teile rausschneiden und in einzele string Variablen ablegen.

Danke!
Genau danach hab ich gesucht! Kannte das mit variable.substring noch nicht.

Wenn ich das richtig verstanden habe kann ich mit variable.substring die von basic und ähnlichen Sprachen her bekannten funktionen "Left$, Mid$" und zusammen mit variable.length() "Right$" nachbilden.

Sorry für das OT.
Möcht jetzt auch nicht diesen Thread für meine Interessen kapern.

LG Stefan

Wenn du das auf einem atmega328 basierten Arduino machst mit 2k RAM und der SD Library, sind String-Objekte riskant.

Mit BASIC-Vorkenntnissen mag dir input += tempstring; einfach erscheinen. Das täuscht.
Mal abgesehen davon, dass tempstring ein ganz schlechter Name ist (für ein int oder was auch immer)

tempstring war in diesem Code ein char
liest ja zeichenweise von dem file ein.

Code kommt aus diesem Projekt und das funktioniert mit strings sehr gut!

http://forum.arduino.cc/index.php?topic=491121.0

Man kann das ganze auf char Arrays umbauen, hatte ich auch versucht, aber hatte keine Vorteile beim Speicherverbrauch und der Code wurde einfach wesentlich umständlicher!

Grüße
Jörg

Joerg_L:
wenn Du die ganze Zeile in eine string Variable einliest,
kannst Du danach mit variable.substring, die entsprechenden Teile rausschneiden und in einzele string Variablen ablegen.

Das ist kompliziert und nicht flexibel. Mit C Strings gibt es strtok() welches einen String in situ an Trennzeichen splitten kann. Die Funktion gibt NULL zurück wenn der String zu Ende ist wodurch man sie in einer Schleife verwenden kann.
Wenn man das mit String Objekten machen will ist das eine unübersichtliche Orgie aus Suchen und subString()

Aber einfacher ist es wie gesagt man trennt hier nicht mit Kommas sondern macht jeden Datensatz in eine eigene Zeile. Dann liest man einfach Zeile für Zeile an. So muss man weniger speichern und nichts splitten

variable.substring ist doch nicht kompliziert, wenn der String wir hier vorgegeben eine feste, immer gleichlange Folge von Werten hat.

Datum Zeichen 0-9 -> variable.substring(0,10)
Lampe1An 11-18 -> variable.substring(11,19)
Lampe1Aus 20-27 -> variable.substring(20,28)
Lampe2An 29-36 -> variable.substring(29,37)
Lampe2Aus 38-45 -> variable.substring(38,46)
Lampe3An 47-54 -> variable.substring(47,55)
Lampe3Aus 56-63 -> variable.substring(56,64)

Da kann man wunderbar eine Funktion bauen, die immer den kompletten string in das Datum, und die Zeiten für die verschiedenen Lampen aufteilt.

die Funktion kann man dann für jeden string aus der Datei benutzen.

In diesem speziellen Fall muss es eben nicht nicht flexibel sein.

Erst mal danke für die schnelle hilfe, hat mit den strings ganz gut geklappt

@Joerg_L
dein Müllkalender ist ne ganz gut erfindung.