Franzininho WiFi: Sensor de temperatura DS18B20

Este post faz parte da série Franzininho WiFI - Arduino

Introdução

O DS18B20 é um sensor de temperatura digital de alta precisão amplamente utilizado em aplicações de monitoramento e controle térmico. Ele é fabricado pela Maxim Integrated e é conhecido por sua simplicidade e confiabilidade. Possui uma faixa de medição de temperatura de -55°C a +125°C, com uma precisão de ±0,5°C na faixa de -10°C a +85°C. Ele também possui uma resolução configurável, permitindo que o usuário escolha entre 9, 10, 11 ou 12 bits de precisão na leitura da temperatura.

Uma das principais características do DS18B20 é o fato de ser um sensor de temperatura de 1 fio, o que significa que ele requer apenas uma conexão para comunicação com um microcontrolador ou dispositivo compatível. Isso torna sua instalação e integração muito mais simples em comparação com outros sensores de temperatura. Comercialmente esse sensor possui duas formas disponíveis. O primeiro formato é bem parecido com um transistor, encapsulamento TO-92 e  outro envolve o sensor em uma ponta de prova metálica à prova de água.

Nesse artigo vamos mostrar como utilizar o DS18B20 com a Franzininho WiFi e explorar os recursos disponíveis para configurar e realizar as leituras.

Instalação da Biblioteca  DS18B20

Nesta seção vamos instalar na Arduino IDE a biblioteca responsável por comunicar a Franzininho WiFi para realizar as leituras de temperatura do D18B20. Acesse: Ferramenta -> Gerenciador de Bibliotecas (Tools  -> Manager Libraries)

Figura 1: Acessando o gerenciador de bibliotecas

Após acessar o Gerenciador de biblioteca aguarde surgir uma janela como mostrado na imagem abaixo. Digite no campo de texto: ds18b20 e aguarde o resultado da pesquisa finalizar. Procure pela biblioteca e clique em Install, para concluir a instalação e clique em Close. Pronto já estamos aptos a utilizar a biblioteca.

Figura 2: Instalação da biblioteca

Biblioteca DS18B20

Nesta seção apresentaremos os métodos utilizados pela biblioteca DallasTempeture.h e no OneWire.h  usadas no exemplo de projeto. 

begin()

Configura a GPIO que vai operar dentro do protocolo 1-Wire.

bool begin();

Retorna true, configurou corretamente e false, não foi possível configurar. 

getDeviceCount()

Busca o número de dispositivos presente conectado a GPIO configurada pelo método begin.

int getDeviceCount();

Retorna o número de dispositivos “pendurados” no barramento.

Método da biblioteca OneWire.h para buscar os endereços do(s) dispositivo(s)

int search(uint8_t *Newaddr);
  • Newaddr : ponteiro para receber a variável correspondente ao endereço 

Retorna true, caso tenha encontrado dispositivo e false, não foi encontrado nenhum dispositivo.

resquestTempetures()

Solicita por meio de comandos a leitura de temperatura e aguarda recebê -las . 

request_t requestTempeture();

O resultado dessas leituras são postas em uma estrutura de dados chamada request_t. Internamente há o valor da temperatura.

getTempCByIndex()

Pega o valor mais recente de temperatura de acordo com o índice, esse índice indica qual sensor conectado ao barramento está buscando ler, por exemplo, se houvesse 3 sensores teríamos que buscar do índice 0 ao 2.

float getTempCByIndex(uint8_t index);
  • index : indice ordenado de cada sensor (0-128)

Retorna valor da temperatura em Celsius.

Materiais necessários

Os materiais necessários para desenvolver nossa aplicação são:

  • Placa Franzininho WiFi
  • Sensor DS18B20
  • Resistor 4k7 ohms
  • Jumpers
  • Arduino IDE 

Circuito 

No circuito proposto vamos utilizar a GPIO3 para criar uma comunicação bidirecional através do protocolo OneWire, a escolha desse pino foi arbitrária podendo ser qualquer GPIO disponível para realizar as leituras de temperatura. É necessário colocar um resistor de pull -up para interface com o sensor. Caso tenha interesse em conhecer mais sobre o componente acesse o datasheet.

  •  VCC: conectar no 3.3v da Franzininho WiFi 
  •  GND: conectar no GND da Franzininho WiFi
  • DQ: pino responsável por trafegar as requisições (comandos) e as leituras de temperatura
Figura 3: Esquema de montagem com a Franzininho WiFi e o DS18B20

Código para DS18B20

No projeto proposto realizaremos as leituras de temperatura, verificar a quantidade de sensores conectados à GPIO e extrair o endereço do sensor. O código abaixo realiza a leitura de apenas um sensor, contudo há a possibilidade de utilizar múltiplos sensores. 

#include <OneWire.h>
#include <DallasTemperature.h>


// Definir qual pino está conectado o sensor DS18B20
#define DS_18B20 3


//Declara construtor para responsável pela comunicação
OneWire one_wire(DS_18B20);


//Declara construtor para responsável pela leitura do sensor DS18B20
DallasTemperature sensor(&one_wire);


//Declara as variáveis
int num_sensor;
uint8_t addr[8];
float temp;


void setup()
{
 // Inicializa a comunicação Serial em 115200 bps
 Serial.begin(115200);
 delay(2000);
 Serial.println("Iniciando a demo do DS18B20...");
  // Inicia a configura a GPIO
 sensor.begin();
 
 Serial.println("Procurando sensores ...");
 // Verifica a quantidade de sensores conectados ao pino
 num_sensor = sensor.getDeviceCount();
 //Caso tenha encontrado algum sensor
 if(num_sensor >0)
 {
   Serial.print("Encontrou  ");
   Serial.print(num_sensor);
   Serial.println(" sensores");
 }
 // Caso não tenha encontrado nenhum sensor
 else
 {
   Serial.println(" Não encontrou o(s) sensor(es)");
   return;
 }
 // Identifica o endereço do sensor
 if(one_wire.search(addr))
 {
   Serial.print("Endereço : ");
   //Procura apenas o primeiro endereço dos sensores
   for(int i =0; i<8; i++)
   {
     Serial.print("0x");
     if(addr[i]<0x10) Serial.print("0");
     Serial.print(addr[i],HEX);
     if(i < 7) Serial.print(":");
   }
   Serial.println();
 }
}


void loop() {
 //Envia comando para realizar a leitura de temperatura
 sensor.requestTemperatures();


 // Realiza as leituras de temperatura
 temp = sensor.getTempCByIndex(0);


 //Caso receba o valor válido de temperatura
 if(temp != DEVICE_DISCONNECTED_C)
 {
   Serial.print("Temperatura - ");
   Serial.print(temp);
   Serial.println("C");
 }
 //Caso valor de temperatura não válido
 else
 {
   Serial.println("[Erro] : Não foi possível realizar a leitura do sensor");
 }
 delay(1000);
}

Simule esse exemplo no Wokwi: https://wokwi.com/projects/368693283900956673

Explicação do Código

Incluímos as duas bibliotecas responsáveis pela comunicação Onewire (OneWire.h) e por habilitar os métodos para realizar a leitura e envio de comando(s) ao sensore(s) (DallasTemperature.h).

#include <OneWire.h>
#include <DallasTemperature.h>

Define o pino onde o sensor está conectado:

// Definir qual pino está conectado o sensor DS18B20
#define DS_18B20 3

Declara os construtores que serão responsáveis por acessar os métodos de leitura e envio de comandos na comunicação OneWire, vale observar que um construtores utiliza como parâmetro o objeto declarado anteriormente.

//Declara construtor para responsável pela comunicação
OneWire one_wire(DS_18B20);

//Declara construtor para responsável pela leitura do sensor DS18B20
DallasTemperature sensor(&one_wire);

Declara as variáveis para receber a quantidade de sensores (num_sensor), receber o endereço do sensor, vetor de oito posições(addr[8]) e o valor da temperatura (temp).

//Declara as variáveis
int num_sensor;
uint8_t addr[8];
float temp;

No setup, vamos inicializar a comunicação serial e configurar a GPIO conectada ao sensor pelo método (sensor.begin()).

// Inicializa a comunicação Serial em 115200 bps
Serial.begin(115200);
delay(2000);
Serial.println("Iniciando a demo do DS18B20...");
// Inicia a configura a GPIO
sensor.begin();

A próxima etapa é fazer a busca da quantidade de sensores conectados ao GPIO e caso não tenha nada conectado a execução da demonstração do sensor é finalizada.

Serial.println("Procurando sensores ...");
 // Verifica a quantidade de sensores conectados ao pino
 num_sensor = sensor.getDeviceCount();
 //Caso tenha encontrado algum sensor
 if(num_sensor >0)
 {
   Serial.print("Encontrou  ");
   Serial.print(num_sensor);
   Serial.println(" sensores");
 }
 // Caso não tenha encontrado nenhum sensor
 else
 {
   Serial.println(" Não encontrou o(s) sensor(es)");
   return;
 }

Buscar o endereço do sensor e mostrar no monitor serial o seu valor em hexadecimal, formato normalmente utilizado para mostrar endereço.  

// Identifica o endereço do sensor
 if(one_wire.search(addr))
 {
   Serial.print("Endereço : ");
   //Procura apenas o primeiro endereço dos sensores
   for(int i =0; i<8; i++)
   {
     Serial.print("0x");
     if(addr[i]<0x10) Serial.print("0");
     Serial.print(addr[i],HEX);
     if(i < 7) Serial.print(":");
   }
   Serial.println();
 }

No loop, a execução do programa requisita as leituras do sensor de temperatura a partir de comandos bit a bit definidos internamente dentro do dispositivo e retorna pelo método getTempCByIndex tendo como parâmetro o  índice desejado, nesse caso como temos apenas 1 sensor, então desejado pegar o primeiro sensor conectado. 

//Envia comando para realizar a leitura de temperatura
 sensor.requestTemperatures();


 // Realiza as leturas de temperatura
 temp = sensor.getTempCByIndex(0);

 Após receber o valor do método, verificamos se é uma leitura válida  e imprimimos na serial, caso contrário avisa com uma mensagem de erro e aguarda 1 segundo para executar a requisição de leitura.

 //Caso receba o valor válido de temperatura
 if(temp != DEVICE_DISCONNECTED_C)
 {
   Serial.print("Temperatura - ");
   Serial.print(temp);
   Serial.println("C");
 }
 //Caso valor de temperatura não válido
 else
 {
   Serial.println("[Erro] : Não foi possível realizar a leitura do sensor");
 }
 delay(1000);

Conclusão

Nesse artigo aprendemos usar o versátil sensor de temperatura DS18B20. Vimos como é fácil fazer a instalação do sensor no circuito e a fácil utilização da biblioteca. Recomendamos que teste a utilização de mais sensores no mesmo barramento e faça as leituras. Outro desafio sugerido é exibir os valores de temperatura em um display.

Gostaríamos de ver seus projetos, fique a vontade para contribuir com novos exemplos e/ou variações deste exemplo.

Franzininho WiFI - Arduino

Franzininho WiFi: Sensor de temperatura e umidade DHT22 Franzininho WiFi: Display LCD 16×2 com comunicação I2C
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Arduino » Franzininho WiFi: Sensor de temperatura DS18B20

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: