Ao desenvolvermos sistemas de monitoramento, variáveis como temperatura e umidade são de grande importância para que sejamos capazes de entender a situação de um determinado ambiente, e com isso tomar uma ação. Sabendo disso, neste tutorial iremos aprender a utilizar o sensor de temperatura DS18B20, um sensor bastante versátil e que com seu encapsulamento a prova d’água possibilita a medição de forma mais segura.
Montando o projeto
Para este tutorial, iremos precisar de um Arduino Nano, que será responsável pela comunicação com o sensor. Também iremos utilizar o sensor DS18B20 e por fim, iremos também utilizar um resistor de 10k, que fará um pull-up entre a alimentação do sensor e o pino de comunicação utilizado. A tabela com todos os componentes utilizados pode ser vista logo abaixo:
O esquema de montagem do projeto é bem simples, e pode ser visto na figura abaixo:
Basicamente iremos conectar o pino D4 ao pino amarelo do sensor de temperatura, o 5V ao pino Vermelho do sensor e o pino GND ao pino preto do sensor de temperatura. Também será necessário adicionar ao pino amarelo um resistor de 10k entre o pino vermelho e amarelo do sensor.
Não esqueça de fazer a montagem do pull-up entre a alimentação e o pino de dados, caso contrário o sensor não será identificado pelo microcontrolador.
Veja só como ficou a montagem do projeto na breadboard :D.
Desenvolvimento do código
Agora que montamos a nossa estrutura de medição iremos partir para o código de leitura dos sensores. Este código será capaz de se comunicar com todos os sensores conectados ao nosso Arduino nano, e ler a temperatura de cada um deles.
#include <OneWire.h>; // Biblioteca de comunicação One Wire #include <DallasTemperature.h> // Biblioteca do sensor de temperatura #define PINO_ONE_WIRE 4 // Pino onde os sensores devem estar conectados #define PRECISAO_TEMPERATURA 12 // Precisão da temperatura lida do sensor ( pode variar entre 9 mínimo e 12 máximo ) #define TEMPOESPERA 2000 // Tempo de espera entre leituras OneWire oneWire(PINO_ONE_WIRE); // Objeto responsável pela comunicação onewire DallasTemperature sensores(&oneWire); // Objeto responsável pela configuração e leitura de todos os sensores de temperatura DeviceAddress enderecoDispositivo; // Endereço do dispositivo que realizaremos a leitura int dispositivosConectados = 0; // Quantidade de dispositivos conectados ao barramento One-Wire void setup() { Serial.begin(9600); // Inicialização da serial sensores.begin(); // Inicialização do objeto de comunicação com os sensores dispositivosConectados = sensores.getDeviceCount(); // Conta o número de dispositivos conectados ao barramento One-Wire Serial.print("Dispositivos Encontrados: "); // Mostra a quantidade dispositivos conectados ao barramento Serial.println(dispositivosConectados,DEC); for (int i=0; i<dispositivosConectados; i++){ // Itera sob todos os dispositivos conectados no barramento One Wire if (sensores.getAddress(enderecoDispositivo,i)){ // Se um dispositivo estiver conectado Serial.println("Dispositivo Encontrado"); // Mostro que o dispositivo foi encontrado e o endereço onde ele está Serial.print("Endereço do dispositivo: "); mostrarEndereco(); sensores.setResolution(enderecoDispositivo,PRECISAO_TEMPERATURA); // Configuro a taxa de precisão do sensor de temperatura ( 9 mínimo e 12 máximo) Serial.print("Sensor: "); Serial.print(i); Serial.print(" Configurado com precisão de: "); Serial.print(PRECISAO_TEMPERATURA); Serial.println(" Bits"); } } } void mostrarEndereco(){ // Função que mostra o endereço do dispositivo conectado ao barramento for (byte i=0; i<8; i++){ // Endereço composto por um de 8 bytes (64 bits) if (enderecoDispositivo[i]<16){ // Se o número for menor que 16 escrevemos o valor 0 Serial.print("0"); } else{ Serial.print(enderecoDispositivo[i],HEX); // Caso contrário escrevemos o byte correspondente ao endereço } } Serial.println(); } void loop() { sensores.requestTemperatures(); // Envia um comando em broadcast para que todos os sensores realizem a leitura da temperatura for (int i=0; i<dispositivosConectados; i++){ // Realizo uma iteração sob todos os sensores conectados if (sensores.getAddress(enderecoDispositivo,i)){ // Se um dispositivo estiver conectado float temperaturaCelsius = sensores.getTempC(enderecoDispositivo); // Pego a temperatura do sensor ( valor em Celsius ) Serial.print("Temperatura sensor: "); // Mostro o valor da tempratura em celsius e Fahrenheit Serial.print(i); Serial.print(" Celsius: "); Serial.print(temperaturaCelsius); Serial.print(" Fahrenheit: "); Serial.println(DallasTemperature::toFahrenheit(temperaturaCelsius)); } } delay(TEMPOESPERA); // Aguardo o intervalo de tempo necessário entre as leituras }
Você pode consultar, baixar, modificar e compartilhar o código deste tutorial em nosso repositório do GitHub! E lá você encontra todos os códigos já publicados aqui no blog! Vamos compartilhar conhecimento!
Mergulhando no projeto
Agora que elaboramos o nosso código, vamo entender como cada parte dele funciona, incluindo todas a bibliotecas que iremos precisar.
Bibliotecas necessárias
Neste projeto, iremos utilizar duas bibliotecas que por padrão não estão incluidas na IDE do Arduino, que são as bibliotecas One-Wire e DallasTemperature. Para fazer o download das duas, basta pesquisar por OneWire no gerenciador de bibliotecas.
Para acessar o Gerenciador de bibliotecas, basta clicar no menu Sketch>Incluir Biblioteca> Gerenciar Bibliotecas.
Variáveis Definidas:
– Defines
- PINO_ONE_WIRE: pino onde o sensor será conectado.
- PRECISAO_TEMPERATURA: precisão utilizada para configurar o sensor ( 9 mínimo 12 máximo).
- TEMPOESPERA: tempo de espera entre cada leitura dos sensores.
– Objetos
- oneWire: objeto responsável por estabelecer a comunicação utilizando o protocolo de comunicação oneWire.
- sensores: objeto responsável por se comunicar com todos os sensores de temperatura conectados ao barramento.
- enderecoDispositivo: objeto responsável por armazenar temporáriamente o endereço de todos os dispositivos conectados.
– Variáveis
- dispositivosConectados: armazena a quantidade de sensores de temperatura conectados ao sistema.
Função setup
dentro da função setup, iremos inicializar e configurar os sensores conectados ao nosso microcontrolador. Também iremos inicializar a comunicação serial para leitura dos dados obtidos.
- Serial.begin(9600): Inicializa a comunicaçao serial.
- sensores.begin(): Inicializa a comunicação com os sensores de temperatura.
- sensores.getDeviceCount(): retorna a quantidade de sensores conectados ao microcontrolador.
Logo em seguida realizamos uma iteração em todos os sensores conectados ao microcontrolador, utilizando o comando for e utilizando o comando sensores.getAddress() buscamos por sensores disponíveis. Ao encontrar um sensor disponível, configuramos a sua precisão através do comando sensores.setResolution() e mostramos o seu identificador através da função mostrarEndereco().
Função mostrarEndereço
O sensor de temperatura DS18B20 possui em sua memória, um endereço único composto por 64 bits, esta função tem como objetivo mostrar o endereço de cada um dos sensores conectados ao nosso microcontrolador. Para isso, a função irá escrever através da serial o valor destes sensores percorrendo as 8 posições do objeto enderecoDispositivo, onde estes dados vão estar armazenados.
Função loop
Por fim, dentro da função loop, iremos enviar uma mensagem em broadcast ( todos os dispositivos conectados ) solicitando a temperatura de cada um deles. Logo em seguida faremos novamente uma iteração em todos os dispositivos conectados ao microcontrolador utilizando o comando for. ao verificar cada um dos dispositivos, iremos obter a temperatura de cada um deles através do método getTempC. Por fim iremos mostrar a temperatura de cada um dos sensores tanto em Celsius quanto Fahrenheit através da serial.
Hardware
Sensor de temperatura DS18B20
O sensor de temperatura DS18B20 é um circuito termômetro digital, capaz de medir temperaturas entre -55°C e +125°C. Seu uso com o protocolo One-Wire, permite com que vários dispositivos possam ser conectados ao mesmo pino de comunicação. E seu encapsulamento a prova d’agua o torna ideal para medições submersas ou locais de alta úmidade.
Especificações Técnicas:
- Tensão de funcionamento: 3 – 5.5 Volts.
- Precisão da leitura: Configurável de 9 até 12 bits.
- Modelos: Encapsulamento a prova d’agua ou encapsulamento .
- Pinos: Vermelho VCC, Preto GND, Amarelo Dados.
- Protocolo de comunicação: One-Wire.
- Faixa de medição: -55°C e +125°C (Erro +/- 0,5 ºC ).
Conclusão
Neste tutorial, aprendemos a como utilizar o sensor de temperatura DS18B20, um módulo que pode ser utilizado em diversos cenários para análise de temperatura. Espero que tenham gostado do conteúdo apresentado, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.
Deixe uma resposta