6. Lämpötila-anturin lukeminen

Alunperin julkaistu: 24.5.2024

Viimeksi muokattu: tiistai 13.8.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

Digitaalinen lämpötila-anturi on Arduinolla useimmin helpompikäyttöinen, kuin analoginen anturi. Digitaalisessa anturissa kaikki muunnokset analogiajännitteestä mikrokontrollerin ymmärrettävään bittimuotoon on jo tehty, joten käyttäjälle jää useimmiten tarpeelliseksi vain alustaa (jos sitäkään) anturi ja lukea lämpötilatieto asteina.

Tässä kappaleessa kokeillaan digitaalista lämpötila-anturia. Analog Devicesin DS18B20 on digitaalinen lämpötila-anturi, jota on saatavilla monessa eri paketissa niin vesitiiviinä kuin paljaanakin anturina. Kuvassa alla nähdään vesitiivis versio käytetystä anturista, joka muutoin on kolmijalkainen, transistorin näköinen luttiainen.

1-wire anturi DS18B20

1-Wire-väylä lyhyesti

1-Wire väylän on kehittänyt Dallas Semiconductor -yhtiö (sittemmin Maxim ja nykyisin Analog Devices). 1-Wire on tiedonsiirtoprotokolla ja väylästandardi, joka mahdollistaa datan siirron yksinkertaisesti yhden datalinjan ja maa-yhteyden avulla. Tässä muutamia keskeisiä kohtia 1-Wire väylän käytöstä eri sovellutuksissa:

  1. Yksinkertainen johdotus: 1-Wire-väylä tarvitsee yksinkertaisimmillaan vain kaksi johtoa: yhden datan siirtoa varten ja toisen maayhteydeksi. Tämä tekee sen käytöstä erittäin yksinkertaista ja edullista.
  2. Matala tiedonsiirtonopeus: Väylä on suunniteltu matalan tiedonsiirtonopeuden sovelluksiin, ja se toimii yleensä nopeuksilla, jotka ovat tyypillisesti alle 16.3 kbps (kilobittiä sekunnissa).
  3. Laitteiden tunnistus: Jokaisella 1-Wire-laitteella on uniikki 64-bittinen sarjanumero, mikä mahdollistaa useiden laitteiden käytön samalla väylällä. Tämä sarjanumero koostuu laitetyypin koodista, yksilöllisestä numerosta ja tarkistussummasta.
  4. Virtalähde: Joissakin sovelluksissa 1-Wire-laitteet voivat saada virtansa suoraan datalinjasta (parasiittinen-virtakäyttö), jolloin erillistä virtajohtoa ei tarvita.
  5. Sovellukset: 1-Wire-tekniikkaa käytetään laajalti muun muassa antureissa (esim. lämpötila-anturit, kuten DS18B20), muisteissa, turvalaitteissa ja laitetunnisteissa.
  6. Yhteensopivuus: 1-Wire-väylää voidaan käyttää yhdessä mikro-ohjaimien ja tietokoneiden kanssa, ja sen käyttöön on saatavilla monia ohjelmisto- ja laitteistotukia.

1-Wire-väylän yksinkertaisuus, edullisuus ja luotettavuus tekevät siitä suositun valinnan moniin eri sulautettuihin järjestelmiin ja teollisiin sovelluksiin.

Voit lukea lisää 1-wire väylästä tarkemmin aiemmin täällä julkaistulta sivulta: 1-wire väylä.

1-Wire väylään kytkeminen

1-Wire väylässä on vain yksi väylää ohjaava laite, jota kutsutaan masteriksi/isännäksi (mikrokontrolleri tai PC tai jokin muu laite) ja loput kytkettävät laitteet ovat antureita tai muita toimilaitteita ja näitä kutsutaan slave/orja-nimityksellä. Master-slave välisestä toiminnasta on kirjoitettu vähän tuonnempana lisää. Itse väylälinjassa on yleensä vain kolme johtoa: maa, käyttöjännite ja data, mutta joskus näkee laitteita kytkettävän myös kahdella johtimella. Alla olevassa kuvassa on kytketty DS18B20 lämpötila-anturi ns. normaalisti kolmella johtimella ja vastaava kytkentä Arduino Minimaan.

Ennen 1-Wire anturin käyttöä, tarvitaan kuitenkin asentaa anturin lukemiseen tehdyt lukukirjastot. Avaa Arduino IDE:stä Library Manager ja kirjoita hakukenttään onewire ja  asenna OneWire -kirjasto.

Tämän jälkeen kirjoita hakukenttään DallasTemperature ja asenna tämäkin kirjasto.

-- JUTUN TEKO KESKEN ---