Datensätze von SD lesen und in Variablen speichern

Liebe Community,

ich bin gerade dabei aus einer Textdatei jeweils immer ein 4er Block an Werten in 4 verschiedene Variablen zu speichern. Dann werden die Werte verarbeitet, eine Zählvariable zählt hoch und schiebt mich dann im nächsten Schritt zum nächsten Datensatz.

Der Code ist aber leider dadurch das ich die einzelnen Zeile mit Switch-Case Anweisungen extrem aufgebläht. Jetzt bin ich auf der Suche nach einer eleganteren Lösung. Auf Fehler im gesamten Code könnt ihr mich gerne Hinweisen, bin offen für alles und noch Anfänger.

Die Textdatei hat folgenden Inhalt:

40
30.5
3
4
12
40.5
7
10
60
8
4
2
30
5.5
3
40

Schön wäre es wenn es irgendwie so gehen würde:

40;30.5;3;4
12;40.5;7;10
60;8;4;2
30;5.5;3;40

Der Code sieht folgendermaßen aus:

#include <Servo.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <SdFat.h>

float pos = 0;
const int buttonPin1 = 30;
const int buttonPin2 = 31;
int buttonState1 = 0;
int buttonState2 = 0;
int auslenkung;
int sensorValue = 0;
long zeit;
int chipSelect = 53;
int y=0;


//Entfernungsmessung 1
int trigger=22;
int echo=23;
long dauer=0;
long entfernung=0;
long entfernung1;
long entfernung2;
long hub;

//Entfernungsmessung 2
int triggerb=24;
int echob=25;
long dauerb=0;
long entfernungb=0;
long entfernung1b;
long entfernung2b;
long hubb;

//Entfernung Gesamt
long hubg;

//Variablen für SD
char breathIn[10] = "2.25";
char breathOut[10] = "2.25";
char hold[10] = "1,5";
char deflection[10] ="3";

Servo myservo;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
SdFat sd;

void setup() {
 Serial.begin(9600);
 
 pinMode(buttonPin1,INPUT_PULLUP);
 pinMode(buttonPin2,INPUT_PULLUP);
 pinMode(trigger, OUTPUT);
 pinMode(echo, INPUT);
 pinMode(triggerb, OUTPUT);
 pinMode(echob, INPUT);

 myservo.attach(6);  
 lcd.clear();
 lcd.begin(16, 2);
 lcd.print("Atem Phantom");
 lcd.setCursor(0, 1);
 lcd.print("Version 1.3");
 
 delay(3000);

 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Initialisiere");
 lcd.setCursor(0,1);
 lcd.print("SD-Karte...");
  if(!sd.begin(chipSelect, SPI_FULL_SPEED)) 
  {  
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("SD-Fehler");
    sd.initErrorHalt();
  } 
    else lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("SD Karte bereit");
 
  //Einstellungen von SD-Karte laden (SETTING.TXT)
  Serial.println("Lade Einstellungen von SD-Karte (SETTING.TXT)...");
  Serial.print("- Voreingestellte Einatmungszeit: ");
  Serial.println(breathIn);
  Serial.print("- Voreingestellte Ausatmungszeit: ");
  Serial.println(breathOut);
  Serial.print("- Voreingestellte Haltezeit: ");
  Serial.println(hold);
  Serial.print("- Voreingestellter Hub: ");
  Serial.println(deflection);
    
  readSettingsFromSD(); 

  Serial.println("Geladenene Werte");
  Serial.println(breathIn);
  Serial.println(breathOut);
  Serial.println(hold);
  Serial.println(deflection);
  
}

void readSettingsFromSD() 
{
  SdFile myFile("SETTINGS.TXT", O_RDWR);
  char netBuffer[50];
  if (myFile.isOpen()) 
  {
    int chPos = 0;
    int lineNo = y; 
 
    Serial.println("- Einstellungen erfolgreich geladen.");
    Serial.println(y);
 
    while (myFile.available())
    {
      char ch = myFile.read();
 
      if(ch == '\n') // '\r' oder '\n'
      {
        chPos = 0;
        
        switch(lineNo) //+y -> erzeugt liste rückwärts
        {
          case 0: //Einatmung
            sscanf(netBuffer,"%s",breathIn);
          break;
          case 1: //Ausatmung
            sscanf(netBuffer,"%s",breathOut);
          break;
          case 2: //Halten
            sscanf(netBuffer,"%s",hold);
          break;
          case 3: //Hub
            sscanf(netBuffer,"%s",deflection);
          break;
          case 4: //Einatmung
            sscanf(netBuffer,"%s",breathIn);
          break;
          case 5: //Ausatmung
            sscanf(netBuffer,"%s",breathOut);
          break;
          case 6: //Halten
            sscanf(netBuffer,"%s",hold);
          break;
          case 7: //Hub
            sscanf(netBuffer,"%s",deflection);
          break;
          case 8: //Einatmung
            sscanf(netBuffer,"%s",breathIn);
          break;
          case 9: //Ausatmung
            sscanf(netBuffer,"%s",breathOut);
          break;
          case 10: //Halten
            sscanf(netBuffer,"%s",hold);
          break;
          case 11: //Hub
            sscanf(netBuffer,"%s",deflection);
          break;
          case 12: //Einatmung
            sscanf(netBuffer,"%s",breathIn);
          break;
          case 13: //Ausatmung
            sscanf(netBuffer,"%s",breathOut);
          break;
          case 14: //Halten
            sscanf(netBuffer,"%s",hold);
          break;
          case 15: //Hub
            sscanf(netBuffer,"%s",deflection);
          break;

          
          
        } // switch
        
        lineNo=lineNo+1;
        
      } // if(ch == '\n') // '\r' oder '\n'
      else if(ch == '\r') {
        // do nothing
      }
      else if(chPos < 50) 
      {        
        netBuffer[chPos] = ch;
        chPos++;
        netBuffer[chPos] = 0;
      }
    } // while (myFile.available())
 
    myFile.close();
    int x;
  } // if (myFile.isOpen())
  else
  {
    Serial.println("- Fehler beim ermitteln der Settings!\n");
    sd.initErrorHalt();
  }
}

long sensor()
 {
  digitalWrite(trigger, LOW);
  delay(10);
  digitalWrite(trigger, HIGH);
  delay(15);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer/2) / 2.91;
  return entfernung;
 }

long sensorb()
 {
  digitalWrite(triggerb, LOW);
  delay(10);
  digitalWrite(triggerb, HIGH);
  delay(15);
  digitalWrite(triggerb, LOW);
  dauerb = pulseIn(echob, HIGH);
  entfernungb = (dauerb/2) / 2.91;
  return entfernungb;
 }


void loop() {
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  auslenkung = analogRead(sensorValue);
  auslenkung = map(auslenkung, 0,1011, 100, 150);
  zeit = analogRead(sensorValue);
  zeit = map(zeit, 0,1011, 115,40);

  if (buttonState1 == LOW) // Gating
    { 
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Normales Gating");
      Serial.print("Normales Gating");
      hub = entfernung2-entfernung1;
      hubb = entfernung2b-entfernung1b;
      hubg = (hub+hubb)/2;
      lcd.setCursor(0, 1);
      lcd.print("Hub:");
      lcd.setCursor(5, 1);
      lcd.print(hubg);
      lcd.setCursor(10, 1);
      lcd.print("mm");
      
      for (pos = 92; pos <= auslenkung; pos += 1)
        {
        myservo.write(pos); 
        delay(20); //zeit
        }
      
      entfernung1 = sensor();
      entfernung1b = sensorb();
    
      for (pos = auslenkung; pos >= 92; pos -= 1) 
        { 
        myservo.write(pos);              
        delay(20);
        }
     
      entfernung2 = sensor();
      entfernung2b = sensorb();

      delay(1250);
      
    }

    
  else if (buttonState2 == LOW) //Gating SD-Karte
    {
      do {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Gating SD-Karte");
      Serial.print("Gating SD-Karte"); 
      hub = entfernung2-entfernung1;
      hubb = entfernung2b-entfernung1b;
      hubg = (hub+hubb)/2;
      lcd.setCursor(0, 1);
      lcd.print("Hub:");
      lcd.setCursor(5, 1);
      lcd.print(hubg);
      lcd.setCursor(10, 1);
      lcd.print("mm");

     


      
      readSettingsFromSD(); 
      
      float breathOutf=atof(breathOut);
      float breathInf=atof(breathIn);
      float deflectionf=atof(deflection);
      float holdf=atof(hold);[/color]
      
      
      
      Serial.println(breathInf);
      Serial.println(breathOutf);
      Serial.println(holdf);
      Serial.println(deflectionf);
      Serial.println(y);
      
      
      for (pos = 90; pos <= 180; pos += 1)
        {
        myservo.write(pos); 
        delay(breathInf); //zeit
        }
      
      entfernung1 = sensor();
      entfernung1b = sensorb();
    
      for (pos = 180; pos >= 90; pos -= 1) 
        { 
        myservo.write(pos);              
        delay(breathOutf);
        }
     
      entfernung2 = sensor();
      entfernung2b = sensorb();

      delay(holdf);
      
      y=y+4;
      
      } while(y <= 12);  
      
      y=0;
      
    }

   
    
  else
   {
     lcd.clear(); 
     lcd.setCursor(0, 0);
     lcd.print("Standby");
     delay(2000);
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("I: Nrm. Gating");
     lcd.setCursor(0, 1);
     lcd.print("II: SD-Karte");
     delay(5000);
     
   }
}

Hmm....

Google: "arduino csv"

40;30.5;3;4

du suchst nach strtok.

Jetzt bin ich auf der Suche nach einer eleganteren Lösung

Wenn du schon sscanf verwendest, könntest du übrigens deine Variablen gleich als Zahlen speichern...

Hallo,

ich meine es nicht böse, aber solche Fragen gehören hier nicht hin.
Das sind C/C++ oder generell Programierungsanfängerfragen.
Das hat nichts mit Arduino oder Atmega zu tun.
Das gleiche Problem hättest du wenn du das Selbe auf einem PC als Rechner und einer
Festplatte statt SD-Card hättest. Also nix microcontrollerspzifisches.

Ist nur meine Meinung.

Ulli

solche Fragen gehören hier nicht hin

?

Fragen zu MOSFETs und Relais auch nicht, denn das ist allgemeine Elektrotechnik ?
Auch nutzt kein echter Arduino einen attiny Controller. Sowas gehört hier also auch nicht hin.

(Ich dachte, ein Arduino wäre für Programmieranfänger erfunden worden)

beeblebrox:
Ist nur meine Meinung.

Korrekt!
Nur deine.

beeblebrox:
Hallo,

ich meine es nicht böse, aber solche Fragen gehören hier nicht hin.
Das sind C/C++ oder generell Programierungsanfängerfragen.
Das hat nichts mit Arduino oder Atmega zu tun.
Das gleiche Problem hättest du wenn du das Selbe auf einem PC als Rechner und einer
Festplatte statt SD-Card hättest. Also nix microcontrollerspzifisches.

Ist nur meine Meinung.

Ulli

Ulli, sei mal tollerant.
80% der Fragen hier im Forum sind nicht eng Arduinobezogen.
C bzw C++ als Programmiersprache die man bei Arduino verwendet, ist ein Teil von Arduino.
Wir sind nicht hier um einen kompletten C/C++ Kurs anzubieten, aber einige Fragen zu C/C++ beantworten wir schon.

Wenn das Gesamtverständnis von C/C++ fehlt ist ein C/C++ Kurs sicher ein guter Ratschlag.

Grüße Uwe

Ich denke ihr habt recht.

Ulli

beeblebrox:
Ich denke ihr habt recht.

Ulli

Danke für Deine ehrliche Antwort.

Jetzt haben wir das geklährt und wir solltem dem TO weiterhelfen.

Mal sehen ob er weiterrgekommen ist.
Grüße Uwe

beeblebrox:
Ich denke ihr habt recht.

Danke für die Blumen!

Aus meiner Sicht ist geistige Hygiene das Mittel der Wahl.
Auf Gebieten, in denen ich Sattelfest bin, kommen mir manche Fragen, nunja, recht dämlich vor (sorry). Das liegt aber in der Natur der Dinge. In der Arduino Welt, also auch hier, schlagen viele Anfänger ein. Die sind auf vielen Gebieten, auch am Rand (OOP,Elektronik,usw.), herzerfrischend Kenntnis frei.
Wir können ihnen das lernen nicht abnehmen.
Aber einen Link zur betreffenden Doku, oder ein paar Suchworte für Google, kann man schon machen.
Immer bedenken: Es dauert ca 3 bis 6 Jahre, bis man zu einem "brauchbaren" Programmierer/Elektroniker wird. Und das auch nur, bei intensiver Beschäftigung mit dem Thema.

Tipp:

Wer sich nicht aufregen kann, ist ein Dummkopf.
Wer sich nicht aufregen will, ein Weiser.

Quelle: (habe ich vergessen)

Ich bedanke mich mal für die zahlreichen Antworten.
Ich hätte es selbst nicht gedacht aber durch Google bin ich tatsächlich über sehr sehr viele Seiten nun an mein Ergebnis gekommen, der Code ist nun um ca 100 Zeilen schlanker und ich denke etwas eleganter.

#include <Servo.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <SdFat.h>

float pos = 0;
const int buttonPin1 = 30;
const int buttonPin2 = 31;
int buttonState1 = 0;
int buttonState2 = 0;
int auslenkung;
int sensorValue = 0;
long zeit;
const uint8_t chipSelect = 53;
const int STRING_BUFFER_SIZE = 21;
char stringBuffer[STRING_BUFFER_SIZE];
int i=1;


//Entfernungsmessung 1
int trigger=22;
int echo=23;
long dauer=0;
long entfernung=0;
long entfernung1;
long entfernung2;
long hub;

//Entfernungsmessung 2
int triggerb=24;
int echob=25;
long dauerb=0;
long entfernungb=0;
long entfernung1b;
long entfernung2b;
long hubb;

//Entfernung Gesamt
long hubg;


Servo myservo;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
SdFat sd;
SdFile file;

void setup() {
       Serial.begin(9600);
       
       pinMode(buttonPin1,INPUT_PULLUP);
       pinMode(buttonPin2,INPUT_PULLUP);
       pinMode(trigger, OUTPUT);
       pinMode(echo, INPUT);
       pinMode(triggerb, OUTPUT);
       pinMode(echob, INPUT);
      
       myservo.attach(6);  
       lcd.clear();
       lcd.begin(16, 2);
       lcd.print("Atem Phantom");
       lcd.setCursor(0, 1);
       lcd.print("Version 1.3");
       
       delay(3000);
      
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("Initialisiere");
       lcd.setCursor(0,1);
       lcd.print("SD-Karte...");
        if(!sd.begin(chipSelect, SPI_FULL_SPEED)) 
            {  
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("SD-Fehler");
              sd.initErrorHalt();
            } 
       else lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("SD Karte bereit");
       delay(1000);  
        
       }

bool readLineFromSD(const char* filename, char* buffer, int bufferSize, int line)
{
  if (sd.begin())
  {
    if (file.open(filename, O_READ))
    {
      int count = 1;

      while (file.fgets(buffer, bufferSize) > 0)
      {
        if (count == line)
          break;
        count++;
      }
      file.close();

      if (count != line)
        return false;

      return true;
    }
  }

  return false;
}

long sensor()
 {
  digitalWrite(trigger, LOW);
  delay(10);
  digitalWrite(trigger, HIGH);
  delay(15);
  digitalWrite(trigger, LOW);
  dauer = pulseIn(echo, HIGH);
  entfernung = (dauer/2) / 2.91;
  return entfernung;
 }

long sensorb()
 {
  digitalWrite(triggerb, LOW);
  delay(10);
  digitalWrite(triggerb, HIGH);
  delay(15);
  digitalWrite(triggerb, LOW);
  dauerb = pulseIn(echob, HIGH);
  entfernungb = (dauerb/2) / 2.91;
  return entfernungb;
 }


void loop() {
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  auslenkung = analogRead(sensorValue);
  auslenkung = map(auslenkung, 0,1011, 100, 150);
  zeit = analogRead(sensorValue);
  zeit = map(zeit, 0,1011, 115,40);

  if (buttonState1 == LOW) // Gating
    { 
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Normales Gating");
      Serial.print("Normales Gating");
      hub = entfernung2-entfernung1;
      hubb = entfernung2b-entfernung1b;
      hubg = (hub+hubb)/2;
      lcd.setCursor(0, 1);
      lcd.print("Hub:");
      lcd.setCursor(5, 1);
      lcd.print(hubg);
      lcd.setCursor(10, 1);
      lcd.print("mm");
      
      for (pos = 92; pos <= auslenkung; pos += 1)
        {
        myservo.write(pos); 
        delay(20); //zeit
        }
      
      entfernung1 = sensor();
      entfernung1b = sensorb();
    
      for (pos = auslenkung; pos >= 92; pos -= 1) 
        { 
        myservo.write(pos);              
        delay(20);
        }
     
      entfernung2 = sensor();
      entfernung2b = sensorb();

      delay(1250);
      
    }

    
  else if (buttonState2 == LOW) //Gating SD-Karte
    {
      for (i = 1; i < 9; i++)
      {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Gating SD-Karte");
          Serial.print("Gating SD-Karte"); 
          hub = entfernung2-entfernung1;
          hubb = entfernung2b-entfernung1b;
          hubg = (hub+hubb)/2;
          lcd.setCursor(0, 1);
          lcd.print("Hub:");
          lcd.setCursor(5, 1);
          lcd.print(hubg);
          lcd.setCursor(10, 1);
          lcd.print("mm");
    
         
    
          readLineFromSD("settings.txt", stringBuffer, sizeof(stringBuffer), i);

          float breathIn = atof(strtok(stringBuffer, ";"));
          Serial.print("  Einatmen: "); Serial.print(breathIn);
          float breathOut = atof(strtok(NULL, ";"));
          Serial.print("  Ausatmen: "); Serial.print(breathOut);
          float hold = atof(strtok(NULL, ";"));
          Serial.print("  Haltephase: "); Serial.print(hold);
          float deflection = atof(strtok(NULL, ";"));
          Serial.print("  Hub: "); Serial.println(deflection);     
               
          
          
                   
          
          for (pos = 90; pos <= 180; pos += 1)
            {
            myservo.write(pos); 
            delay(breathIn); //zeit
            }
          
          entfernung1 = sensor();
          entfernung1b = sensorb();
        
          for (pos = 180; pos >= 90; pos -= 1) 
            { 
            myservo.write(pos);              
            delay(breathOut);
            }
         
          entfernung2 = sensor();
          entfernung2b = sensorb();
    
          delay(hold);
          
          
      
      }   
      
      i=0;
      
    }

   
    
  else
   {
     lcd.clear(); 
     lcd.setCursor(0, 0);
     lcd.print("Standby");
     delay(2000);
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("I: Nrm. Gating");
     lcd.setCursor(0, 1);
     lcd.print("II: SD-Karte");
     delay(5000);
     
   }
}

Wer sich nicht aufregen kann, ist ein Dummkopf.
Wer sich nicht aufregen will, ein Weiser.

Quelle: (habe ich vergessen)

Ich glaube, dat war der olle Konfuzius der da auch sagte:

Wer fragt ist 5 Minuten ein Dummkopf,
wer nicht fragt, bleibt sein Leben lang ein Dummkopf

oder so ähnlich
:wink:

combie:
... hier, schlagen viele Anfänger ein. Die sind auf vielen Gebieten herzerfrischend kenntnisfrei.

Vielen Dank für diese wunderbare humorvoll treffende Wortkombination. Die muss ich mir unbedingt merken! :slight_smile:

Die (intensive) Beschäftigung mit einem Themenbereich ist (nach einiger Zeit) oft Basis für Expertentum.

Meist sind wir ja Experten und Anfänger zugleich: Auf einem Gebiet Experte auf dem anderen Anfänger.
Das merke ich immer dann, wenn ich in ein für mich neues Thema vordringe und ICH dann (trotz "Vorrecherche") die ganz blöden Anfängerfragen stelle... :slight_smile:

Aus meiner Sicht ist geistige Hygiene das Mittel der Wahl.

Der ist mindestens genauso gut, ihr haut hier Dinger raus! :grinning: :grinning:

Karma++

Ich hätte es selbst nicht gedacht aber durch Google bin ich tatsächlich über sehr sehr viele Seiten nun an mein Ergebnis gekommen,

Glückwunsch!
Fein, dass es jetzt funktioniert.

dat war der olle Konfuzius

Ja, das wird er wohl gewesen sein!
Der hat mir schon öfter aufs Pferd geholfen.

Und schön, dass ihr Spass an meinen **** Sprüchlein habt.
Das Dreieck Mensch - Maschine - Verhalten(auch in Foren)
hat mich schon immer fasziniert.
:o Wenn es nicht so wenig mit Arduino zu tun hätte, wäre es fast einen eigenen Thread wert. :o

Wenn du die Menschen verurteilst, hast du keine Zeit, sie zu lieben.

Quelle: Mutter Teresa

Hallo,

wenn ich meinen Liebling bringen darf.

Was sagen Sie als Außenstehender zum Thema Intelligenz?

Quelle: Karl Dall zu Enno, wer das noch kennt :slight_smile: