czwartek, 20 sierpnia 2015

[9] Arduino - LM35

W tym poście opisze sposób podłączenia oraz wykorzystania analogowego czujnika temperatury LM35. Odczytana wartość prezentowana będzie na monitorze portu szeregowego.

Część teoretyczna


LM35 jest to liniowy, półprzewodnikowy czujnik temperatury. Napięcie wyjściowe jest wprost proporcjonalne do odczytanej temperatury.

Rys. 1.1. Czujnik temperatury LM35 [1]

Parametry czujnika:
Zakres temperaturowy pomiaru: 0 do 100 st. C.
Napięcie zasilania: 4 - 20V
Czułość: 10mV/st. C.

Napięcie na pinie wyjściowym czujnika będzie zmieniać się o 10mV na każdy stopień Celsjusza.
Układ nie jest przeznaczony do pomiaru temperatur ujemnych. Przez co producent nie gwarantuje dokładności układu takich danych.

Podłączenie


Czujnik podłączamy odpowiednio:
GND - GND
OUT - do pinu analogowego Arduino. Ja wykorzystuje A0.
VS - 5V

Przykład 1


Przykład zawiera wyświetlenie wartości napięcia odczytanego z ADC oraz wartości temperatury. Napięciem odniesienia w tym przykładzie jest 5V.
const int tempPin = 0; //Pin ADC
 
float temp;   //Zmienna odczytana z ADC
float OdczyTemp = 0;  //Przechowuje zmienną    
 
void setup()
{
  Serial.begin(9600); //Wlaczenie portu szeregowego
}
 
void loop()
{
  temp = analogRead(tempPin); //Odczytanie wartości z ADC
  //Wyswietlenie wartosci napięcia 
  Serial.print("Napiecie: ");
  Serial.print(temp);
  //Przetworzenie wartosci na temperaturę
  //Odczytana temperatur = (Napięcie_odniesienia * 
  //*Napięcie z ADC * 100.0)/1024
  OdczyTemp = (5.0 * temp * 100.0)/1024;
  //Wyswietlenie wartości temperatury
  Serial.print(" TEMPERATURA: ");
  Serial.print(OdczyTemp);
  Serial.println("*C");
  delay(1000);
}


Rys. 1.1. Wynik działania programu z przykładu 1

Przykład 2


Drugi przykład przedstawia wersję ze zmianą napięcia odniesienia na 1.1V. Wykonuje się to poprzez wpisanie następującego polecenia analogReference(INTERNAL). Domyślnie ta wartość jest ustawiona na 5V. Oprócz polecenia internal możliwe jest wybranie następujących parametrów:
  • Default - odpowiada napięciu 5V, dla płytek zasilanych takim napięciem, albo wartości 3.3V;
  • Internal - dla ATmegi168 oraz 328 ta wartość wynosi 1.1V, natomiast dla ATmegi8 ta wynosi 2.56;
  • Internal1V1 - napięcie 1.1V dla Arduino Mega;
  • Internal2V56 - napięcie 2.56V dla Arduino Mega;
  • External - napięcie stosowane dla pinu AREF. Z zakresu od 0 do 5V;
W programie zastosowano następujący wzór obliczający temperaturę: OdczyTemp = temp / 9.31.
Taka zmiana wzoru spowodowana jest zmianą wartości napięcia referencyjnego.

1.1V / 1024 = 0.001074219 V = 1.074219 mV

Ponieważ zmiana napięcia o 10mV jest równa 1 st. C. 

10 mV / 1.074219 mV = 9.309089

Co daje w przybliżeniu 9.31.

const int tempPin = 0;
 
float temp;
float OdczyTemp = 0;   
 
void setup()
{
  //Zmiana napięcia ma 1.1V
  analogReference(INTERNAL);
  Serial.begin(9600);
}
 
void loop()
{
   //Odczytanie wartości z ADC
  temp = analogRead(tempPin);
 
  //Wyswietlenie wartosci napięcia 
  Serial.print("Napiecie: ");
  Serial.print(temp);
 
  OdczyTemp = temp / 9.31;
 
  //Wyswietlenie wartości temperatury
  Serial.print(" TEMPERATURA: ");
  Serial.print(OdczyTemp);
  Serial.println("*C");
  delay(1000);
}


Rys. 1.2. Wynik działania programu z przykładu 2

Bibliografia


[1]      LM35 - Datasheet: http://www.ti.com/lit/ds/symlink/lm35.pdf