V posledním dílu seriálu o desce TinyLab jsme si představili, jak se dá používat fotorezistor. Dnes se podíváme, jak číst teplotu z dostupného teploměru.
Měření teploty
K elektronickému měření teploty můžeme použít různé typy součástek. Tou asi nejjednodušší je termistor. Termistor je součástka, která se změnou teploty mění svůj vnitřní odpor (podobně jako fotorezistor mění vnitřní odpor při změně intenzity osvětlení). Nevýhodou termistorů je jejich nelinearita. Vysvětleme si ji na příkladu:
Když při
- 0°C naměříme odpor 1000Ω
- při 1°C naměříme 2000Ω,
jaký odpor byste čekali při 2°C? 3000Ω? Právě že ne! Termistory mají nelineární průběh, což znesnadňuje přepočet jejich odporu na teplotu.
Z tohoto důvodu vznikly teploměry s lineárním průběhem, u nichž je přepočet na teplotu daleko jednodušší (vystačíme si s operacemi plus, mínus, krát a děleno).
Elektronické teploměry můžeme dále dělit na analogové a digitální. Z analogových teploměrů získáváme analogovou hodnotu, kterou jednoduše přepočteme na stupně. Digitální teploměry nám často posílají už hodnotu vyjádřenou ve stupních. Na desce TinyLab nalezneme analogový teploměr LM35.
Teploměr LM35
LM35 je na TinyLabu připojený na pin A3 Arduina. Fyzicky teploměr nalezneme v levém dolním rohu.
Jelikož je jeho výstupem analogová hodnota, musíme ji měřit pomocí funkce analogRead, podobně, jako jsme to dělali ve článku o potenciometru. V dokumentaci k teploměru uvidíme následující:
Znamená to tedy, že teploměr musíme napájet napětím mezi 4 a 20V (což Arduino s 5V splňuje). Dále také vyčteme, že na výstupu měříme napětí, které se se změnou teploty o jeden stupeň Celsia změní o deset milivoltů (1V = 1000mV). Pro 0°C naměříme 0V, 1°C 10mV, atd.
Arduino a LM35
Jak měřit napětí v Arduinu? Pomocí funkce analogRead!
Funkce analogRead nám vrací hodnoty mezi 0 a 1023. Tato hodnota je přímo úměrná napětí, které na měřený pin přivedeme. Toto napětí se může pohybovat v rozsahu od 0V do napájecího napětí – v našem případě 5V. Když si spojíme tyto dvě informace (rozsah 0-1023, napětí 0-5V), můžeme vyvodit následujícími kroky vzorec pro výpočet teploty ve °C.
Začneme tím, že si rozsah 0-1024 převedeme na rozsah 0 až 1. (Zápis 1024.0 je použit proto, aby nedošlo k zaokrouhlení výsledku na celá čísla – zde potřebujeme desetinná)
analogRead(pin) / 1024.0
Dále tento výsledek přepočteme na milivolty v rozsahu 0-5000mV (5V = 5000mV).
analogRead(pin) / 1024.0 * 5000
Z dokumentace LM35 víme, že 10mV odpovídá 1°C, tedy výslednou teplotu ve stupních celsia získáme následovně:
analogRead(pin) / 1024.0 * 5000 / 10
Výsledný vzoreček může po zkrácení vypadat například takto:
int celsius = analogRead(A3)/ 1024.0 * 500;
Měříme teplotu
S těmito vědomostmi už se můžeme pustit do programování. Začneme tím, že si vypíšeme změřenou teplotu po sériové lince. Nezapomeňte si zapnout přepínač u analogového pinu A3.
void setup() { Serial.begin(9600); } void loop() { int celsius = analogRead(A3) / 1024.0 * 500; Serial.println(celsius); delay(1000); }
Hlídač teploty
V druhém příkladu si ukážeme, jak hlídat teplotu a v případě jejího překročení spustit bzučák.
int hranice = 26; void setup() { Serial.begin(9600); } void loop() { int celsius = analogRead(A3) / 1024.0 * 500; Serial.println(celsius); if(celsius >= hranice){ tone(A1, 440, 500); delay(500); tone(A1, 600, 500); delay(500); } }
Napadá vás nějaké další zajímavé použití teploměru? Třeba pro jednoduchou meteostanici? Nebo pro spouštění větráku při překročení určité teploty? Podělte se s námi v komentářích.