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);
}
}