Analogeingang in Nichtlinearen Wert umrechnen

Hallo zusammen,
Ich bin ganz neu hier und hoffe auf etwas Hilfe von Euch.

Ich habe ein Projekt, bei dem ich mit einem Sensor den Füllstand messe und auf dem Display anzeige.
Bis hier klappt alles einwandfrei.

Das Problem ist folgendes:
Der Behälter ist nicht gerade, sondern "bauchig". Dh. er fängt unten schmal an, wird breiter und dann wieder schmal.

Wie würdet ihr die Umrechnung realisieren?

LG Andy

entweder ein Lookup über ein Array oder eine interpolation mit mehreren Unterstützungspunkten.

Hallo,

Es kommt auf die Kurve an und wie hoch der Fehler sein darf. Lineare Funktion mit mehreren Stutzpunkten ist immer gut und reicht meißt auch.

noch andere eine Variante, 5-6 Messwerte aufnehmen und in eine Excell Tabelle eintragen und eine Grafik dazu erstellen. Anschliessend kann Execll eine Funktion Y(x)dazu berechnen und gibt auch die Parameter dazu an. Man kann da verschiede Kurvenformen zur Näherung auswählen. Meisst gibt das eine ganz gute Annäherung, muss man mal sehen was bei rauskommt und einen Kompomiß suchen. Die Funktion dann benutzen um die Umrechnung im Arduino zu machen.

Heinz

Der Behälter ist nicht gerade, sondern "bauchig". Dh. er fängt unten schmal an, wird breiter und dann wieder schmal.

Lineare Interpolation zwischen Stützpunkten reicht da sicher. Zumal die kritischen Bereiche wohl unten/oben sind und in der "bauchigen" Mitte ein etwas größerer Fehler nicht so kritisch ist.

Hey, danke für eure rege Beteiligung.
Ich habe mir jetzt mal ein paar Werte notiert und in Excel eingepflegt. Dort eine Trendlinie erstellt und diese Formel bekommen:

y=-0,0128x4 - 0,9316x3 + 19,305x2 + 138,04x + 12,939
(die Zahlen hinter dem x sind Hochzahlen)

Das Problem ist jetzt dieses: wenn ich diese Formel versuche in Excel wieder zu benutzen, bekomme ich komplett andere Ergebnisse raus.

B22 ist die Zelle mit dem Wert für x

=-0,0009B22^4 - 0,1122B22^3 + 4,3277B22^2 + 79,297B22 + 84,809

Habe auch versucht die Zahlen einzeln in Klammern zu setzten, aber auch das hat Nichts gebracht.

Hat vielleicht da jemand eine Idee?
In Arduino habe ich es noch nicht probiert.

y=-0,0128x4 - 0,9316x3 + 19,305x2 + 138,04x + 12,939
(die Zahlen hinter dem x sind Hochzahlen)

=-0,0009B22^4 - 0,1122B22^3 + 4,3277B22^2 + 79,297B22 + 84,809
B22 ist die Zelle mit dem Wert für x

Das Problem ist jetzt dieses: wenn ich diese Formel versuche in Excel wieder zu benutzen, bekomme ich komplett andere Ergebnisse raus.

Die Excel-Formel ist ja auch ziemlich unterschiedlich zur Vorgabe ?!

Oh, sorry, hast vollkommen Recht. Da habe ich schon mehrfach versucht die Daten zu vereinfachen, um die Funktion zu verkürzen

Hier die Richtige Funktion:

y = -0,0009x4 - 0,1122x3 + 4,3277x2 + 79,297x + 84,809

und die Formel in Excel

=-0,0009B32^4 - 0,1122B32^3 + 4,3277B32^2 + 79,297B32 + 84,809

Hallo,

und jetzt klappt es ? wenn nicht hast Du vermutlich die Werte für y in die Gleichung eingesetzt. Ich würde auch versuchen ob nicht eine Funkton 3 Ordnung reicht.

Ansonsten muss das gehen.

Gib doch mal ein paar Wertepaare an 5-6 sollten ja reichen.

Heinz

Ne, leider nicht.
Habe x y werte auch schon versucht zu tauschen, weil ich dachte die Abhängigkeit wäre falsch.

Hier ein paar Werte:

8 = 169
12 =258
16 = 359
20 = 464
24 = 575

Hallo,

linear in der Tabelle ist

bei mit kommt das raus bei einer linearen Gleichung gibts ein paar Abweichungen bei quadratisch ist der Fehler max etwa 5% vom Messwert

x y linear quad
8 169 161,4 168,2278
12 258 263,2 259,7238
16 359 365 358,0742
20 464 466,8 463,279
24 575 568,6 575,3382

linear Y=$A32*25,45-42,2

quadatisch Y=0,2142*$A32^2+18,59*$A32+5,799

Heinz

Hallo,

mit Arduino R3 mal einen Sketch gemacht.

ich denke x sind die Füllstände und y der Inhalt dazu, ist aber auch egal, es geht um ein mathematisches Problem das man so lösen könnte, denke ich

float x, y;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  for ( x = 8; x < 25; x = x + 4) {
    y = 0.2142 * pow(x, 2) + 18.59 * x + 5.799;
    Serial.print(x); Serial.print("\t"); Serial.println(y);
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}

hier die Monitor Ausgabe

8.00 168.23
12.00 259.72
16.00 358.07
20.00 463.28
24.00 575.34

Guten Morgen zusammen,

danke für die Anregungen.
Jetzt muss ich doch ein paar Werte mehr einstellen.

Hier die Werte:
8 169
12 258
16 359
20 464
24 575
28 693
32 812
36 935
40 1059
44 1186
48 1317
52 1447
56 1578
60 1701
64 1824
68 1940
72 2054
76 2162
80 2264
84 2358
88 2440

0 ist der Min-wert, 88 der Max-Wert
8 ist der Wert, den ich messen konnte
Als Intervall habe ich mehrere Möglichkeiten durchgespielt, aber diese war OK.

Bei Excel kam ich mit der polinomischen Trendlinie (4Grad) am besten ran.
Dabei wird diese Formel angezeigt: y = -0,0009x4 - 0,1122x3 + 4,3277x2 + 79,297x + 84,809

Ich kann nicht ausschließen, daß ich bereits beim Erstellen des Charts einen Fehler gemacht habe.
Hier würde mich eure Herangehensweise sehr interessieren.

So, hoffe das sind jetzt genug Infos...

Wünsche Euch einen guten Start in den Tag.

Andreas_1979:
… Hier würde mich eure Herangehensweise sehr nteressieren.

Ich bin gerade erst in diesen Thread gestolpert und wurde beim Lesen Deiner Formel daran erinnert, dass mein vorletztes Gebastel das Problem hatte, dass relativ viele Fließkomma-Operationen durchgeführt werden mussten, die das Programm inakzeptabel langsam gemacht haben.

Lösung war in meinem Fall, alle Berechnungen so zu „skalieren“, dass nur Ganzzahl-Berechnungen nötig waren und eine Lookup-Table zu verwenden - statt bestimmte Werte zu berechnen, wurden die Ergebnisse einfach aus dem Flash gelesen.

Falls also Geschwindigkeit zum Problem wird, könnte so etwas eine Lösung sein.

Gruß

Gregor

Andreas_1979:
Guten Morgen zusammen,

Ich kann nicht ausschließen, daß ich bereits beim Erstellen des Charts einen Fehler gemacht habe.
Hier würde mich eure Herangehensweise sehr interessieren.

So, hoffe das sind jetzt genug Infos...

Wünsche Euch einen guten Start in den Tag.

Hallo,
stimmt, irgendwas machst Du da falsch, ich verwende nicht Excell sondern LibreOffice ist aber grundsätzlich egal. Vermutlich hast Du den falschen Diagramtyp angegeben , in Libre Office nennt sich das xy Streudiagram. x Achse muss die Spalte A sein, Y Achse die Spalte B

mit Deinen Werten solltest du eigentlich was rausbekommen das in etwa so aussieht.

Grafik.png

Ich weiss ja nicht wie genau das letztlich sein muss, aber eine lineare Regression solltest Du auch noch mal in Betracht ziehen. Meinetwegen mit mehreren Stützpunkten. So "krumm" ist Deine Funktion ja letztlich gar nicht. Das Problem bei dem Arduino UNO ist letzlich die Genauigkeit eines float Datentyps.

Heinz

Link zur Grafik kommt noch

Grafik.png

Hallo,

ich hab jetzt mal die Gleichung aus #16 in den Sketch etwas weite oben eingetragen, und das Schleifeende geändert. Wenn man 6-7 Stellen in der Gleichung angibt ( gilt für float auf UNO ) dann kommt da max ein Fehler von etwa 2 absolut heraus. Die Rechenzeit für eine Brerechnung ist etwa 7microsekunden. (ohne den print) Mehr wie eine Berechnung musst Du ja letzlich nicht machen um von Deinem Messwert auf ein Ergebniss zu kommen.

Heinz

TOP!!! Es klappt! :slight_smile:
Es liegt definitiv an der Formel, die Excel mir ausgibt.
Die Grafik sieht exakt so aus, wie @Rentner sie gepostet hat.

Die Genauigkeit der Berechnung reicht mir völlig aus.

Danke Euch! Jetzt kann ich erst mal weiter basteln.

LG Andy

Also, wenn es noch jemanden interessiert:
Es gibt auch in Excel ein Diagramm, welches genau die Formel auswirft, die richtig ist.
Es ist kein Linien- sein, sonder ein Punktdiagramm (X,Y)

Ich habe es die ganze Zeit mit einem Liniendiagramm versucht.

LG Andy

Andreas_1979:
Also, wenn es noch jemanden interessiert:
...

Danke für die Rückmeldung!

Gruß

Gregor