Wróć do informacji o e-podręczniku Udostępnij materiał Wydrukuj

Czujnik temperatury

Do budowy termometru użyjemy czujnika TMP36, który nadaje się do pomiaru temperatur w zakresie od –40 do +150°C. Sam czujnik ma postać ściętego z jednej strony cylindra z trzema wyprowadzeniami; jest to obudowa typu THT TO92.

RypMZ2brXODs9
Czujnik temperatury TMP36
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Podstawowe dane techniczne:

  • napięcie zasilania: od 2,7 V do 5,5 V

  • zakres pomiarowy: od -40°C do +120°C

  • dokładność pomiaru: ±2°C

Opiszmy wyprowadzenia czujnika. Gdy patrzymy na jego płaską stronę, a nóżki są skierowane do dołu (tak jak na zdjęciu wyżej), pierwsze wyprowadzenie od lewej strony jest plusem zasilania. Napięcie zasilające nie może być wyższe niż 5,5 V – zaznaczyliśmy to od razu podając dane techniczne czujnika.

Jeżeli podłączymy element TMP36 bezpośrednio do 9‑woltowej baterii, to czujnik z pewnością zostanie uszkodzony. Podłączenie za pośrednictwem płytki Arduino jest z kolei całkowicie bezpieczne, ponieważ jej napięcie robocze (5 V) mieści się w przedziale akceptowanym przez czujnik.

Drugie wyprowadzenie to wyjście analogowe, z którego odczytujemy napięcie, przeliczane następnie na temperaturę. Wreszcie trzecie wyprowadzenie to minus zasilania, który należy połączyć z masą.

Budowa układu

Elementy potrzebne do wykonania zadania:

  • płytka Arduino Uno

  • płytka stykowa

  • kabel USB typu A‑B

  • czujnik TMP36

  • przewody i zworki połączeniowe

Elementy podłączamy według przedstawionego niżej schematu.

R1QFqqFv5xPHA
Schemat podłączenia czujnika TMP36 do Arduino

Realizacja projektu

Wyginamy wyprowadzenia czujnika TMP36 tak, abyśmy mogli je wetknąć w trzy otwory na płytce stykowej. Wpinamy czujnik pionowo – poszczególne wyprowadzenia powinny znajdować się w tej samej kolumnie, lecz w różnych wierszach.

RkvNNLfMqaH9L
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Podłączamy zasilanie czujnika do szyny dodatniej. Jeden styk powinien znaleźć się obok wyprowadzenia czujnika (ważne, aby był to ten sam wiersz, po tej samej stronie płytki stykowej); drugi natomiast można umieścić w dowolnym miejscu szyny zasilającej. Łączymy masę czujnika z masą płytki stykowej.

RZ1lGz8ivPDO9
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Środkowe wyprowadzenie (wyjście) podłączamy do złącza analogowego (pinu) A0.

R3ALssCTwHJPI
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Podłączamy zasilanie i przewód masy.

R1QvNPR9lgy6P
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Układ jest dość prosty. Aby jednak działał, należy uzupełnić go o odpowiedni program. Uruchamiamy aplikację Arduino IDE. Wydajemy polecenie Plik | Nowy. Zapisujemy od razu szkic pod nazwą termometr.

Definiujemy stałą odpowiadającą pinowi, do którego podłączono czujnik (A0), a w ciele funkcji setup() wskazujemy port szeregowy (Serial) łączący płytkę Arduino z komputerem oraz ustalamy szybkość transmisji.

const int sensor = A0;

void setup() {
	Serial.begin(9600);
}

W ciele funkcji loop() umieszczamy kolejną funkcję, pozwalającą na odczytanie napięcia z czujnika. Jest ono proporcjonalne do temperatury otoczenia. Temperaturze 0°C odpowiada napięcie 500 mV. Dzięki takiemu ustaleniu punktu zerowego można zmierzyć także temperatury ujemne. Zmiana temperatury na wyższą o 1°C oznacza zwiększenie napięcia wyjściowego czujnika o 10 mV; zmniejszenie temperatury o tę samą wartość skutkuje zmniejszeniem napięcia o 10 mV.

Ponieważ temperatura się zmienia, wartość reprezentująca ją w szkicu Arduino powinna być przechowywana w postaci zmiennej. Należy rozumieć to następująco: odczytaną z czujnika temperatury wartość napięcia trzeba zapisać jako zmienną odczyt:

void loop() {
	int odczyt = analogRead(sensor);  
}

Wartość zwróconą przez funkcję analogRead() należy przekształcić na rzeczywiste napięcie, które uzyskujemy z czujnika. Obliczamy ją ze wzoru: (odczytana wartość ⋅ 5 V). Wartość 5 V wynika z napięcia dostarczanego z płytki Arduino.

Uzyskany wynik dzielimy przez 1024. Dlaczego dokonujemy dzielenia i dlaczego akurat przez 1024? Otóż wynika to z rozdzielczości, z jaką odczytywany jest sygnał napięciowy z wejść analogowych płytki Arduino: może on osiągnąć jeden z 1024 poziomów (ponumerowanych od 0 do 1023). Wspominaliśmy o tym w poprzedniej lekcji, poświęconej systemowi automatycznego sterowania natężeniem oświetlenia.

Definiujemy kolejną zmienną; tym razem jednak zastosujemy typ floatzmienna typu floatfloat. Ma ona nazwę napiecie.

Ważne!

Należy pamiętać, aby w nazwach zmiennych nie stosować polskich znaków. Korzystając z typu danych float nie wolno również zapominać, że wszystkie liczby zapisujemy wraz z częścią ułamkową (ze znakiem kropki i liczbą po kropce). Robimy tak nawet wtedy, gdy chodzi o zapisanie liczby całkowitej (liczbę 5 należy zapisać jako 5.0).

float napiecie = odczyt * 5.0;
napiecie = napiecie / 1024.0;

Przekształcamy wartość napięcia na temperaturę w skali Celsjusza. Skorzystamy ze wzoru: ((obliczone napięcie [V] – 0.5 V)  ⋅ 100), gdzie 0.5 V (czyli 500 mV) oznacza wartość początkową, odpowiadającą temperaturze 0°C.

float tempC = (napiecie - 0.5) * 100;

Po dokonaniu obliczeń musimy określić sposób prezentacji wyników na ekranie.

Serial.print(tempC);

Następnie wysyłamy szkic do płytki i w prawym górnym rogu okna programu Arduino IDE klikamy przycisk monitora portu szeregowegomonitor portu szeregowegomonitora portu szeregowego. Otrzymujemy następujący ciąg liczb:

RKHQIinDXCka8

Wyniki pomiaru temperatury wprawdzie się pojawiły, lecz są odświeżane tak szybko, że nie da się ich odczytać. Poza tym nie wiadomo, gdzie kończy się jedna liczba, a gdzie zaczyna następna.

Zmodyfikujmy zatem szkic, nakazując wyświetlanie każdej liczby w nowej linii. Użyjemy również funkcji delay(), dzięki której pokazywana wartość pozostanie na ekranie przez określony czas; dopiero później pojawi się następna liczba. Ponownie przesyłamy szkic do płytki i wywołujemy Monitor portu szeregowego.

Serial.println();
delay(1000);
R1QtWfHHCgRlW

Aby termometr wyglądał bardziej profesjonalnie, uzupełnimy szkic o dodatkowe elementy. Przed liczbą oznaczającą temperaturę będzie się pojawiał tekst „Temperatura:”, a za wyświetloną wartością liczbową dodamy frazę „stopni C”. Skorzystamy z tej samej funkcji, której użyliśmy do wyświetlania temperatury, jednak tekst, który w niej umieścimy, powinien zostać ujęty w cudzysłów.

Raz jeszcze przesyłamy szkic do płytki i wywołujemy monitor portu szeregowego. Następnie chwytamy w dwa palce czujnik, żeby odrobinę go podgrzać; zmiana temperatury powinna nastąpić błyskawicznie, a wyniki zobaczymy na ekranie.

Serial.print("Temperatura: ");
Serial.print(tempC);
Serial.print(" stopni C");
RzThDV2pVyioa

Cały kod programu wygląda następująco:

const int sensor = A0;
void setup() {
	Serial.begin(9600);
}

void loop() {
	int odczyt = analogRead(sensor);  
	float napiecie = odczyt * 5.0;
	napiecie = napiecie / 1024.0;
	float tempC = (napiecie - 0.5) * 100;
    
	Serial.print("Temperatura: ");
	Serial.print(tempC);
	Serial.print(" stopni C");
	Serial.println();
	delay(1000);
}

Słownik

monitor portu szeregowego
monitor portu szeregowego

moduł służący do odbierania informacji z płytki Arduino oraz wysyłania komend/danych z komputera do Arduino

zmienna typu int
zmienna typu int

zmienna przechowująca liczby całkowite

zmienna typu float
zmienna typu float

zmienna przechowująca liczby zmiennoprzecinkowe