Conversione valori non lineari

Ciao
sto cercando di convertire un valore analogico proveniente da un sensore di pressione in Bar, solo che la conversione non può essere fatta con una semplice moltiplicazione in quanto il sensore non è lineare.

di seguito la tabella volt - Bar :

Volt Bar

0,5 0
0,75 0,646383496
1 1,292766992
1,25 1,939150489
1,5 2,585533985
1,75 3,231917481
2 3,878300977
2,25 4,524684474
2,5 5,17106797
2,75 5,817451466
3 6,463834962
3,25 7,110218459
3,5 7,756601955
3,75 8,402985451
4 9,049368947
4,25 9,695752444
4,5 10,34213594

Non sto riuscendo a trovare una Formula matematica adeguata alla conversione.
Sicuramente dovrò sottrarre il valore 102 dal valore dell'analogRead per avere lo zero di partenza.

Suggerimenti ?

perchè dici che non è lineare?
caricandoli su una tabella ottengo questo

Allora, diciamo che vuoi ottenere il valore "p" della pressione in base al valore "a" letto dall'analogRead che corrisponde ad una certa tensione "v".

Intanto se ci fai caso la linearità c'è, come ti ha dimostrato Patrick_M: se per 0.5V (ossia il 102 letto dalla porta) hai 0 bar, la linearità c'è perché devi considerare questo "offset", ossia i valori in V devi riportarli togliendo 0.5V. Ossia se prendi il valore per 1,5V e lo raddoppi ottieni esattamente quello che leggi per 2,5V.

Detto questo, la funzione p=f(v) ha quindi un offset pari a -0,5 e pendenza pari a delta=dp/dv=2,585 (ossia il valore che leggi per 1,5V). per cui l'equazione della tua retta è:

p = f(t) = delta*(v -0,5)

Per riportarla all'input analogico quindi visto che a= v / 5 * 1023 (a 5 V leggo 1023), quindi v = a/1023 * 5 quindi sostituendo e semplificando:

p = f(a) = 2.585*(a/1023 * 5 - 0,5) = 0,012637018 * a - 1,292766993

Quella è la tua formula.

docdoc:
... p = f(a) = 2.585*(a/1023 * 5 - 0,5) = 0,012637018 * a - 1,292766993

Emmm ... docdoc, ti rammento che i float su Arduino sono a 32 bit per cui la precisione, tra parte intera e parte decimale, è di solo 6 o 7 cifre ... usarne di più non cambia di molto :smiley:

Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.

Guglielmo

gpb01:
Emmm ... docdoc, ti rammento che i float su Arduino sono a 32 bit per cui la precisione, tra parte intera e parte decimale, è di solo 6 o 7 cifre ... usarne di più non cambia di molto :smiley:

Heh si, lo so, ma io ho dato solo la formula costruita con la precisione dei dati che ha pubblicato, poi sta all'OP implementarla su Arduino, mica gli ho dato il codice... :smiley:

Comunque credo che sarà sufficiente per lui calcolare la pressione con 2 decimali, quindi gli basta fare al massimo:

p = 0,0126 * a - 1,2927

Grazie a tutti

non mi ero reso conto della linearità perche mi ero dimenticato di sottrarre il valore 102 al valore iniziale.

ho risolto in questo modo

int value1 = (analogRead(1)-102); 

pressione = value1 *0.012637018;

Chiariamo un punto, per non rischiare di dare informazioni ambigue a chi legge
y = m * x rappresenta una retta, ma anche
y = m * x + q rappresenta una retta
è lineare anche se non passa per (0,0).

Ma non una volta per indicare i coefficenti non si usavano lettere "basse"? tipo a,b,c....
una cosa del tipo:

y=a+b*x

comunque sarebbe lineare "anche" se i coefficenti fossero frazionari e/o negativi
che darebbero rette inclinate meno di 45 gradi oppure "in discesa" o con valori per x=0 diversi da zero, in piuù o in meno

Di solito si usano le lettere "basse" quando si scrive l'equazione della retta nella forma

a * x + b * y + c = 0

e si usano le lettere m,q quando la si scrive nell'altra forma

y = m*x + q

dove m indica il coefficiente angolare (immediatamente evidente scrivendo la dy/dx) e q indica l'ordinata all'origine.
Ovviamente è solo un modo comune di scrivere le equazioni, potremmo usare qualsiasi cosa, anche i nostri nomi per indicare i coefficienti.

Standardoil:
comunque sarebbe lineare "anche" se i coefficenti fossero frazionari e/o negativi
che darebbero rette inclinate meno di 45 gradi oppure "in discesa" o con valori per x=0 diversi da zero, in piuù o in meno

E' lineare perché x (ma anche la y) compare solo con esponente 1, indipendentemente da tutti gli altri coefficienti.