Operácie

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.


Vývojová doska ACROB.

Literatúra:


Analýza a opis riešenia

Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...

Schéma zapojenia Arduino a TMP36.


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.

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:

tmp36_video.mp4

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.