Termistorový teploměr s Arduinem
Úkol: Sestavte digitální termistorový teploměr na základě Arduino.
Pomůcky: Arduino UNO, nepájivé pole, rezistor 10 kΩ, fotorezistor 10 kΩ, termistor NTC 10 kΩ, spojovací vodiče, USB kabel pro spojení s počítačem
Teoretický úvod: Dříve než se pustíme do měření teploty pomocí termistoru, pojďme se podívat, jakým způsobem pracovat s Arduinem. Co to vlastně je?
Arduino je otevřená elektronická platforma, kterou si můžete takřka libovolně programovat a sestavit z ní mnoho elektronických obvodů. Jde o jednoduchou elektronickou desku (hardware) a vývojové prostředí (Arduino IDE), ve kterém píšete svůj software.
Podobných platforem existuje v současnosti již velké množství, komunita kolem Arduina je však dostatečně velká a dá se tu nalézt množství inspiračních projektů a případné pomoci.
Pojďme stručně popsat desku Arduina: obsahuje procesor, několik analogových vstupů, několik digitálních pinů, které můžeme použít jako vstupy či výstupy. Neobejdeme se bez napěťových výstupů, USB propojení s počítačem, přes které Arduino také napájíme, nebo konektoru pro samostatné napájení či resetovacího tlačítka.
Detekce osvětlení
Sestavme náš první projekt, na kterém si ukážeme, jak Arduino funguje. Podívejme se, co Arduinem naměříme na fotorezistoru zapojeném sériově s rezistorem o stejné nominální hodnotě (např. 10 kΩ). Zapojte obvod podle následujícího schématu 9.73a.
Detekce osvětlení
Do počítače nahrajte tento arduinovský program:
void
setup(void) {
// otevření sériového portu pro zobrazení měřené hodnoty
Serial.begin(9600);
}
// opakovací smyčka programu
void
loop(void) {
float mereni;
float napeti; // definice měřené veličiny
mereni = analogRead(A0); // odečet měřené veličiny
napeti = mereni*3.3/1023; // výpočet měřeného napětí
// zobrazení měřené veličiny
Serial.print("Načtená hodnota je: ");
Serial.println(mereni);
// zobrazení měřeného napětí
Serial.print("Odpovídající hodnota napětí je: ");
Serial.println(napeti);
// zpomalení měřeného cyklu o 1000 ms
delay(1000);
}
Jak to funguje?
Na analogový vstup Arduina A0 přivedeme napětí na fotorezistoru, které je následně převedeno na digitální hodnotu mezi 0 a 1023, která tomuto napětí odpovídá. V našem zapojení přivádíme na oba sériově zapojené prvky napětí o velikosti 3,3 V (jedno z výstupních napětí Arduina). Tomuto napětí odpovídá hodnota 1023 zobrazená v sériovém monitoru, jestliže vstup A0 připojíme na jeden konec zapojení. Jestliže vstup A0 připojíme na druhý konec sériového zapojení, monitor ukáže hodnotu 0. Napětí o velikosti 3,3 V je tedy „rozloženo“ na 1024 digitalizovaných hodnot. Každému číslu v této sérii tedy odpovídá změna napětí o velikosti 0,032 V. A toto napětí může nést informaci o další veličině, kterou chceme změřit, například osvětlení (pomocí fotorezistoru) nebo teplotě (s termistorem).
Při změně osvětlení zapojeného fotorezistoru se bude zobrazovaná hodnota měnit v rozmezí 0 až 1023, ale spíše trochu méně. Dosáhnout extrémních hodnot je poměrně složité.
Jaké jsou hodnoty napětí na fotorezistoru? Ty si musíme vypočítat podle zákona o dělení napětí na dvou sériově zapojených součástkách:
\[ U_\mathrm{fotorezistor} = \frac{\mathrm{vstup}(A_0)}{1023}\cdot3{,}3\ \mathrm{V} \]Vyzkoušejte.
Měření teploty
V praxi se teplota měří pomocí tzv. termistorů. Jsou to součástky, které v závislosti na teplotě mění svůj odpor. Rozlišujeme dva druhy termistorů – PTC a NTC. U prvního z nich se odpor zvyšuje s rostoucí teplotou, u druhého naopak snižuje. A právě ten použijeme v našem experimentu. Termistory jsou charakterizovány svým odporem při 25 °C. Použitý termistor má nominální odpor \(R_{25}=10\ \mathrm{k\Omega}\).
Závislost odporu na teplotě sice není lineární (přímková), ale můžeme ji poměrně jednoduše popsat pomocí funkce
\[ \frac{1}{T} = \frac{1}{T_0} + \frac{1}{B}\ln\left(\frac{R}{R_0}\right) \]V tomto vztahu \(T_0\) značí nominální teplotu v kelvinech, \(R_0\) nominální odpor v ohmech. \(R\) je pak naměřená hodnota odporu termistoru při teplotě \(T\) v kelvinech. Koeficient \(B\) je tzv. beta faktor a nalezneme ho v technickém listu použitého termistoru.
Principem zapojení je dělič napětí, kde máme v sérii termistor a referenční rezistor. Na vnější svorky přivedeme z Arduina napětí 3,3 V, na analogovém vstupu A0 snímáme napětí na termistoru.
Měření teploty
V programu Arduino IDE napíšeme tento program:
int termPin = 0; // určení vstupního analogového pinu
int termNom = 10000; // nominální hodnota odporu termistoru
int refTep = 25; // referenční hodnota teploty (25 °C)
int beta = 3977; // beta faktor charakterizující termistor
int rezistor = 10000; // nominální hodnota odporu rezistoru
void
setup(void) {
Serial.begin(9600);
analogReference(EXTERNAL);
}
void
loop(void) {
// přečteme analogovou hodnotu na termistoru
float odecet;
odecet = analogRead(termPin);
// vypočteme hodnotu odporu termistoru
float odpor;
odpor = 1023 / odecet - 1;
odpor = rezistor / odpor;
// výpočet teploty v dle převodního vztahu z odporu termistoru
float teplota;
teplota = odpor/termNom;
teplota = log(teplota);
teplota = teplota / beta;
teplota = teplota + 1.0/(refTep + 273.15);
teplota = 1.0/teplota;
teplota = teplota - 273.15;
// zobrazíme teplotu na monitoru
Serial.print("Teplota je: ");
Serial.print(teplota);
Serial.println(" °C");
Serial.println();
delay(1000);
}
Jak to funguje?
Tento program zjistí napětí na termistoru, převede je na odpovídající elektrický odpor a podle daného vztahu vypočítá teplotu v kelvinech, kterou následně převede na stupně Celsia. Hodnotu teploty si necháme zobrazit na monitoru počítače. Teplotu měříme v cyklu trvajícím 1 s.
Otázky:
- Jaký první experiment s vaším novým teploměrem provedete?
- Proč jsme zvolili interval měření celou 1 s a ne třeba 10 ms?
- Můžeme pro měření použít odpor o nominální hodnotě například 2 kΩ? Jak bude měření ovlivněno?
Inspirační zdroje: