Ich habe ein ähnliches Problem mit sporadisch falschen Messwerten. Die Messwerte kommen über eine RS232-Schnittstelle von einem Laserdistanzmodul rein.
Das Distanzmodul gibt jedoch alle Werte korrekt her, ich nutze das angesprochene Programm nicht.
int start = 47;
int fehler = 46;
int distanz1 = 45;
int distanz2 = 44;
int distanz3 = 43;
int distanz4 = 42;
int distanz5 = 41;
int distanz6 = 40;
char eingabe[12];
float arbeitswert;
float halteposition;
boolean Endposition = true;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial2.begin(9600);
Serial.println("Setup abgeschlossen!");
//Serial2.println("DW");
pinMode(start, OUTPUT);
pinMode(fehler, OUTPUT);
pinMode(distanz1, OUTPUT);
pinMode(distanz2, OUTPUT);
pinMode(distanz3, OUTPUT);
pinMode(distanz4, OUTPUT);
pinMode(distanz5, OUTPUT);
pinMode(distanz6, OUTPUT);
}
boolean datenEinlesen() {
static byte count = 0;
char c;
if (Serial.available() == 0) return false; // Falls nichts ankommt
if (count == 0) memset(eingabe, 0, sizeof(eingabe)); // Puffer von eingabe leeren
c = Serial.read();
if (c == 13) // Wenn ein Zeilenumbruch erkannt wurde
{
eingabe[count] = '\0';
count = 0;
return true; // Zeilenumbruch(CR) erkannt = Eingabe vollständig
}
else if (c > 32 && count < sizeof(eingabe) - 1)
{
eingabe[count] = c;
count++;
}
else; // Ignoriere alle anderen Steuerzeichen
return false;
}
float messwertErfassen() {
String inString;
while (Serial2.available() > 0) { //Solange Daten kommuniziert werden, tue folgendes
char inChar = Serial2.read();
if (inChar != 13) { //Falls kein Carriage return erscheint
inString += (char)inChar; //Addiere den char zum String
} else {
//Serial.print("Messung ergab: ");
//Serial.print(inString);
//Serial.println(" m");
arbeitswert = inString.toFloat();
//Serial.println(arbeitswert);
return arbeitswert;
inString = "";
}
}
}
void loop() {
// put your main code here, to run repeatedly:
if (datenEinlesen()) {
if (strcmp(eingabe, "reset") == 0) {
Serial2.println("LF");
digitalWrite(start, LOW);
digitalWrite(fehler, LOW);
digitalWrite(distanz6, LOW);
digitalWrite(distanz5, LOW);
digitalWrite(distanz4, LOW);
digitalWrite(distanz3, LOW);
digitalWrite(distanz2, LOW);
digitalWrite(distanz1, LOW);
Endposition = true;
Serial.println("RESET-----RESET-----RESET");
} else if (strcmp(eingabe, "x") == 0) {
Endposition = true;
Serial.println("PC-Konnektivität hergestellt");
} else if (strcmp(eingabe, "start") == 0) {
Serial2.println("DW");
Serial.println("Laser aktiv, warte auf Zielwert");
} else {
Endposition = false;
digitalWrite(start, LOW);
digitalWrite(fehler, LOW);
digitalWrite(distanz6, LOW);
digitalWrite(distanz5, LOW);
digitalWrite(distanz4, LOW);
digitalWrite(distanz3, LOW);
digitalWrite(distanz2, LOW);
digitalWrite(distanz1, LOW);
}
}
if (Endposition == false) {
halteposition = atof(eingabe);
messwertErfassen();
delay(100);
Serial.print("Halteposition ist ");
Serial.println(halteposition);
Serial.print("Arbeitswert ist ");
Serial.println(arbeitswert);
float abstand1 = 2; //15 verkleinert auf Raummaße
float abstand2 = 1.5; //5
float abstand3 = 1;
float abstand4 = 0.5;
float abstand5 = 0.2;
float abstand6 = 0.1;
//######################################################################################
if (arbeitswert >= (halteposition + abstand2) and (arbeitswert <= halteposition + abstand1)) {
digitalWrite(distanz1, HIGH);
Serial.println("DISTANZ ZWISCHEN x+2 und x+1,5 METER");
} else if (arbeitswert < (halteposition + abstand2) and (arbeitswert >= (halteposition + abstand3))) {
digitalWrite(distanz2, HIGH);
Serial.println("DISTANZ ZWISCHEN x+1,5 und x+1 METER");
} else if (arbeitswert < (halteposition + abstand3) and (arbeitswert >= (halteposition + abstand4))) {
digitalWrite(distanz3, HIGH);
Serial.println("DISTANZ ZWISCHEN x+1 und x+0,5 METER");
} else if (arbeitswert < (halteposition + abstand4) and (arbeitswert >= (halteposition + abstand5))) {
digitalWrite(distanz4, HIGH);
Serial.println("DISTANZ ZWISCHEN x+0,5 und x+0,2 METER");
} else if (arbeitswert < (halteposition + abstand5) and (arbeitswert >= (halteposition + abstand6))) {
digitalWrite(distanz5, HIGH);
Serial.println("DISTANZ ZWISCHEN x+0,2 und x+0,1 METER");
} else if (arbeitswert < (halteposition + abstand6)) {
digitalWrite(distanz6, HIGH);
Serial.println("DISTANZ UNTER x+0,1 METER");
} else {
digitalWrite(start, LOW);
digitalWrite(fehler, LOW);
digitalWrite(distanz6, LOW);
digitalWrite(distanz5, LOW);
digitalWrite(distanz4, LOW);
digitalWrite(distanz3, LOW);
digitalWrite(distanz2, LOW);
digitalWrite(distanz1, LOW);
}
if (arbeitswert == halteposition) {
digitalWrite(start, HIGH);
Serial.println("Zug steht");
messwertErfassen();
Serial.print(arbeitswert);
delay(50);
if (arbeitswert == halteposition) {
Serial.println(" m Abschlussposition");
Endposition = true;
}
}
if (arbeitswert >= 75 || arbeitswert <= 0) { //Entfernungsgrenzen
Serial.println("Fehler");
digitalWrite(fehler, HIGH);
messwertErfassen();
if (arbeitswert >= 75 || arbeitswert <= 0) {
Endposition = true;
Serial.write("RESET");
}
else {
Serial.print(arbeitswert);
Serial.println(" m ist der letzte Arbeitswert");
}
}
//######################################################################################1
}
}