LM35 Temperatursensor Analog

Aus Arduino Hannover
Version vom 26. November 2015, 00:38 Uhr von Olafmeierhannover (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Analog Temperatursensor LM35

LM35DZ ist ein analoger Temperatursensor, hier im 3-beinigen TO-92 Gehäuse. Der Sensor ist kalibriert und hat eine Abweichung von 0,5°C bei 25°C Umgebungstemperatur.

LM35Pinning.png

Die Auswertung der Temperatur kann direkt in Grad Celsius erfolgen; eine lineare Spannungsänderung von 10mV entspricht einer Temperaturänderung von 1°C. Die Sensoren LM35 (-55°C - + 150°C) und LM35C (-40°C - + 110°C) haben neben einem weiteren Temperaturbereich auch eine etwas bessere Linearität als der Sensor LM35D (0°C - + 100°C). Alle Temperatur­sensoren arbeiten in einem weiten Betriebs­spannungs­bereich von 4V bis 30V und teilweise auch mehr. Bei Zimmertemperatur beträgt die relativ geringe Stromaufnahme weniger als 60uA. Die genauen technischen Daten können dem jeweiligen Datenblatt entnommen werden.

In Abhängigkeit der Temperatur zwischen 0°C und + 100°C stellt der Sensor LM35DZ also eine analoge Spannung zwischen nahe 0mV und 1000mV, entsprechend bis zu 1V an seinem Ausgangspin bereit. Dadurch ergibt sich die besagte Spannungsänderung von 10mV je 1°C. Wenn also bei 0°C eine Ausgangsspannung von 0mV und bei 100°C eine Spannung von 1000mV erwartet werden kann und ein linearer Zusammenhang hier vorausgesetzt wird, kann die Temperatur anhand der gemessenen Ausgangsspannung einfach bestimmt werden. Die gemessene Ausgangsspannung in mV muss nur noch durch die Spannungsänderung je °C von 10mV geteilt wird. Angenommen, es werden 500mV gemessen:

500mV / 10mV/°C = 50°C

Bei Zimmertemperatur von etwa 20°C kann demzufolge eine Ausgangsspannung von 200mV erwartet werden.

Der im Arduino Uno verwendete Analog-Digitalwandler des Atmel Chips Atmega328 hat eine Auflösung von 10-bit. Das entspricht 1024 digitalen Wertemöglichkeiten im Bereich zwischen 0 und 1023. Davon ausgehend, dass der Controller mit 5V betrieben wird und dieses auch die Referenzspannung des AD-Wandlers ist, beträgt die kleinste zu messende Spannung 4,88mV für jeden digitalen Schritt

5000mV / 1024 = 4,88mV
LM35BB.jpg

Um nun den oben angenommenen Spannungswert von 200mV bei 20°C mit dem Arduino zu messen, muss der vom AD-Wandler ausgegebene Digitalwert nur noch mit den 4,88mV je Schritt multipliziert werden. Oder im Umkehrschluss wird bei 20°C und damit 200mV Ausgangsspannung des Temperatursensors ein digitaler Wert von überschlägig 41 je nach Toleranz erwartet.

200mV / 4,88mV = 40,98

Nachdem die einfache Schaltung auf dem Steckbrett schnell aufgebaut ist, kann die obige Theorie mit einigen Zeilen Code schnell überprüft werden.

const byte TEMPSIGNALPIN = A5;
ArduinoLM35Res.png

Der Analogeingang A5 des Arduino Uno mit dem hier gewählten Namen TEMPSIGNALPIN wird direkt mit dem Ausgang des Sensors verbunden. Maximal wird ein 10-bit Wert vom AD-Wandler geliefert. Die Variablendeklaration über 8-bit mit einem byte reicht hierfür jetzt nicht mehr aus, da der Rückgabewert der Funktion analogRead() ein 16-bit Wert. Deshalb muss hier für die Variable value mindestens ein int deklariert werden. Über die Funktion analogRead(PIN) kann dann der digitale Wert des AD-Wandlers in die Variable value eingelesen werden.

int value = analogRead(TEMPSIGNAL);

Abschließend muss dieser Wert der Variablen jetzt nur noch über den seriellen Monitor zur Anzeige gebracht werden.

Im nächsten Schritt wird aus dem ausgelesenen Digitalwert eine Spannung in mV berechnet.

float milliVolt = (value * 5000.0) / 1024.0;

Aus der berechneten Ausgangsspannung des Sensors kann nun mit der Kenntnis, dass 10mV einer Temperaturänderung von 1°C entsprechen, sehr einfach die Temperatur berechnet werden.

float celsius = milliVolt / 10;

Nachfolgend dazu die erste Version des noch sehr rustikalen Sketches zum Download LM35SimpleI.png

Verbesserungspotential des Sketches

Wenn jetzt prinzipiell zumindest auch alles funktioniert, gibt es aber doch noch Verbesserungspotential. Die Anzeige der Temperatur schwankt noch relativ stark. Diese Schwankungen lassen sich aber durchaus einfach reduzieren, indem eine Reihe an Messwerten hintereinander erfasst und daraus ein Mittelwert gebildet wird. In der Variablen

byte measureCycles = 10;

wird dazu die Anzahl der Messungen hinterlegt. In der darauffolgenden Schleife wird entsprechend häufig der Sensor abgefragt und alle gemessenen Werte kumuliert. In der Zeile