Operácie

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.png|400px|thumb|center|RGB LED.]]
+
[[Súbor:tmp36.png|400px|thumb|center|Schéma zapojenia Arduino a TMP36.]]
 
 
Nezabudnite doplniť schému zapojenia!
 
 
 
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
 
  
  
 
=== 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);
 +
}
  
int main(void)
+
// Funkcia na odosielanie znaku cez sériovú linku
{
+
void USART_transmit_char(unsigned char data) {
   unsigned int measuredValue;
+
  // Čakanie na prázdny transmitovací buffer
 +
  while (!(UCSR0A & (1 << UDRE0)))
 +
    ;
 +
 
 +
  // Odoslanie znaku
 +
   UDR0 = data;
 +
}
  
   while (1)
+
// Funkcia na odoslanie re?azca cez sériovú linku
  {
+
void USART_transmit_string(char *string) {
     /*  relax  */ 
+
  int i = 0;
 +
   while (string[i] != '\0') {
 +
    USART_transmit_char(string[i]);
 +
     i++;
 
   }
 
   }
 +
}
  
   return(0);
+
// 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);
 
}
 
}
  
</source></tab>
+
// Funkcia pre meranie teploty
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
//float measure_temperature() {
#include <avr/io.h>
+
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 adc_init(void);                                   // A/D converter initialization
+
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;
 +
}
  
unsigned int adc_read(char a_pin);
 
 
</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.


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;
}

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.

Aplikácia.

Video:

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