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 kalibrerad mot Celsiusskalan och ger 10mV för varje grad Celsius. 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 utvecklingskortet som har en ATMega328P 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å utvecklingskortet. 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å utvecklingskortet är serieporten samma som den port där man laddar ner kod, dvs. USB, att skicka ut värden och annan information över serieporten 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 en ATMega328P 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 analoga vä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 analogt vä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 Celsius 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 utvecklingskortet 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 skräptecken. 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 fyrsiffriga 7-segment displayen som ingår i vårt “Add On Kit” Starterkit, men först skall vi lära oss dessa komponenter separat!

Föregående Sida    –    Nästa Sida