Utilizando o DS18B20 para medir temperatura

1) Objetivo

editar

O objetivo desta atividade é utilizar o sensor de temperatura DS18B20 juntamente com o Arduino para medir temperatura. A leitura da temperatura será visualizada em um display de LCD nas escalas de temperatura Celsius, Fahrenheit e Kelvin.

2) Materiais utilizados

editar
  • 1 - Placa Arduino UNO (Adquirida por R$ 60,00)
  • 1 - Sensor DS18B20 (Adquirido por R$ 36,00)
  • 1 - Led vermelho 5 mm
  • 1 - ressitor 4,7kΩ
  • 1 - resistor 330Ω
  • 1 - Display LCD 4x16
  • 1 - Protoboard
  • Cabos de conexão

3) Arduino utilizado

editar

Na realização da atividade foi utilizado um Arduino UNO.

 
Arduino utilizado.

Informações sobre o Arduino.

4) Características do Sensor DS18B20

editar

-> Sensor de temperatura

-> dispositivo de três terminais

-> resolução de 9 bits

-> faixa de medição entre -55 °C e 125 °C;

 
Foto do Sensor DS18B20.

-> precisão de 0,5 °C para a faixa entre -10 °C e 85 °C

-> alimentação entre 3,0 V e 5,5 V

Esquema de ligação:

editar

Fio vermelho: VCC (+ 5 V)

Fio preto: GND

Fio amarelo: dados (conectado ao Arduino no pino 6)

Obs: É necessário utilizar um resistor de 4k7 entre o VCC e o pino de dados.

-> datasheet

5) Display LCD

editar
 
Foto do display de LCD.

Para a visualização da medida da temperatura será utilizado um display LCD de 4X16(4 linhas e 16 colunas) baseado no controlador HD44780, com os pinos de conexão na parte superior numerados de 1 a 16.

Pinagem e esquema de ligação do LCD:

editar

Conexão básica do LCD ao Arduino:

Pino 4   do LCD (RS) ligado ao pino 12 do Arduino

Pino 6   do LCD (E)   ligado ao pino 11 do Arduino

Pino 11 do LCD (D4) ligado ao pino  5 do Arduino

Pino 12 do LCD (D5) ligado ao pino  4 do Arduino

Pino 13 do LCD (D6) ligado ao pino  3 do Arduino

Pino 14 do LCD (D7) ligado ao pino  2 do Arduino

Pinos 1, 5 e 16 do LCD ligados a GND

Pinos 2 e 15 ligados a VCC(5 V do Arduino)

O pino 3 do LCD tem a função de regular o contraste do display, geralmente este pino é ligado ao pino central de um potenciômetro de 10 kΩ , com os terminais 1 ligado a VCC e terminal três ligado a GND, neste protótipo este pino foi ligado ao GND.

Para obter informações sobre display de LCD e esquema de ligação consulte:

editar

http://blog.filipeflop.com/display/mostrando-informacoes-de-temperatura-no-lcd-16x2-com-o-dht11.html

6) Código Arduino

editar
 
Foto da tela, Código Arduino.

Código fonte: Ao longo do código foi inserido comentários que ajudam a compreender o programa

editar

//******************* Programa : Sensor de temperatura DS18B20 **********************

// Autor : Leonardo Postay

// Descrição : Utiliza o sensor DS18B20 para medir temperatura, a temperatura

// é disponibilizada em um LCD e no monitor serial, nas escalas de temperatura

// Celsius, Fahrenheit e Kelvin

//***********************************************************************************

//****************************** Bibliotecas ****************************************

//Carrega a bibliotec OneWire

include <OneWire.h>

//Carrega a biblioteca DallasTemperature

include <DallasTemperature.h>

//Carrega a biblioteca LiquidCrystal

include <LiquidCrystal.h>

//**************************** Fim *************************************************


//********************** Define os pinos do Arduino **************************

// Pino de sinal do DS18B20

// o sensor de temperatura se comunica através do protocolo 1- Wire

define ONE_WIRE_BUS 6

// Pino do led

define led 7

//Define os pinos que serão utilizados para ligação ao display

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//************************** Fim **************************************************

// Define uma instancia do oneWire para comunicacao com o sensor

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

DeviceAddress sensor1;


//variável para armazenar o valor da temperatura Celsius

float Celsius;


//********* Função para converter a temperatura para Kelvin ************

//Converte a temperatura informado no parâmetro tc para a correspondente

//temperatura na Escala Kelvin

float conv_Celsius_Kelvin( float tc){

   return tc +273; //tk = tc + 273

}

//************************ Fim ******************************************


//******** Função para converter a temperatura para Fahrenheit *********

//Converte a temperatura informada no parâmetro tc para a correspondente

//temperatura na Escala Fahrenheit

float conv_Celsius_Fahrenheit( float tc ){

   return 1.8 * tc + 32; //Tf = 9/5*tc + 32
 

}

//************************* Fim *****************************************************


//********** Função para mostrar as temperaturas no LCD *****************************

//escreve no LCD a temperatura nas escalas Celsius, Fahrenheit e Kelvin

void mostraLCD( float tempCelsius){

 //limpa o LCD
 lcd.clear();
 //posiciona o cursor na coluna 0 e linha 0 e escreve a mensagem Temperaturas
 lcd.setCursor(0, 0);
 lcd.print("  Temperaturas  ");
 //posiciona o cursor na coluna 0 e linha 1 e escreve a mensagem Celsius seguido da valor da temperatura Celsius
 lcd.setCursor(0, 1);
 lcd.print("  Celsius : ");
 lcd.setCursor(11, 1);
 lcd.print(tempCelsius);
 //posiciona o cursor na coluna 0 e linha 2 e escreve a mensagem Fahrenheit seguido da valor da temperatura Fahrenheit
 lcd.setCursor(0, 2);
 lcd.print("Fahrenheit: ");
 lcd.setCursor(11, 2);
 lcd.print( conv_Celsius_Fahrenheit( tempCelsius ) );
 //posiciona o cursor na coluna 0 e linha 3 e escreve a mensagem Kelvin seguido da valor da temperatura Kelvin
 lcd.setCursor(0, 3);
 lcd.print("   Kelvin : ");
 lcd.setCursor(11, 3);
 lcd.print( conv_Celsius_Kelvin( tempCelsius ) );
 

}

//********************************************************************************************************************


//********** Função para mostra as temperaturas no Monitor Serial ****************************************************

//escreve no monitor serial a temperatura nas escalas Celsius, Fahrenheit e Kelvin

void mostraMonitorSerial( float tempCelsius ){

 Serial.println( );
 // Mostra temperatura na escala Celsius no monitor serial
 Serial.print(" Temperatura em graus    Celsius: ");
 Serial.print(tempCelsius);
 Serial.println( );
 
 // Mostra temperatura absoluta no monitor serial
 Serial.print(" Temperatura em          Kelvins: ");
 Serial.print( conv_Celsius_Kelvin( tempCelsius) );
 Serial.println( );
 // Mostra temperatura na escala Fahrenheit no monitor serial
 Serial.print(" Temperatura em graus Fahrenheit: ");
 Serial.print( conv_Celsius_Fahrenheit( tempCelsius ) );
 Serial.println( );

}

//*************************** Fim ***********************************************************************************


//************************** Mensagens de inicialização *************************************************************

void mensInicial( void ){

 //Posiciona o cursor na coluna 0, linha 0 e envia o texto Inicializando
 lcd.setCursor(0, 0);
 lcd.print("Inicializando");
 
 //Posiciona o cursor na coluna 2, linha 1 e envia o texto sensor DS18B20
 lcd.setCursor(2, 1);
 lcd.print("  sensor DS18B20");
 Serial.println("    Inicializando o sensor de temperatura DS18B20");

}

//*************************** Fim ***********************************************************************************


//*************************** Instruções de Inicializações **********************************************************

void setup(void) {

 //Define a pino do led como saída
 pinMode(led, OUTPUT); 
 
 //Define o número de colunas e linhas do LCD e limpa o LCD
 lcd.begin(16, 4);
 lcd.clear();
 //Estabelece uma conexão serial e envia a mensagem para o Monitor Serial
 Serial.begin(9600);
 //Estabelece a comunicação com o sensor e inicializa o sensor
 sensors.begin();
 sensors.getAddress(sensor1, 0);
 
 //Inicializa a variável Celsius
 sensors.requestTemperatures();
 Celsius = sensors.getTempC(sensor1);
 //Escreve as menssagens iniciais
 mensInicial( );
   
 //espera 2 s
 delay( 2000 );


 //Informa as temperaturas
 mostraLCD( Celsius );
 mostraMonitorSerial( Celsius );
 delay( 2000 );

}

//*************************** Fim ****************************************************************


//*************************** Estrutura de repetição *********************************************

void loop() {

 // Liga o led para sinalizar que o sensor está lendo a temperatura
 digitalWrite(led, HIGH);
 
 // Realiza a leitura da temperatura e armazena o valor na variável tempCelsius
 sensors.requestTemperatures();
 float tempCelsius = sensors.getTempC(sensor1);
 //se houve alteração na temperatura atualiza as informações
 if ( tempCelsius != Celsius ){ 
     mostraLCD( tempCelsius );
     mostraMonitorSerial( tempCelsius );
     Celsius = tempCelsius;
 }
 
 //espera por 500 ms e desliga o led
 delay(500);
 digitalWrite(led, LOW); 
 // espera poe 500 ms para repetir o loop
 delay(500);


}

//***************************** Fim *************************************************************

Bibliotecas OneWire e DallasTemperature:

editar

Para obter as bibliotecas e informações de como inseri-las no programa Arduino consulte:

http://blog.filipeflop.com/sensores/sensor-de-temperatura-ds18b20-arduino.html

7) Esquema de ligações dos componentes

editar

Esquema de interligação dos componentes.

 
Esquema de ligação dos componentes.

8) Aparência da montagem

editar
 
Montagem em protoboard.

Foto da montagem em protoboard.

9) Teste da montagem

editar

Vídeos dos testes da montagem.

Vídeo 1. Teste do sensor de temperatura.
Vídeo 2. Teste do sensor de temperatura.

10) Sugestões de atividade

editar

Um dos assuntos estudados na Termologia são as Escalas Termométricas. Esta montagem pode ser utilizada em sala de aula como recurso motivador para introduzir uma escala de temperatura fictícia em que os alunos já conhecem a equação de conversão entre esta escala e a escala Celsius. Após validar esta equação, os alunos poderiam adaptar o código Arduino para que o termômetro passe a medir temperatura também na escala estudada. Abaixo é mostrado a função implementada para converte da Escala Celsius para a Escala Fahrenheit, caso se deseje implementar uma nova função bastaria substituir a equação de conversão para a equação conveniente.

//******** Função para converter a temperatura para Fahrenheit *********

//Converte a temperatura informada no parâmetro tc para a correspondente

//temperatura na Escala Fahrenheit

float conv_Celsius_Fahrenheit( float tc ){

   return 1.8 * tc + 32; //Tf = 9/5*tc + 32
 

}

//************************* Fim *****************************************************

É importante perceber que também deveria-se adaptar a função mostraMonitorSerial( ), no trecho em destaque abaixo, deveria-se substituir a Escala Fahreneit pelo nome conveniente.

// Mostra temperatura na escala Fahrenheit no monitor serial

Serial.print(" Temperatura em graus Fahrenheit: ");

Serial.print( conv_Celsius_Fahrenheit( tempCelsius ) );

Serial.println( );

E também deveria-se adaptar a função mostraLCD( ), no trecho em destaque abaixo, no trecho em destaque abaixo, deveria-se substituir a Escala Fahreneit pelo nome conveniente.

//posiciona o cursor na coluna 0 e linha 2 e escreve a mensagem Fahrenheit seguido da valor da temperatura Fahrenheit

lcd.setCursor(0, 2);

lcd.print("Fahrenheit: ");

lcd.setCursor(11, 2);

lcd.print( conv_Celsius_Fahrenheit( tempCelsius ) );