Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Ritorna ai Tutorial

Tutorial: come usare un LM35DZ per misurare anche temperature sottozero

Il circuito che vedete sopra consente di usare un LM35DZ per misurare anche temperature sotto lo zero, alimentando l'integrato con 0V e +5V. Per attivare questa possibilità si collegano due diodi 1N4148 in serie tra il piedino GND del sensore e il GND dell'alimentazione, in questo modo sul piedino GND del sensore si misureranno circa 0.960V a temperatura ambiente. Questo espediente, di dare una tensione di riferimento superiore a 0V al piendino GND dell'LM35DZ serve per innalzare il punto dove è collocata la tensione che rappresenta gli 0°C, quindi:

- tensioni inferiori del piedino LM35_OUT alla caduta di tensione sui diodi corrispondono a temperature sotto lo zero;

- tensioni superiori del piedino LM35_OUT alla caduta di tensione sui diodi corrispondono a temperature sopra lo zero;

L'uscita OUT del sensore continua a dare 10mV/°C con una risoluzione di 0.5°C, come nella configurazione "classica". Visto che per ogni variazione di 0.5°C della tempreratura corrisponde un incremento (o decremento) di 5mV di tensione su LM35_OUT e che la risoluzione degli ingressi analogici di Arduino è di circa 4.9 mV, ho ritenuto opportuno amplificare un po' il segnale così che la misura fatta da Arduino avvenga con un po' più di precisione.

Nel codice ho previsto anche una media su 10 valori campionati, sempre per ridurre l'errore sulla misura.

I due stadi di amplificazione sono fatti con degli amplificatori operazionali (io ho usato un LM358) in configurazione non-invertente con un guadagno di circa 2.56. Il guadagno di un amp. non-invertente è dato da:

Guadagno = 1 + (R2/R1)

Io ho usato R2 = 56kOhm e R1 = 2 x 18kOhm

N.B. 1: Più si aumenta il guadagno più si restinge il Range di temperature misurabili.

N.B. 2: La risoluzione rimane di 0.5°C, diminuisce solo l'errore che si fa quando trasformo il segnale in digitale.

La resistenza R5 = 18kOhm è consigliata nel datasheet.

Potete trovare il Tutorial più dettagliato in PDF qui

Il codice d Arduino qui

Codice:

/* ----------------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);

}

Ritorna ai Tutorial