den Beitrag habe ich gesehen. Leider beantwortet er meine Frage nicht.
Es geht um einen ganz normalen Benzintankgeber im Auto. Dieser hat einen Wertebereich von 10 - 73 Ohm. Wobei 10 Ohm bedeutet, dass der Tank voll ist.
Wie ich mit dem Arduino Widerstände messen kann, weiß ich bereits. Ich muss nur wissen, wie ich diese Werte von 73 Ohm bis 10 Ohm programmiertechnisch in 0% bis 100% umsetze.
Wenn's linear geht nimm doch einfach die map-Funktion.
Edit: nachdem ich nochmal mit eingeschaltetem Hirn gelesen habe stelle ich fest: ist nicht linear
Also könnte man nach guter alter Manier aus den 3 gegebenen Punkten eine Formel ableiten und die verwenden.
Vermutlich ist es der Genauigkeit aber zuträglicher, noch Zwischenwerte aufzunehmen. Oder halt nicht und dann die grobe Aufteilung zu verwenden.
Wie wäre es mit linearer Interpolation ?
Die Kurve aus Stützwerten bauen, die Werte dazwischen sind Geraden.
int Outwert (int _MoD){ // _MoD = Eingangswert
const int Tablength = 9;
const int Tab[Tablength][2]={ { 0 , 5 },
{360 , 10 },
{400 , 18 },
{440 , 39 },
{520 , 111 },
{600 , 194 },
{640 , 226 },
{680 , 248 },
{720 , 255 }};
// In Tabelle das passende Wertepaar suchen
int i = 0;
while (i < Tablength && _MoD > Tab[i][0]) i++;
// aus dem ermittelten Wertepaar und dem nächsten darüber den korrekten Wert interpolieren
int _out = ( ((Tab[i][1] - Tab[i-1][1])*( _MoD - Tab[i-1][0] ))
/ (Tab[i][0] - Tab[i-1][0] ))
+ Tab[i-1][1];
return _out;
}
Beispielcode, das Array ist auf deine Bedürfnisse anzupassen.
Das ganze habe ich auch mal gebraucht und mich mit Polynomen x-Ordnung rumgeschlagen.
Bis ich dann den Tip von Gunther bekam.
Wobei du natürlich versuchen kannst eine Funktionsvorschrift aus den 3 Werten zu errechnen, ist gar nicht so komplex wenn man weiß wie.
Schaue dir die Funktion dann graphisch an, gibt genug Online Schreiber oder Excel, ob diese im gesamten Wertebereich plausible Werte liefert.
Wenn nicht dann via linearer Interpolation, evtl. mit mehr Stützwerten wenn vorhanden
Könnte aber auch der linke Ast einer Parabel sein, mal sehen…
a = 0,0453064923
b = -5,341268092
c = 148,8820316901
Komme da auf diese Werte, für F(x)=ax^2 +bx +c.
Den Graph habe ich angesehen, da passen die Zwischenwerte nicht.
Also linearer Interpolation, mit 3 Werten dies
const int Tablength = 3;
const int Tab[Tablength][2]={ { 73 , 0 },
{23,50 },
{ 10,100}};
Ich würde sagen Du hast 2 Nichtlinearitäten: Den Sensor und die geometrisch Form des Tanks (Ist sicher kein Quader sondern eine sehr platgequetschte Kugel mit irgendwie rechteckigen horizontalen Querschnitt und in den verfügbaren Platz im Auto hinenmodelliert. Du brauscht mehr Meßpunkte als nur 3.
mal ehrlich: die sicherste und genaueste methode, wäre, langsam benzin einzufüllen und bei jedem widerstandswert die menge aufzuschreiben. daraus dann ein array mit 64 werten.
kann mich da Stefan nur anschließen. Ich würde eine Liste machen mit sovielen Werten wie möglich, diese Werte in ein Koordinatensystem eintragen, und schauen wo die Änderungen am wenigsten linear sind. Diese Bereiche sollten dann im fertigen Array stärker vertreten sein.
rudirabbit:
Den Tank auszulitern um viele Werte zu erhalten ist natürlich das Optimale.
Je nach Form des Tanks, wird es mit nur drei Werten ein Schätzeisen.
Und vor allem, wo eine richige Messung wichtig wäre ( wenn der Tank fast leer ist) ist die Nichtlinearität und damit der Fehler am größten.
Also Tank leerfahren und ein Tankauto mit einen Fahrer bestellen, der viel Gedult hat um halbliterweise aufzutanken.
Wenn man nicht erzählt, dass man vorhat, damit Unfug zu veranstalten, kann man an Tankstellen Benzinkanister erwerben und füllen.
Wenn es einem tatsächlich darauf ankommt, an der Arduino-Anzeige den Unterschied zwischen 1% und 0.5% voll live zu erleben, ist es sowieso gut, so einen Kanister immer dabei zu haben