Salve a tutti,
Ho un sensore DHT22 che misura la temperatura con range -40°C a +125°C
Sul display ho una progress bar con valori che vanno da 0 a 100
Il dato che mi tira furi il sensore è un float con precisione mezzo grado, per esempio adesso ho 21.6°C
Mi sto incartando con le scale... c'è una formula per riportare quello che indica il sensore ma su una scala 0-100? dove 0=-40°C e 100=+125°C?
Grazie a tutti.
La mia prof di matematica non sarebbe fiera di me in questo momento
robotronico:
. . . La mia prof di matematica non sarebbe fiera di me in questo momento
Ma no! È solo pigrizia mentale. Sono sicuro che ce la puoi fare anche senza 'map'. Ti do un aiutino:
Se 'temp' è la variabile float che contiene il valore della temperatura, trasformala in modo che sia sempre positiva (facile, no?) e chiamala 'val'.
Ora è diventato un 'problema del tre semplice' (te lo ricordi?):
'val' : <MASSIMO_VALORE_POSITIVO_DI_'val'> = x : 100
Risolvi la 'x' e hai il valore per la progress bar.
Ciao
Tu vuoi andare da -40...125 a 0...100, quindi devi applicare un offset di 40 e un guadagno di
100/(125-(-40)) = 100/165 = 0,6061:
float x = int((t+40)0.606110)/10;
Prova:
t x
-40 0.0
0 24.2
100 84.8
125 100.0
Puoi anche fare: byte dieci_x = (t+40)0.606110;
e poi usare dieci_x/10.
P.s.: pgiagno, oltre alla proporzione devi considerare i 40 gradi di differenza all'inizio della scala, quindi:
x : 100 = (t+40) : 165
domandina all'utente che pone la domanda.
Ma arriverai mai a +125 ? Temperatura ambientale ?
Se si, io considererei che arrivi al max a 50° (e siamo già a un valore molto alto). Altrimenti tra 51 e 125 (da 75% circa a 100% non lo vedrai mai sul display)
Direi che siete fantastici!
Ovviamente -40 +125 non serve a nulla quando di parla di temperatura ambiente.
Per apprezzare meglio il variare della progressbar avevo pensato ad una temperatura che poteva andare da -10 a +50.
Grazie a tutti per i consigli. Siete preziosi.
robotronico:
Per apprezzare meglio il variare della progressbar avevo pensato ad una temperatura che poteva andare da -10 a +50.
Beh ti hanno già dato validi consigli, comunque sia se vuoi una progress bar cha vada da 0 a 100 da un valore float "t" verso una variabile int "bar", e parametrizzando i limiti (da verificare comunque) farei semplicemente una cosa del genere:
...
#define T_MIN -10
#define T_MAX 50
...
if (t < T_MIN) t = T_MIN;
if (t > T_MAX) t = T_MAX;
bar = (t-T_MIN)*100.0/(T_MAX-T_MIN);
...