Arduino – Lektion 10: TMP36 analog temperaturgivare

För att mäta temperaturer på ett billigt sätt kan man använda TMP36 givaren, den är en analog temperaturgivare som är kallibrerad mot Celciusskalan och ger 10mV för varje grad Celcius. Den arbetar inom området -40°C till +125°C och har en noggrannhet på ±1°C vid 25C och ±2°C över hela området. Den ger en utspänning på 750mV vid 25°C. Givaren kan arbeta från 2.7VDC till 5.5VDC så den fungerar även bra i 3.3VDC system, men här arbetar vi med Arduino Uno och då har vi 5VDC. Givaren har 3 ben och man ansluter den till 5VDC, 0VDC och sedan lämnar den en utspänning linjärt beroende på temperatur, lättare kan det inte bli!

Källkoden till vårt projekt kan laddas ner här och vi kommer i detta projekt att använda oss av flyttal, dvs. tal med decimalvärden. Att använda flyttal i en 8-bitars mikroprocessor fungerar bra, men det kräver lite mer kod än heltal, som ni kan se så blir den kompilerade koden lite drygt 4K bytes. När man arbetar med flyttal är det viktigt att tänka på att man lägger till en decimal på konstanta värden i formler så att kompilatorn vet att uträkningen skall ske med flyttal, annars blir resultatet blir fel då det sker avrundningar till heltal, det är kommenterat i källkoden så ni förstår vikten av detta.

TMP36_Connection

Inkopplingen som bilden ovan visar, sära lite på pinnarna och stoppa ner TMP36 i ett kopplingsdäck, ta sedan en röd tråd till +5V, svart tråd till GND och slutligen t.ex. grön tråd in till A0 på Arduino Uno. Detta är så pass enkelt så vi har valt att skippa foto för detta.

void setup()
{
// Initiate serial port at 9600baud  
  Serial.begin(9600);
}

I setup() initierar vi upp serieporten med 9600baud, på Arduino Uno är serieporten samma som den port där man laddar ner kod, dvs. USB, att skicka ut värden och annan information över seriporten kan vara ett bra och billigt sätt att debugga kod som vi skrivit i en tidigare lektion.

void loop()
{
  int   rawAnalogValue;
  float volt, degC;

I början på loop() definierar vi upp en heltalsvariabel som heter “rawAnalogValue” samt två flyttaltsvariabler “volt” och “degC”. I dessa variabler skall vi lagra värden från analogporten samt räkna ut vad det “råa” analogvärdet till spänning (volt) och till grader (Celcius).

 rawAnalogValue = analogRead(0);

Denna rad ovan läser av analog ingång 0, dvs. där vi anslutit TMP36 givaren och sparar detta värde i ett heltal. Då vi har 10 bitars upplösning på de analoga ingångarna i ATmega328 (som används på Arduino Uno) ger de oss ett värde på 0 till 1023 (heltal).

 volt = rawAnalogValue * 5.0 / 1023.0;

Nästa rad som kommer blir att räkna ut spänningen i volt från det “råa analogvärdet”, eftersom full skala är 5V och 5V motsvarar 1023, så multiplicerar vi först med vad full skala skulle vara, dvs. 5V sedan dividerar vi med upplösningen. Gör inte tvärt om, då kan man få för dålig upplösning, så se alltid till att multiplicera upp ett värde före man dividerar ner det. Det enda man får tänka på här att man inte kommer “out of range” med ett större värde än vad som kan hanteras i den typ man använder. Men det är ingen fara här. Notera att även om det är 5V och 1023 bitar skriver vi 5.0 och 1023.0, detta för att kompilatorn skall hantera dessa konstanter som flyttal, annars skulle 5/1023 bli 0 och det spelar då ingen roll vad vi har för analogvärde, temperaturen och spänningen skulle då alltid bli 0 oavsett insignal!

 degC = (volt - 0.5) * 100.0;

Den sista uträkningen ovan räknar ut graderna i Celcius från den uträknade spänningen. Eftersom vi vet att givaren ger en upplösning på 10mV/°C blir det samma sak som att säga att givaren ger 100°C/V om man inverterar värdet (matematik). I databladet på TMP36 givaren kan man även utläsa att vid 25°C ger givaren 750mV, det innebär att den ger 500mV, dvs. 0.5V vid 0°C (750mV – 25°C * 10mV).

  Serial.print("Raw: ");
  Serial.print(rawAnalogValue);
  Serial.print("   Voltage: ");
  Serial.print(volt);
  Serial.print("V   Deg: ");
  Serial.print(degC);
  Serial.println("C"); // Notice last is println(), so we make a line

  delay(500); // Wait 0.5s
}

Sedan skall de uträknade värdena presenteras via den inbyggda seriella monitorn, efter att ha kompilerat koden och laddat upp den till Arduino Uno, så hittar du den seriella monitorn via Tools menyn eller klickar du bara på förstoringsglaset i toolbar menyn till höger.

TMP36_Monitor

Den seriella monitorn kan vara inställd på annan baudrate, så ändra till 9600 baud längst ner till höger om den inte redan står på detta, står den på annat blir det bara massa olika tecken. Har kompilering och uppladdning blivit rätt samt att TMP36 givaren har kopplats in som angivet ovan, skall det kommer text som ovan, den uppdateras med ny rad 2ggr/sekund.

Vi kommer i en senare lektion använda samma givare, men skriva “smartare” kod som blir mindre utan flyttal och presentera det på ett snyggt sätt både på LCD och den 4 siffriga 7 segment displayen som ingår i vårt “Add On Kit” för Arduino Starterkit, men först skall vi lära oss dessa komponenter separat!

Föregående Sida    –    Nästa Sida