Edoardo Vignali
Approfondimento su sensori di temperatura
Tutorials -
Lunedì 02 Agosto 2010 00:59
Scritto da Edoardo Vignali

LM35

I sensori di temperatura più utilizzati in progetti Arduino sono quelli del tipo LM34 o LM35. Rispettivamente LM34 restituisce un valore di tensione proporzionale alla temperatura in gradi Fahrenheit mentre LM35 restituisce un valore di tensione proporzionale alla temperatura in gradi Celsius.

Questi due tipi di sensori hanno specifiche diverse a seconda delle lettere poste in fondo al nome, osservate la seguente tabella.

Nome Sensore Range Temperatura Precisione °C Output
LM34A -50F to +300F +2.0 F 10 mV/F
LM34 -50F to +300F +3.0 F 10 mV/F
LM34CA -40F to +230F +2.0 F 10 mV/F
LM34C -32F to +212F +3.0 F 10 mV/F
LM35A -55C to +150C +1.0 C 10 mV/C
LM35 -55C to +150C +1.5 C 10 mV/C
LM35CA -40C to +110C +1.0 C 10 mV/C
LM35C -40C to +110C +1.5 C 10 mV/C
LM35D 0C to +100C +2.0 C

10 mV/C

Gli schemi per l'utilizzo tipico di questi due sensori sono riportati nella foto sottostante.

Utilizzo tipico LM35

LM34 utilizzo tipico

A sinistra il nostro chip avrà come range una temperatura minima maggiore di zero, ma se vogliamo misurare temperature negative dovremmo utilizzare lo schema sulla destra.

Un progetto interessante per misurare un range di temperature che comprenda quelle negative, è quello realizzato dall'amico Federico del forum di arduino.

Schema LM35Dz sottozero

Cliccate sull'immagine per ingrandire.

R1=18k

R2,R5 = 2x18k, ovvero 2 resistenze da 18k in serie.

R3,R4 = 56k

D1,D2 = 1n4148

C1 = 1pF

L'espediente che utilizziamo è dare come riferimento a massa una tensione non nulla, ovvero 2Vd pari a 0.96V, in questo modo innalziamo lo zero e le tensioni relative a temperature minori di zero saranno misurabili sul Pin 1 mentre sul Pin 0 misureremo le temperature maggiori di zero.

L'uscita avrà sempre una risoluzione di 10mV/C con un incertezza di 0.5C.

Ecco uno sketch per testare il nostro circuito.

/* ----------------LM35 per tutta la scala centigrada---------------

   Questo codice consente di usare un LM35 per misurare anche      
   temperature negative. 

   La configurazione usata è quella con due diodi tra il pin GND   
   del sensore e il GND dell'alimentazione.
   Vengono prelevati due segnali che andranno a due ingressi 
   analogici di Arduino:
   - il primo dal pin GND del LM35 chiamato "ref"
   - il secondo dal pin OUT del LM35 chiamato "sensoreTemperatura"

   La differenza tra "sensoreTemperatura" e "ref" contiene 
   l'informazione della temperatura che il sensore ha misurato

   creato il 27 Febbraio 2010
   da Federico Vanzati
*/

#define LM35_TEMP 0  // Pin analogico 0
#define LM35_REF 1   // Pin analogico 1

float temperatura; // variabile in cui viene salvata la temperatura in gradi centigradi 
float prev_temperatura = 0; // temperatura precendente
int ref; // valore della tensione di riferimento dei due diodi
int ref_medio = 0; // valore della tensione di riferimento medio
int sensoreTemperatura; // valore di tensione letto dal pin OUT del sensore 
int sensoreTemperatura_medio = 0; // valore sensoreTemperatura medio
int cont; //contatore usato per ottenere un valore medio

void setup()
{
  Serial.begin(9600); //inizializzazione della comunicazione seriale
}

void loop()
{
  // vengono sommati 10 valori di temperatura per poi farne la media
  for( cont = 0; cont < 10; cont++)
  {
    sensoreTemperatura = analogRead(LM35_TEMP); // lettura della tensione del pin OUT LM35
    sensoreTemperatura_medio += sensoreTemperatura; //sommatoria dei valori

    ref = analogRead(LM35_REF); // lettura della tensione di riferimento
    ref_medio += ref; // sommatoria dei valori

    delay(500); // intervallo di campionamento
    //la lettura durera' 10 (numero di camoioni) x 500ms (intervallo tra due campioni) = 5000ms
  } 

  if(cont == 10) // quando ho sommato i dieci valori campionati si esegue:
  {
    cont = 0; // azzeramento contatore, per far ripartire il successivo campionamento

    // media della sommatoria dei dieci valori campionati di ref e sensoreTemperatura
    sensoreTemperatura_medio = sensoreTemperatura_medio / 10;
    ref_medio = ref_medio / 10;

 // conversione dei valori medi misurati in una temperatura in gradi centigradi
    temperatura = (sensoreTemperatura_medio - ref_medio) * 100/2.56;
    temperatura = temperatura * 5/1024;

    // valore di temperatura che verra' mostrato quando si e' in fase di campionamento
    //e non c'e' una temperatura disponibile
    prev_temperatura = temperatura; 

    // stampa su seriale dei due valori medi
    Serial.print(" ref_medio: ");
    Serial.print(ref_medio);
    Serial.print(" temp_medio: ");
    Serial.print(sensoreTemperatura_medio);

    // prima di un successiva acquisizione e media questi valori vanno azzerati
    sensoreTemperatura_medio = 0;
    ref_medio = 0;
  }
  else{
    temperatura = prev_temperatura;
  }
  // stampa su seriale della temperatura ottenuta in gradi centigradi
  Serial.print(" gradi: ");
  Serial.println(temperatura);

}

Immagini tratte dal datasheet della National, Codice tratto dalla sezione italiana del playground scritto da Federico Vanzati, per maggiori approfondimenti cliccate sul nome.

CC

 

Gioblu Robotics © 2010 - 2012 · Sitemap · privacy

gioscarab@gmail.com · Via Savona 123 20146 Milano MI · PI 06977550968 · Codice fiscale MTLGNN86S09F205F

Gioblu BOTServer è online dal 10 Aprile 2010 - 319.232 Visite - 1.027.175 Pagine visualizzate - 182.309 Visitatori unici - 536 utenti attivi