KURZ: Teplotní senzor - Možnosti praktického využití
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 01.04.2014
- Zobrazení: 6313
KAPITOLY
MOŽNOSTI PRAKTICKÉHO VYUŽITÍ
Funkcí teplotního senzoru je vracet uživateli informaci o zjištěné teplotě okolního prostředí. Jeho využití pro konstrukci pojízdného robota nepřipadá příliš v úvahu. Využití najde hlavně v případě, že budeme chtít reagovat na náhlé teplotní změny v okolí. V závislosti na teplotě by poté následovala určitá reakce robota. Široké uplatnění by našel také při provádění laboratorních pokusů a měření. Pomocí senzoru by byla snímána teplota kapaliny nebo jiných vzorků a průměrný přírůstek či úbytek vypisován na diplej nebo zaznamenáván do grafu pomocí funkce Data Logging.
Využití teplotního senzor
Použití teplotního senzoru v programování si ukážeme na jednoduchém příkladu. Senzor bude připojen ke vstupnímu portu řídící jednotky a k jednomu z výstupních portů bude připojen servomotor, který bude pohánět model ventilátoru. Otáčky ventilátoru se budou dynamicky měnit na základně naměřené teploty. Dokud bude teplota nižší než 20°C, ventilár nebude spuštěný. Od 20°C začne se stoupající teplotou zrychlovat, až dosáhne při 30°C maximálního výkonu 100%. Jakmile začne teplota klesat, motor bude opět postupně zpomalovat, až se při 20°C zastaví úplně.
NXT-G
ŘÍZENÍ VENTILÁTORU POMOCÍ TEPLOTNÍHO SENZORU
Realizace programu v programovacím prostředí NXT-G není příliš složitá. Důležité je si správně uvědomit, jaké kroky musíme realizovat. Zjištěné hodnoty z teplotního senzoru musíme ukládat do proměnné, abychom je následně mohli využívat při výpočtu intenzity otáček motoru. U výpočtu je důležité správně pracovat s matematickými bloky.
Krok 1 - Deklarace proměnných
Abychom mohli hodnotu zjištěnou teplotním senzorem využívat nejenom pro rozhodnutí, zda se má ventilátor roztočit nebo zůstat v nečinnosti, ale také při výpočtu intenzity otáčení motoru, musíme si pro její ukládání nadeklarovat proměnnou. Deklaraci provedeme v horní části menu Edit -> Define Variables (podrobný popis naleznete ZDE). Pro ukládání hodnoty jsme si nadeklarovali proměnnou teplota, která je datového typu Number.
Krok 2 - Snímání hodnot senzorem
V dalším kroku musíme hodnotu naměřenou teplotním senzorem uložit do proměnné. První blok, který v programu použijeme, bude Temperature Sensor. Dále si do programu vložíme také blok Variable, který reprezentuje proměnnou. U proměnné nastavíme, že se jedná o proměnnou teplota a nastavíme blok pro zápis. U teplotního senzoru zvolíme měření ve stupních Celsia. Uložení hodnoty do proměnné provedeme propojením konektoru Temperature teplotního senzoru se vstupním portem bloku proměnné.
Krok 3 - Zapnutí ventilátoru
Zapnutí ventilátoru je prováděno až v okamžiku, že teplota překročí 20°C. Musíme tak v programu tuto situaci rozlišit. Použijeme proto blok podmíněného vykonání Switch, který nám umožní rozlišit dvě nastalé situace. Podmínka bude řízena hodnotou (Value) logického datového typu (Logic). To, jaká část (True nebo False) podmínky bude vykonávána, bude ovlivněno hodnotou uloženou v proměnné teplota. Použijeme blok Compare, který vložíme mezi blok proměnné a podmínku Switch. Pomocí bloku Compare budeme zjišťovat, zda je úroveň teploty větší než 20°C. Hodnotu z proměnné přivedeme na vstup bloku k porovnání a jeho výstup přivedeme na vstup bloku Switch.
Krok 3 - Řízení otáček na základě teploty
V případě, že teplota překročí 20°C, motor se spustí a jeho intenzita otáčení bude řízena na základě naměřené teploty. Bude tedy vykonávána část True bloku Switch. Opět musíme využít hodnotu uloženou v proměnné teplota. Použijeme proto znovu blok Variable. Při výpočtu intenzity otáčení motoru musíme vzít hodnotu v proměnné, odečíst od ní hodnotu spuštění (20°C) a výsledek vynásobit 10. Do programu vložíme dva bloky pro matematické operace Math. Hodnotu z proměnné přivedeme na vstup prvního z nich, kde se bude od hodnoty odečítat 20. Výsledek přivedeme na vstup druhého bloku Math, kde se bude násobit 10. Výslednou hodnotu nakonec přivedeme na vstup konektoru Power programového bloku Motor, díky čemu nastavíme intenzitu otáčení na právě vypočítanou hodnotu. Celý programový konstrukt můžete vidět na obrázku.
Pro úplné ošetření programu ještě vložíme do sekce False blok Motor, jemuž nastavíme nečinnost. Aby byl program prováděn neustále a nebyl uskutečněn pouze jeden průchod, musíme ještě celou programovou konstrukci umístit do cyklu Loop, u nějž nastavíme nekonečné provádění (Forever). Díky tomu bude program prováděn stále dokola.
Výsledný program
Program ke stažení
RobotC
Řízení ventilátoru pomocí teplotního senzoru
Při vytváření programu si musíme rozmyslet, jaké náležitosti musíme provést, než začneme používat rozšiřující senzor. Jedná se o jeho deklaraci a zavolání patřičné vývojové knihovny. Pro úspěšné zvládnutí konstruktu, který provádí dynamický výpočet rychlosti otáček motoru si musíme rozmyslet, jaká bude správná podoba zápisu výpočtu.
Krok 1 - Deklarace senzoru a volání vývojové knihovny
Prvním krokem pro úspěšné zvládnutí programu je deklarace senzoru. Jak jsme si již popsali v teoretické části, deklarace se skládá z klíčového slova #pragma a příkazu config(). Do jeho parametrů následně uvedeme, že se jedná o senzor (Sensor), port řídící jednotky, ke kterému je připojen (S1-S4), následně volitelný název senzoru (v našem případě LEGOTMP) a poté skupinu definující rozšiřující senzory sensorI2CCustom.
#pragma config(Sensor, S1, LEGOTMP, sensorI2CCustom)
Následně musíme zavolat vývojovou knihovnu, která obsahuje ovladače teplotního senzoru a funkce, které v programu dále využijeme. Ve stejné složce, kde je umístěna knihovna teplotního senzoru musí být umístěna také vývojová knihovna common.h. Zavolání provedeme následovně:
#include "lego-temp.h"
Poznámka: Umístění vývojové knihovny odkazuje do kořenového adresáře, ve kterém je umístěn i vytvářený program. Pokud je váš program v počítači uložen na jiném místě než knihovna, musíte při zavolání zadat přesnou adresu umístění vývojové knihovny.
Krok 2 - Nastavení režimu snímání
Teplotní senzor dokáže pracovat ve dvou režimech. Je dobré proto na úvod programu udat, v jakém režimu bude senzor snímat. V našem programu použijeme snímání v režimu Continuous. Pro jeho aktivování použijeme příkaz LEGOTMPsetContinuous(), jehož parametrem v závorce bude volitelný název senzoru.
LEGOTMPsetContinuous(LEGOTMP);
Krok 3 - Řízení otáček na základě teploty
Hlavní částí programu je řízení otáček motoru pomocí snímané teploty okolního vzduchu. Nejprve potřebujeme, aby nám senzor vracel zjištěnou hodnotu teploty. Nadefinujeme si proto proměnnou teplota, která bude datového typu float, do níž se bude hodnota ukládat. Následně použijeme příkaz LEGOTMPreadTemp(), který vrací hodnotu zjištěnou senzorem. V závorce jsou uvedeny dva parametry. První je volitelný název senzoru a druhý název proměnné, do které se zjištěná hodnota uloží.
Nyní musíme zapsat výpočet, který zajistí dynamické otáčení motoru. Ventilátor se začne otáčet až v případě, že teplota stoupne nad 20°C. Použijeme podmínku if(), jejíž parametrem bude teplota > 20. Intenzita otáčení motoru se v rozmezí 20 - 30 °C bude měnit od 0 do 100%. Musíme tedy vzít hodnotu uloženou v proměnné teplota a odečíst od ní teplotu, při které má motor být v nečinnosti (20°C). Výslednou hodnotu poté vynásobíme 10 a tento výsledek následně přiřadíme motoru jako hodnotu otáček. Celý zápis příkazu můžete vidět níže.
Abychom ošetřili všechny nastalé možnosti programu, musíme ještě zapsat, co se stane, pokud teplota bude niší než 20°C. Za podmínku tedy přidáme else a příkaz motor[], jemuž přiřadíme nulovou hodnotu otáčení.
float teplota; while(true) { LEGOTMPreadTemp(LEGOTMP, teplota); if (teplota > 20) { motor[motorA] = (teplota - 20) * 10; } else { motor[motorA] = 0; } }
Výsledný program
Po úspěšném zvládnutí všech dílčích kroků bychom měli dospět ke zdárnému zápis programu, který můžete vidět zde:
#pragma config(Sensor, S1, LEGOTMP, sensorI2CCustom) #include "lego-temp.h" task main() { LEGOTMPsetContinuous(LEGOTMP); float teplota; while(true) { LEGOTMPreadTemp(LEGOTMP, teplota); if (teplota > 20) { motor[motorA] = (teplota - 20) * 10; } else { motor[motorA] = 0; } } }