sensore non lineare

Ciao a tutti,

ho un sensore di temperatura che mi sta facendo impazzire e non riesco a trovare una formula matematica che mi tiri fuori i valori corretti di temperatura da visualizzare su lcd.

vi riporto una tabella dove a sinistra c'è il valore reale di temperatura e sull'altra colonna il valore letto dall arduino

-40 1014 -35 1011 -30 1006 -25 1000 -20 992 -15 982 -10 969 -5 953 0 934 5 911 10 883 15 851 20 815 25 775 30 731 35 684 40 635 45 585 50 535 55 486 60 438 65 393 70 352 75 313 80 278 85 246 90 218 95 192 100 170 105 150 110 132 115 117 120 104 125 92 130 82 135 72 140 65 145 58 150 52

con i valori letti da arduino non sto riuscendo ad ottenere il valore di temperatura corrispondente.

che tipo di operazione matematica dovrei adottare? grazie a tutti

che circuito e sensore stai usando?

è un sensore di temperatura integrato non modificabile a tre fili Vcc Gnd e Out

:D metti la marca o un link a dove l'hai preso....

e il circuito ;)

in allegato il datasheet del sensore che collegato ad una resistenza di pull-up di 906 ohm a 5volt

Aem 30-2011 Sensor Data.pdf (342 KB)

Guarda, il tuo problma è semplice, lo ho risolto in pochi minuti di pensiero metti che "lettura" sia la variabile che leggi sul piedino analogico e "temperatura" la variabile float che usi per i calcoli, il calcolo è semplice:

temperatura = -0.0000000000000345637*pow(lettura,8) + 0.0000000000180304*pow(lettura,7)  - 0.00000000315596*pow(lettura,6) + 0.000000139104*pow(lettura,5) + 0.0000140775*pow(lettura,4) - 0.00613149*pow(lettura,3)  - 0.0833473*lettura*lettura - 4.18383*lettura + 934.437

naturalmente causa la scarsa precisione dei float su arduino ti conviene calcolare una tabella pre-compilata su un PC e interrogarla in tempo reale credo che un karma sia ben meritato, non trovi? Edit ah...., behhh con sensori che hanno una precisione di un grado e due, fino a un grado e mezzo, forse non serviva tutta la manfrina che ho messo io, la si puo' fare più semplice...

Standardoil: LOL

Come tabella potresti utilizzare quella che hai già ricavato sperimentalmente (ma spiega come la hai ricavata, con quante misure, come hai preso quelle temperature).

Poi vai di interpolazione lineare.

Come tabella potresti utilizzare quella che hai già ricavato sperimentalmente (ma spiega come la hai ricavata, con quante misure, come hai preso quelle temperature).

Presumo che la tabella sia ricavata da quella contenuta nel datasheet, e non da dati sperimentali, e quindi e' un riferimento ufficiale.

Poi vai di interpolazione lineare.

Concordo totalmente, anche su @StandarOil: LOL

Ho dato solo un'occhiata veloce, ma mi sembra che questa pagina possa dare delle info utili.

http://playground.arduino.cc/Main/MultiMap

Marco

la tabella l'ho calcolata dai valori del datasheet, le colonne temp e ohm sono le corrispondenze che danno sul datasheet quindi definisco un valore di resistenza di pull up e con la formula del partitore mi ricavo la colonna Vout e da questa la colonna con i valori che mi ritrovero su arduino

temp        ohm     r pullup        V out       mA sensore      valore arduino

-40     102122      906     4,95603137      0,048530497     1014,004018
-35     73340       906     4,938986612     0,067343695     1010,516661
-30     53249       906     4,916351214     0,092327578     1005,885458
-25     39064       906     4,886664999     0,12509382      999,8116587
-20     28939       906     4,848215782     0,16753225      991,9449489
-15     21637       906     4,799050703     0,221798341     981,8857739
-10     16321       906     4,737040692     0,290242062     969,1985256
-5      12413       906     4,659884376     0,375403559     953,4123433
0       9516        906     4,565342545     0,479754366     934,0690846
5       7354        906     4,45157385      0,605326877     910,7920097
10      5728        906     4,317154055     0,753693096     883,2897196
15      4496        906     4,161421696     0,925583117     851,4268789
20      3555        906     3,984532616     1,120824927     815,2353732
25      2830        906     3,787473233     1,338329764     774,9170236
30      2268        906     3,572778828     1,575299307     730,9905482
35      1828        906     3,343087052     1,828822238     683,9956108
40      1483        906     3,103809125     2,09292591      635,039347
45      1210        906     2,859168242     2,36294896      584,9858223
50      992     906     2,613277134     2,634351949     534,6765016
55      819     906     2,373913043     2,898550725     485,7026087
60      679     906     2,141955836     3,154574132     438,244164
65      566     906     1,922554348     3,39673913      393,3546196
70      475     906     1,719768284     3,620564808     351,8645909
75      400     906     1,531393568     3,82848392      313,323124
80      338     906     1,3585209       4,019292605     277,9533762
85      287     906     1,202849958     4,191114837     246,1031014
90      244,8       906     1,063607925     4,344803615     217,6141814
95      209,7       906     0,939768755     4,48149144      192,2766873
100     180,3       906     0,829881248     4,602780079     169,7937034
105     155,6       906     0,732856066     4,709871891     149,9423512
110     134,7       906     0,647160565     4,804458538     132,4090516
115     117,1       906     0,572280325     4,88710781      117,0885544
120     102,2       906     0,50684388      4,959333466     103,7002579
125     89,4        906     0,449065702     5,023106289     91,87884268
130     78,5        906     0,398679533     5,078720163     81,5698324
135     69,1        906     0,354322634     5,127679212     72,49441083
140     61,1        906     0,315892876     5,170096164     64,63168235
145     54,1        906     0,281741485     5,207790855     57,64430788
150     48,1        906     0,252070014     5,240540824     51,57352479

e io sulla base della tua tabella ho definito il polinomio generante... non ci vedo nulla di strano Mi hai già dato il mio Karma? grazie piuttosto, perchè resistenza da 906? dove la hai presa? non è valore standard che stabilità ha una resistenza del genere al variare della temperatura?

la resistenza... una di precisione che ho scelto per avere un range di tensione valido da applicare all'analog input.

io non vorrei una tabella di conversione perche penso mi perderei tanti valori decimali, piuttosto vorrei una formula ce mi faccia la conversione matamatica.

attualmente mi sono convertito i valori letti in modo che siano incrementali in base alla temperatura letta con questa formula: newlavule=(1/valore analog)*10000 ottenendo questa tabella:

9,861893858
9,895927883
9,941489775
10,00188377
10,08120462
10,18448405
10,31780356
10,48864122
10,70584624
10,97945513
11,3213137
11,74498979
12,2663961
12,90460746
13,68006744
14,61997686
15,74705575
17,09443138
18,70289787
20,58873027
22,8183301
25,42235302
28,42002367
31,91593353
35,97725682
40,63337659
45,95288751
52,00838511
58,89499905
66,69229822
75,5235377
85,40544421
96,43177562
108,8389852
122,5943429
137,9416687
154,7228795
173,4776662
193,8979358

adesso sto cercando di ottenere una K da moltiplicare ad ogni singolo valore per ottenere il valore di temperatura corretto. il valore di K sto cercando di generarlo matematicamente dallo stesso valore letto.

Spero di essermi espreso correttamente per farvi capire coso vorrei ottenere.

la formula te la ho data..... adesso sta a te

questa formula?
temperatura = -0.0000000000000345637pow(lettura,8) + 0.0000000000180304pow(lettura,7) - 0.00000000315596pow(lettura,6) + 0.000000139104pow(lettura,5) + 0.0000140775pow(lettura,4) - 0.00613149pow(lettura,3) - 0.0833473letturalettura - 4.18383*lettura + 934.437

‘lettura’ sarebbe = analogRead() ?

metti che “lettura” sia la variabile che leggi sul piedino analogico e “temperatura” la variabile float che usi per i calcoli, il calcolo è semplice:
lo avevo scritto prima…

l’ho modificata come segue:

temp =( -0.0000000000000345637*pow(value,8) + 0.0000000000180304*pow(value,7)  - 0.00000000315596*pow(value,6) + 0.000000139104*pow(value,5) + 0.0000140775*pow(value,4) - 0.00613149*pow(value,3)  - 0.0833473*value*value - 4.18383*value + 934.437)/-100000000;

ho aggiunto una divisione, ma sta funzionando invertita.

sull analog input ho 4.2V dovrei leggere 13° circa ma leggo 54
sull analog input ho 3.8V dovrei leggere 22° circa e leggo 21 <<< ok
sull analog input ho 2.7V dovrei leggere 46° circa ma leggo 0.90

>mirkoelettronics: ho corretto io un paio di tuoi post ... :)

Cortesemente, quando metti tutti questi valori, racchiudili, come per il codice, nei tag CODE ... il tutto sarà molto più leggibile. Grazie.

Guglielmo

grazie Guglielmo

mi era scappato uno zero, si vede che ero “sovrappenzero”
0.00613149pow(lettura,3) deve diventare 0.000613149pow(lettura,3)

l'ho modificata come segue:

 tempoil =( -0.0000000000000345637*pow(value,8) + 0.0000000000180304*pow(value,7)  - 0.00000000315596*pow(value,6) + 0.000000139104*pow(value,5) + 0.0000140775*pow(value,4) - 0.000613149*pow(value,3)  - 0.0833473*value*value - 4.18383*value + 934.437)/-1000000;

ho aggiunto una divisione, ma sta funzionando invertita.

sull analog input ho 4.2V dovrei leggere 13° circa ma leggo 4859.70 sull analog input ho 3.8V dovrei leggere 22° circa ma leggo 2150.30 sull analog input ho 2.7V dovrei leggere 46° circa ma leggo 60.50

il range che mi intaressa maggiormente va da 0 gradi a 150

Accipicchia, la ho controllata tre volte, è giusta e a me da il valore corretto con un massimo d'errore di 1 a 65 gradi sono sicuro di quello che ho scritto, ho un'intera pagina excel che me lo conferma sarà un problema lato arduino, magari 6-7 cifre di precisione non bastano....

OPS forse ho capito.... errore mio, ti ho scritto la formula "inversa": lettura a partire da numero, scusa la tabelle esce uguale, ma è differente la colonna d'ingresso, vergogna mia puoi ricavare da solo la formula diretta? temperatura a partire da lettura? senno' magari stasera... adesso ho un impegno, scusami