Snímač teploty TMP36: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(12 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 23: | Riadok 25: | ||
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami... | Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami... | ||
[[Súbor:tmp36 | [[Súbor:tmp36.png|400px|thumb|center|Schéma zapojenia Arduino a TMP36.]] | ||
=== Algoritmus a program === | === Algoritmus a program === | ||
Algoritmus programu je. | 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. | ||
Riadok 38: | Riadok 36: | ||
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | ||
#include <avr/io.h> | #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 | |||
int | // Inicializácia sériovej linky | ||
void USART_init(unsigned int baud_rate) { | |||
unsigned | // 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); | |||
} | |||
while (1) | // 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; | |||
} | |||
void | 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; | |||
} | |||
</source></tab> | </source></tab> | ||
</tabs> | </tabs>: | ||
Zdrojový kód: [[Médiá:tmp36_remastered.c|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. | |||
[[Súbor:tmp_zapojenie.jpg|400px|thumb|center|Aplikácia.]] | |||
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:''' | |||
<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: