Snímač teploty TMP36: Rozdiel medzi revíziami
Zo stránky SensorWiki
(6 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených) | |||
Riadok 10: | Riadok 10: | ||
[[Obrázok: | [[Obrázok:tmp36data.png|600px|thumb|center|Snímač teploty TMP36]] | ||
'''Literatúra:''' | '''Literatúra:''' | ||
* [https://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf TMP36 Datasheet] | |||
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob] | * [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob] | ||
Riadok 90: | Riadok 92: | ||
// Funkcia pre meranie teploty | // Funkcia pre meranie teploty | ||
float measure_temperature() { | |||
// Spustenie konverzie | // Spustenie konverzie | ||
ADCSRA |= (1 << ADSC); | ADCSRA |= (1 << ADSC); | ||
Riadok 119: | Riadok 121: | ||
while (1) { | while (1) { | ||
// Meranie teploty | // Meranie teploty | ||
float temperature = measure_temperature(); | |||
// Formátovanie teploty ako re?azca | // Formátovanie teploty ako re?azca | ||
//sprintf(temperature_buffer, "%.2f", temperature); | //sprintf(temperature_buffer, "%.2f", temperature); | ||
sprintf(temperature_buffer, "% | sprintf(temperature_buffer, "%.2f", temperature); | ||
// Odoslanie teploty cez sériovú linku | // Odoslanie teploty cez sériovú linku | ||
USART_transmit_string("Teplota: "); | USART_transmit_string("Teplota: st C\n"); | ||
USART_transmit_string(temperature_buffer); | USART_transmit_string(temperature_buffer); | ||
// Oneskorenie 1 sekundu | // Oneskorenie 1 sekundu | ||
Riadok 139: | Riadok 140: | ||
</tabs>: | </tabs>: | ||
Zdrojový kód: [[Médiá: | Zdrojový kód: [[Médiá:tmp36_remastered.c|zdrojaky.zip]] | ||
=== Overenie === | === Overenie === | ||
Riadok 150: | Riadok 151: | ||
'''Video:''' | '''Video:''' | ||
<center><youtube>rbGoSd_mBtw</youtube></center> | |||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] |
Aktuálna revízia z 09:45, 9. jún 2023
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() {
// 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
float temperature = measure_temperature();
// Formátovanie teploty ako re?azca
//sprintf(temperature_buffer, "%.2f", temperature);
sprintf(temperature_buffer, "%.2f", temperature);
// Odoslanie teploty cez sériovú linku
USART_transmit_string("Teplota: st C\n");
USART_transmit_string(temperature_buffer);
// 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.
Program komunikuje cez sériovú linku s prenosovou rýchlosťou 9600, pričom údaje o teplote sú na termináli zobrazované každú sekundu.
Video: