Snímač teploty TMP36
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2023 - Lukáš Savčak
Úvod
TMP36 je teplotný snímač typu "analog temperature sensor". Je to integrovaný obvod, ktorý dokáže meriať teplotu a poskytuje výstup vo forme analógového napätia, ktoré je priamo úmerné teplote. TMP36 je často používaný teplotný snímač v projektoch s Arduinom a inými mikrokontrolérmi, pretože je jednoduchý na použitie a poskytuje presné merania v širokom rozsahu teplôt. Tento snímač pracuje s napájacím napätím od 2.7V do 5.5V, pričom výstupné napätie sa mení lineárne s teplotou. Napríklad, ak je snímač pripojený k 5V napájaciemu zdroju, jeho výstupné napätie je 10mV/°C. TMP36 má 3 piny: VCC (napájanie), GND (zem) a OUT (výstup). Pripája sa pomocou analógového vstupu mikrokontroléra, ktorý dokáže čítať analógové napätie a prevádzať ho na hodnotu teploty. Tento snímač je populárny pre jednoduché aplikácie merania teploty, ako napríklad monitorovanie teploty prostredia, riadenie tepelných systémov, meranie teploty v miestnostiach a podobne.
Literatúra:
Analýza a opis riešenia
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
Algoritmus a program
Algoritmus programu je jednoduchý, program funguje na princípe snímania teploty okolia, ktorá je následne zobrazená pomocou sériovej linky na terminál. Teplotu snímač meria v stupňoch Farenheita, avšak v programe je urobený prepočet zo stupňov Farenheita na stupne Celzia.
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
// Definícia pinu, ku ktorému je pripojený sníma? TMP36
#define ADC_PIN 0
// Inicializácia sériovej linky
void USART_init(unsigned int baud_rate) {
// Výpo?et hodnoty registra UBRR pre nastavenie baudového pomeru
unsigned int UBRR_value = F_CPU / (16 * baud_rate) - 1;
// Nastavenie baudového pomeru
UBRR0H = (unsigned char)(UBRR_value >> 8);
UBRR0L = (unsigned char)UBRR_value;
// Zapnutie vysiela?a a prijíma?a
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
// Nastavenie formátu rámcu: 8 dátových bitov, 1 stop bit, bez parity
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}
// Funkcia na odosielanie znaku cez sériovú linku
void USART_transmit_char(unsigned char data) {
// Čakanie na prázdny transmitovací buffer
while (!(UCSR0A & (1 << UDRE0)))
;
// Odoslanie znaku
UDR0 = data;
}
// Funkcia na odoslanie re?azca cez sériovú linku
void USART_transmit_string(char *string) {
int i = 0;
while (string[i] != '\0') {
USART_transmit_char(string[i]);
i++;
}
}
// Funkcia pre inicializáciu analógového prevodníka
void ADC_init() {
// Nastavenie referen?ného napätia na vnútorné 2.56V
ADMUX = (1 << REFS0) | (1 << REFS1);
// Nastavenie presnosti prevodu na 8 bitov
ADMUX |= (1 << ADLAR);
// Povolenie analógového prevodníka
ADCSRA = (1 << ADEN);
}
// Funkcia pre meranie teploty
//float measure_temperature() {
int measure_temperature() {
// Spustenie konverzie
ADCSRA |= (1 << ADSC);
// ?akanie na dokon?enie konverzie
while (ADCSRA & (1 << ADSC))
;
// Výpo?et teploty v stup?och C
float voltage = (ADC * 2.56) / 1024;
float temperature = (voltage - 0.5) * 100;
return temperature;
}
int main(void) {
// Inicializácia ADC
ADC_init();
// Inicializácia sériovej linky s baudovým pomerom 9600
USART_init(9600);
// Bufor pre nameranú teplotu
char temperature_buffer[10];
// Nekone?ná slu?ka
while (1) {
// Meranie teploty
int temperature = measure_temperature();
// Formátovanie teploty ako re?azca
//sprintf(temperature_buffer, "%.2f", temperature);
sprintf(temperature_buffer, "%d ", temperature);
// Odoslanie teploty cez sériovú linku
USART_transmit_string("Teplota: ");
USART_transmit_string(temperature_buffer);
USART_transmit_string(" °C\r\n");
// Oneskorenie 1 sekundu
_delay_ms(1000);
}
return 0;
}
:
Zdrojový kód: zdrojaky.zip
Overenie
Ako je možné vidieť na nasledujúcom obrázku, na realizáciu projektu sme použili dosku Acrob so zabudovaným prepojovacím poľom, ako náhradu za mikropočítač Arduino. Na ňu sme pripojili snímač teploty TMP36, ktorý sme pripojili na 5V, GND a analógový pin A0.
Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.