sensore di temperatura LM335z

Salve a tutti
Ho un problema con il sensore di temperatura LM335z
Ho eseguito (correttamente) i collegamenti come da schema allegato ma non riesco a capire perchè i valori sono invertiti, nel senso che se scaldo il sensore la temperatura diminuisce e viceversa.
nel codice che allego si può notare come ho risolto con una if e la funzione abs però credo che il problema sia altro.
uso un arduino uno e alimento il sensore con i 5V di arduino stesso.
questo è il semplice codice:

float kelvin;
float celsius;

void setup()
{ Serial.begin(9600);
  pinMode(A0, INPUT_PULLUP);
}
void loop()
{ float lettura = analogRead(A0);
  kelvin = ((lettura / 1023) * 500);
  celsius = kelvin - 273.15;
  Serial.print("Lettura analogica: ");
  Serial.print(lettura);
  Serial.print("  -  ");
  Serial.print("Gradi Kelvin: ");
  Serial.print(kelvin);
  Serial.print("  -  Gradi Celsius: ");

  // invertendo i commenti e regolando il potenziometro, visualizza correttamente
  Serial.println(celsius);
  // if(celsius > 0) Serial.print("-"); else Serial.print("+");
  // Serial.println(abs(celsius));
  delay(2000);
}

Qualcuno mi può aiutare?

Se non hai messo una resistenza pullup esterna temo che la resistenza pullup interna non basta. È troppo alta. Inoltre un entrata analogiva non ha bisogno di un pinMode().

float lettura = analogRead(A0);
  kelvin = ((lettura / 1023) * 500);
  celsius = kelvin - 273.15;

L' uso dei tipi di variabili é errato.
Amalog read Ti da un int. non serve una float, anzu peggora la precisione.
Poi per fare il calcolo in float devi dare le costanti in float
percui ((lettura / 1023.0) * 500.0)

Ciao Uwe

Grazie per la risposta
ho modificato lo sketch ma il risultato non cambia, il valore ottenuto è rovesciato e poi volevo chiedere: ma la resistenza R1 non funge da pullup?

float kelvin;
float celsius;
int lettura = 0;

void setup()
{ 
  Serial.begin(9600);
}
void loop()
{ 
  lettura = analogRead(A0);
  kelvin = ((lettura / 1023.0) * 500.0);
  celsius = kelvin - 273.15;
  Serial.print("Lettura analogica: ");
  Serial.print(lettura);
  Serial.print("  -  ");
  Serial.print("Gradi Kelvin: ");
  Serial.print(kelvin);
  Serial.print("  -  Gradi Celsius: ");

  // invertendo i commenti e regolando il potenziometro, visualizza correttamente
  Serial.println(celsius);
  // if(celsius > 0) Serial.print("-"); else Serial.print("+");
  // Serial.println(abs(celsius));
  delay(2000);
}

amedeodivito:
ma la resistenza R1 non funge da pullup?

Ma Tu quella resistenza l'hai messa? che valore hai scelto?

certo che si, ho fatto varie prove: da 2k a quella attuale da 6.8k
comunque pensavo fosse chiaro perchè nella foto allegata al primo post c'è

Hai un tester? misura la tensione che sul pin A0 dove é collegato il sensore.
Ciao Uwe

Lettura analogica: 603 - Gradi Kelvin: 294.72 - Gradi Celsius: 21.57
Lettura analogica: 603 - Gradi Kelvin: 294.72 - Gradi Celsius: 21.57
Lettura analogica: 603 - Gradi Kelvin: 294.72 - Gradi Celsius: 21.57
il tester segna: 2.84V

tenuto 10 sec. tra le dita il sensore
Lettura analogica: 600 - Gradi Kelvin: 293.26 - Gradi Celsius: 20.11
Lettura analogica: 600 - Gradi Kelvin: 293.26 - Gradi Celsius: 20.11
Lettura analogica: 600 - Gradi Kelvin: 293.26 - Gradi Celsius: 20.11
il tester segna: 2.82V

C'è qualcosa che non torna
il sistema non può comportarsi in questa maniera, la mia è una affermazione, non una ipotesi
c'è un errore di cablaggio e/o un guasto da qualche parte, propendo per il primo
ricontrolla, a partire da zero, tutto il cablaggio, controlla anche la bread-board,
visto che hai un potenziometro usalo da solo per provare l'ingresso analogico di Arduino
così ci togliamo anche il dubbio che il potenziometro abbia falsi contatti e "stari a intermittenza" il sensore
comunque togli il potenziometro e usa il sensore senza correzione, per prova va bene, la misura esatta la faremo dopo
in particolare controlla la tensione sul piedino del sensore "e" sul piedino di Arduino
fai casomai una bella foto al tutto....

Allora, in verità sto perdendo le speranze :confused:
il potenziometro da solo funziona perfettamente e sul pin A0 leggo da 0 a 1023
quindi escludiamo sia il clone di arduino che il potenziometro.
allego le foto del cablaggio con e senza potenziometro e dei sensori (comprati in Cina in 2 acquisti separati e da 2 venditori differenti)
in una foto si vede il monitor seriale (sballato) e il sensore non reagisce alla temperatura mentre nel cablaggio con il potenziometro reagisce seppur in maniera rovesciata.

...oops ho dimenticato di allegare le foto

A prima vista hai messo il sensore rovescio

Oddio, a me non sembra.
Tieni presente che nella foto con il potenziometro dove il lm335 era al contrario, i cavetti erano invertiti

Ciao, Amedeo
Prova a collegare solo l'anodo (il terminale a destra, con l'LM335 in piedi visto dal lato della sigla) a massa e il catodo (il terminale centrale) attraverso 1kOhm a +5V: che leggi con il tester tra il catodo (resistenza) e massa?
2,84V sono pochini: 284K-273K=11°C!
A 20°C dovresti avere 2,93V.

Inoltre, è alquanto critico un termometro fatto con quella sonda e il convertitore A/D del 328p a 10 bit: hai una risoluzione teorica massima di 5mV, pari a 0,5 gradi (che sarebbe accettabile, se fosse reale), ma devi considerare anche la non linearità del convertitore (su cui bisognerebbe approfondire) e il rumore. L'escursione del convertitore va da 0K (-273°C) a 500K (227°C) a passi di 0,5°C!

Insomma: per fare un termometro ti consiglio di giocare con una sonda DS18B20, che esce in digitale 1-wire senza necessità di un convertitore A/D esterno. :slight_smile:

dunque;
mi sono scollegato da arduino
piedino a destra (leggendo la sigla) a massa
piedino centrale resistenza da 1k
altro capo resistenza a +5.07V
tra massa e piedino centrale leggo la stessa tensione = 5.07V

L'anodo è collegato a massa?
Che leggi direttamente tra K e A?
Se leggi 5,07V, significa che si è interrotto l'LM335Z.

Rileggi il mio messaggio precedente che ho completato e passa al DS18B20! :slight_smile:

amedeodivito:
Lettura analogica: 603 - Gradi Kelvin: 294.72 - Gradi Celsius: 21.57
Lettura analogica: 603 - Gradi Kelvin: 294.72 - Gradi Celsius: 21.57
Lettura analogica: 603 - Gradi Kelvin: 294.72 - Gradi Celsius: 21.57
il tester segna: 2.84V

tenuto 10 sec. tra le dita il sensore
Lettura analogica: 600 - Gradi Kelvin: 293.26 - Gradi Celsius: 20.11
Lettura analogica: 600 - Gradi Kelvin: 293.26 - Gradi Celsius: 20.11
Lettura analogica: 600 - Gradi Kelvin: 293.26 - Gradi Celsius: 20.11
il tester segna: 2.82V

  1. hai le mani fredde :wink: :wink: :wink: :wink:
  2. i 5V non sono perfettamente 5V ma un po di meno. Su una foto ho visto 4,89V.

amedeodivito:
dunque;
mi sono scollegato da arduino
piedino a destra (leggendo la sigla) a massa
piedino centrale resistenza da 1k
altro capo resistenza a +5.07V
tra massa e piedino centrale leggo la stessa tensione = 5.07V

  1. prova di girare il LM335. sembra messo al rovescio.

Ciao Uwe

Datman:
Ciao, Amedeo
Prova a collegare solo l'anodo (il terminale a destra, con l'LM335 in piedi visto dal lato della sigla) a massa e il catodo (il terminale centrale) attraverso 1kOhm a +5V: che leggi con il tester tra il catodo (resistenza) e massa?
2,84V sono pochini: 284K-273K=11°C!
A 20°C dovresti avere 2,93V.

Giusto

[quote author=Datman }
Inoltre, è alquanto critico un termometro fatto con quella sonda e il convertitore A/D del 328p a 10 bit: hai una risoluzione teorica massima di 5mV, pari a 0,5 gradi (che sarebbe accettabile, se fosse reale), ma devi considerare anche la non linearità del convertitore (su cui bisognerebbe approfondire) e il rumore. L'escursione del convertitore va da 0K (-273°C) a 500K (227°C) a passi di 0,5°C!
[/quote]
Un po meno giusto.
Non consideri la precisione del LM335 che é data dal produttore come 1°C se non calibrato e 0,5°C se hai calibrato il LM335 col entrata adjust.
Per questo l' errore della temperatura é maggiore perché devi sommare l' errore del LM335 con quella del convertitore ADC e con la precisione della tesione di alimentazione 5V che prendi come riferimento.

Ciao Uwe

Ovviamente, ma mi stavo limitando a considerare la conversione.

Dalle curve si vede che la corrente deve essere almeno 0,7mA. Perciò, con Vcc=5V e circa 3V sulla sonda, la resistenza massima utilizzabile risulta: 2/0,7=3kOhm circa

Datman:
Dalle curve si vede che la corrente deve essere almeno 0,7mA. Perciò, con Vcc=5V e circa 3V sulla sonda, la resistenza massima utilizzabile risulta: 2/0,7=3kOhm.

Considerazione giusta che avevo fatto giá all inizio. Vito che il To usa una 1kOhm dovremmo stare nel range.
Il datasheed dice che la corrente deve essere tra 0,45mA e 5mA.

Ciao Uwe

Per lo op, hai ragione, ho preso una cantonata, scusami
Comunque quei numeri si spiegano solo con un errato collegamento, o sensore guasto
Facendo riferimento alla foto col tester, in quelle condizioni cosa misuri direttamente al pin centrale del sensore?