Bitte. Gerne - kurze Erklärung folgt noch.
Wenn Du magst, setze das post #94 als Lösung für die Nachwelt.
Kurzerklärung was da passiert.
Der wichtigste Teil befindet sich vor setup(). In
fsrPins[]
speichere ich die Pins, an denen sich Sensoren befinden sollen. In
fsrReading[sensorZahl]
werden die gelesenen Werte zu jedem Sensor gespeichert.
Das array ist abhängig von der Anzahl der benutzten Pins.
Um zu vermeiden, das ich eine abweichende Anzahl Werte speichere, wird in sensorZahl errechnet, wieviele Einträge ich brauche.
Das passiert auch bei
adcWert[]
Die Werte, sind die aus der Widerstandskombi errechneten Werte, zu denen Du auch die passenden Drücke hast. -> Kalkulationsblatt.
Ich weiss jetzt, wieviele Werte ich tatsächlich habe und muss sicherstellen, das wenigstens für jeden adc ein Druck da ist.
Die tatsächlichen Drücke sind mit 1000 multipliziert, damit ich immer mit Ganzzahlen rechnen kann und nicht wiederholt auf ggfls. ungenaue float zurückgreifen muss.
readSensors() bedarf keiner Erklärung.
In rechneSensors() wird eine Variable angelegt, die als Merker für den letzten errrechneten Druck dient. Wichtig: mit dem static verliert sie ihren Inhalt nicht, wenn die Funktion verlassen wird.
Dann werden die sensoren durchgezählt und der letzte ermittelte adcWert mit dem größten in dem array[0] verglichen. Die Elemente beginnen mit 0 - die Anzahl mit 1 - immer wieder Falle. ![]()
Nur wenn der Druck eben nicht 0 ist, wird auch gerechnet. Das passiert dann mit dem Aufruf: druck = newton(fsrReading[b]);
Das wird dann diese Funktion:
unsigned int newton(unsigned int analogWert)
(ich hab grad gesehen, es sollte unsigned int newton(const unsigned int analogWert) heissen)
Ich weiss, wieviele Werte ich in meinem Array habe, also frage ich jeden einzelnen ab.
Passt der Wert zum übergebenen, dann habe ich die aktuelle Position und gebe den passenden Druck zurück. Ist der analogWert > als der arrayWert, wird jetzt angenähert.
Nehmen wir an, der analogWert ist 630.
Ich durchlaufe den "Schrank" adcWert "Schublade für Schublade" bis 652, da passt die Bedingung noch nicht. Die nächste "Schublade" hat den Inhalt 571 und ist die 6te Schublade mit der Nummer 5 (i ist jetzt 5) Also muss ich jetzt annähern zwischen i und i-1. In Deinem Fall also die 630 annähern zwischen 652 und 571 - und dann umsetzen auf den Druck.
Und jetzt siehst Du wie wichtig es ist, das die Werte passen müsen, denn an Position 6 (mithin Nummer 5) ist 2500 und der davor 2000.
das map wäre ersetzt mit Werten: map(630, 652, 571, 2000, 2500) - Ergebnis: 2135.
Das ist der Wert, der zurückgegeben wird.
Dann gespeichert und durch Division und explizites cast als float dargestellt.
Durch das Mapping auf zwei aneinander stehenden Werte ist die Genauigkeit besser, als würdest Du über den gesamten Bereich mappen.
Um die Näherung ggfls. genauer zu bekommen, kannst Du noch weitere Stützwerte erfassen, die müssen dann an passender Stelle in adcWert und nWert eingefügt werden.