Snímač teploty TMP36: Rozdiel medzi revíziami
Z SensorWiki
(→Analýza a opis riešenia) |
|||
Riadok 23: | Riadok 23: | ||
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 34: | ||
<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 | ||
+ | |||
+ | // 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; | ||
+ | } | ||
− | while ( | + | // 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; | ||
+ | } | ||
− | 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 | ||
+ | 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; | ||
+ | } | ||
− | |||
</source></tab> | </source></tab> | ||
</tabs> | </tabs> |
Verzia zo dňa a času 20:43, 8. 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() {
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;
}
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:
Zdrojový kód: zdrojaky.zip
Overenie
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.
Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.