Utilizando o DS18B20 para medir temperatura
1) Objetivo
editarO 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
editarNa realização da atividade foi utilizado um Arduino UNO.
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;
-> 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:
editarFio 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
editarPara 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:
editarConexã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:
editarhttp://blog.filipeflop.com/display/mostrando-informacoes-de-temperatura-no-lcd-16x2-com-o-dht11.html
6) Código Arduino
editarCó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:
editarPara 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
editarEsquema de interligação dos componentes.
8) Aparência da montagem
editarFoto da montagem em protoboard.
9) Teste da montagem
editarVídeos dos testes da montagem.
10) Sugestões de atividade
editarUm 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 ) );