Warum funktioniert meine Berechnung nicht?
ich habe an meinen Arduino ein Potentiometer angeschlossen und wandle die Werte in eine Skala von 0 bis 100 um:
// Variablen für Potentiometer
int Potentiometerwert = 0;
int Potentiometerminimum = 125;
float Potentiometerproz = 0;
int Potentiometeranz = 0;
int Potentiometermax = 896 - Potentiometerminimum;
int Potentiometerdifferenz = 0;
int Gradkorrektur = 0;
//Potiprozent berechnen
Potentiometerwert = analogRead(A6);
Potentiometerdifferenz = Potentiometerwert - Potentiometerminimum;
Potentiometerproz = 100. / Potentiometermax * Potentiometerdifferenz;
Potentiometeranz = 100. - (int)Potentiometerproz;
Gradkorrektur = (int)Potentiometeranz - 50.;
Das ganze funktioniert bis zur vorletzten Zeile - wenn ich dann aber vom Messwert 50 abziehen möchte, um in den negativen Bereich zu kommen, dann liefert er mir nur noch Hausnummern. zwischen -50 und 5024
Hintergrund - das Poti soll genutzt werden um eine Südausrichtung zu korrigieren. Der Sensor (Magnetometer) liefert Werte zwischen -179° und 180° und ist relativ ungenau. Wenn ich jetzt unter 0 Korrigieren möchte muss ich am Poti einen Wert einstellen können der dann in eine negative Zahl umgerechnet wird - die Mittelstellung soll also ein 0 liefern.
Kann mir jemand sagen wo der Fehler liegt?
1 Antwort
Hallo!
Der Code hatte das Problem, dass die Verwendung von int und float Variablen zu Präzisionsverlust und falschen Berechnungen führte. Durch die Änderung von Gradkorrektur zu float bleibt die Präzision erhalten. Die Verwendung von 100.0 anstatt 100 sorgt dafür, dass die Division als Float-Division behandelt wird. Dadurch werden die Werte korrekt berechnet, und Gradkorrektur liefert die erwarteten Ergebnisse.
Korrigierte Version deines Codes:
// Variablen für Potentiometer
int Potentiometerwert = 0;
int Potentiometerminimum = 125;
float Potentiometerproz = 0;
int Potentiometeranz = 0;
int Potentiometermax = 896 - Potentiometerminimum;
int Potentiometerdifferenz = 0;
float Gradkorrektur = 0; // Ändere dies zu float
// Potiprozente berechnen
Potentiometerwert = analogRead(A6);
Potentiometerdifferenz = Potentiometerwert - Potentiometerminimum;
Potentiometerproz = 100.0 / Potentiometermax * Potentiometerdifferenz; // Verwende 100.0 für float Division
Potentiometeranz = 100 - Potentiometerproz; // Lass Potentiometerproz als float
Gradkorrektur = Potentiometeranz - 50.0; // Verwende float subtraction
// Ausgabe zur Überprüfung
Serial.print("Potentiometerwert: ");
Serial.println(Potentiometerwert);
Serial.print("Potentiometerdifferenz: ");
Serial.println(Potentiometerdifferenz);
Serial.print("Potentiometerproz: ");
Serial.println(Potentiometerproz);
Serial.print("Potentiometeranz: ");
Serial.println(Potentiometeranz);
Serial.print("Gradkorrektur: ");
Serial.println(Gradkorrektur);
~ Mr.Callidus
Vielen Dank - das hat geholfen