6. Lämpötila-anturin lukeminen

Alunperin julkaistu: 24.5.2024

Viimeksi muokattu: perjantai 24.5.2024

Tämä sivu on osa Arduino Opas 2:sta. Oppaassa käytetyt koodit löytyvät GitHubista: https://github.com/hutasunet/ArduinoOpas2.

Lämpömittari on nimensä mukaisesti laite, joka näyttää lämpötilaa mitatulle aineelle, olipa se ilma, maa, vesi tai muu aine. Lämpötilatieto onkin hyvin usein sellainen helpohko ja sillä tavalla mielenkiintoinen aihe, että se jossain vaiheessa alkaa kaikkia Arduinon kanssa puuhastelevia kiinnostamaan, että kuinka sellaisen saa omaan projektiinsa mukaan.

Perinteinen ja yksinkertainen, helppo tapa lukea lämpötilatietoa on käyttää vastusta, jonka resistanssi muuttuu lämpötilan mukaan. Näitä vastuksia ovat NTC ja PTC vastukset, missä NTC-vastuksella resistanssi pienenee mitä suuremmaksi lämpötila muuttuu ja PTC-vastuksella toiminta on päinvastoin. Tällaisia lämpötila-antureita on useita erilaisia ja niitä löytyy eri valmistajilta tavattoman paljon, joten keskitytään seuraavissa kappaleissa vain ns. yleisiin saatavilla oleviin lämpötila-antureihin eli anturielementteihin.

Erilainen tapa lukea lämpötilatietoa on käyttää digitaalisia lämpötila-antureita. Näitäkin on paljon erilaisia ja niiden toiminta perustuu lämpötila-anturielementin lisäksi integroituun piiriin, joka muuttaa anturitiedon digitaaliseen tietoon käyttäjän puolesta ja käyttäjän tarvitsee vain lukea kyseinen tieto anturilta. Tieto liikkuu Arduinolle väylää pitkin ja väylänä voi olla jokin lyhyen etäisyyden väylä kuten SPI, I2C, 1Wire. Jos lämpötila-anturi on esim. 10 metrin päässä päätelaitteesta, voi olla mahdollista käyttää jotain pidemmälle matkalle suunniteltua sarjaliikenneväylää kuten RS485 tai CAN tms.

Samaa periaatetta sovelletaan nykyisin monessa muussakin anturissa, kuten esimerkiksi kiihtyvyysantureissa, inklinometreissa, voiman mittauksessa, massan mittauksessa, ilmanlaadun mittauksessa, valovoiman mittauksessa jne. Fysikaalisia suureita on siis paljon, joita antureilla voidaan mitata. Seuraavissa kappaleissa käydään läpi muutama eri vaihtoehto erilaisilla antureille ja niiden käytölle sekä ohjelmoinnille.

6.1 NTC-vastus ja sen käyttäminen

NTC-vastuksia on monia erilaisia ja tässä esimerkissä käytetään 10 kilo-ohmin anturia. Anturiin merkitty resistanssiarvo yleensä kertoo, mikä on sen vastusarvo 25 Celsius asteen lämpötilassa. Resistanssi muuttuu astetta kohden eri antureissa eri tavalla ja on yleensä tiedettävä käytettävän anturin datalehdessä ilmoitetut arvot (lämpötilakerroin). Jos käytetään tuntematonta anturia (mikä usein saattaa olla mahdollista, esimerkiksi purettuna jostain laitteesta), niin mittauksia suorittamalla saadaan kyseiselle yksilölle lämpötilakerroin määritettyä. NTC/PTC vastukset eivät useinkaan ole kovin lineaarisia niiden käyttölämpötila-alueella, mutta rajoittamalla käytetyn vastuksen mitta-aluetta voidaan lineaariselle alueelle päästä yksinkertaisesti.

Alla olevassa graafissa esimerkiksi nähdään tyypillisen 10k NTC-vastuksen resistanssi-arvo lämpötilan funktiona. Kuten käyrästä voidaan huomata, yksinkertaisella kulmakertoimen laskemisella ei voida anturista saatavaa resistanssia muuttaa lämpötilaksi. Resistanssiarvon lämpötilaksi muuttaminen vaatii siten joko laskutoimenpiteitä Arduinolta, tai sitten valmiiksi etukäteen laskettua resistanssi vs. lämpötilataulukkoa, mistä ohjelmoidut arvot Arduinolla haetaan ja näytetään lämpötilana. Tämä taulukkometodi on nimeltään "look-up-table" ja on yleisesti käytössä ohjelmoinnissa etenkin vähävirtaisissa ja laskentateholtaan rajoitetuissa prosessoreissa.

Katsotaan vielä tarkemmin tehtyä NTC termistorin kytkentää, jotta ymmärretään mitä elektronisesti tapahtuu. Alla olevassa kuvassa on tehty jännitejakokytkentä. Kytkennässä Vout määräytyy kaavan: Vout = V1 * (Rt / Rt + R1) mukaan. Koska termistorin Rt resistanssi laskee kun lämpötila nousee, laskee myös jännite Vout pisteessä.

Jos taas kytkemme termistorin toisinpäin, niin saadaankin nouseva käyrä jännitteelle, kun lämpötila nousee.

6.2 NTC-vastuksen lämpötilan lukeminen Arduinolla

Kytketään nyt Arduinolle NTC-vastus jännitejakokytkennän avulla, jolloin resistanssin muuttuminen saadaan muutettua jännitteen muutokseksi, jota Arduinon AD-muunnin voi lukea. Koska olemme kytkeneet aiemmin DA-muuntimen lähdön A0 summerille, emme voi käyttää tätä vaan otamme seuraavan vapaana olevan A1-pinnin käyttöön.

Kytkentäkaaviona tähän astiset kytkennät näyttävät nyt tältä:

Ja koekytkentäalustalla alla olevan kuvan mukaisena:

Käytetty lämpötila-anturin tyyppi on tässä tapauksessa Epcos B57620C5102K062, mutta käytännössä mikä vain 10 kilo-ohmin NTC kelpaa tähän esimerkkiin.

Koodin toiminta:

Lisätään aiemmin tehtyyn koodiin rivit, joissa kerrotaan mikro-ohjaimelle analogia-pinnin sijainti ja vakioita, joita tarvitaan lämpötilan laskemiseksi.

Koodia tutkittaessa ylhäältä alaspäin, huomataan että #define:llä on tuotu uusia vakioita koodiin. Näistä selkein on varmastikin TEMP_SENSOR, joka määrittää että A1 pinnissä on nyt kytkentä tehtynä. Seuraavat neljä #define -määritystä ovat lämpötila-anturin resistanssin lämpötilaksi muuttamiseen tarvittavia arvoja, joita tarvitaan koodissa myöhemmin kun laskentaa suoritetaan.

Sarjaportti alustetaan käyttöön rivillä Serial.begin(9600) ja sarjaportin käytöstä voi lukea lisää aiemmasta oppaasta osoitteessa: https://www.hutasu.net/mikrokontrollerit/arduino/2-digitaalilahdot/ . Lyhyesti sanottuna kuitenkin, Arduino-levy lähettää sarjaporttidataa tietokoneelle 9600 baudin nopeudella ja sen avulla voidaan kätevästi siirtää tietoa Arduinosta tietokoneelle ja toisinkin päin.

Arduino Uno R4 Minimassa on sisäisesti 14-bittinen AD-muunnin käytössä. Arduino-kielessä kuitenkin oletuksena on käytössä 10-bittiset arvot (koska Arduino Uno R3:lla on vain 10-bittinen AD-muunnin) ja kun halutaan tarkempia AD-muuntimen lukemia käyttää, täytyy koodiin alustaa muunnin toimimaan suuremmalla resoluutiolla analogReadResolution() -funktion avulla. Tässä tapauksessa käytämme 12-bitin AD-muunninta joten parametrina on luku 12. Resoluutiota voi pienentää tai suurentaa aina 1 ja 14 bitin välillä haluamakseen, mutta ota huomioon että tässä koodissa esitetty lämpötilan muunnos toimii oikein vain  12-bitin luvuille.

Seuraavaksi heti ohjelman pääsilmukan (loop) alussa, alustetaan float-tyyppinen liukulukumuuttuja "t", mihin luetaan lämpötilatieto readTemperature()-funktion palautusarvolla ja sen jälkeen se tulostetaan sarjaporttiin. Lukufunktion toiminta on kirjoitettu pääsilmukan alle.

Lämpötilan lukufunktiossa readTemperature() alustetaan float-tyyppisiä muuttujia ja luetaan analogiatulo A1, joka on vakioitu termillä TEMPSENSOR. Sen jälkeen AD-muuntimen arvo muutetaan jännitteeksi ja sen jälkeen normaalisti ohmin lain avulla muutetaan saatu jännitearvo resistanssiksi, kun tiedetään toinen tunnettu vastus. Value-muuttujassa on nyt vastusarvo ohmeina ja seuraavaksi suoritetaan Steinhart-Hart -kaavan mukainen muunnos NTC-vastuksen resistanssin lämpötilaksi muuttamiseksi.

Lisää käytetystä kaavasta voit lukea alla olevista linkeistä:
https://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation
https://learn.adafruit.com/thermistor/using-a-thermistor
https://arduinodiy.wordpress.com/2015/11/10/measuring-temperature-with-ntc-the-steinhart-hart-formula/

Kun muunnos on tehty, voidaan tulos palauttaa pääohjelmaan ja näyttää se sarjaportin avulla Arduino IDE:ssä:

6.3 Digitaalisen lämpötila-anturin lukeminen Arduinolla

--- TULOSSA ---