No post de hoje vamos conhecer o sensor de temperatura DS18B20 e como utilizar esse sensor com Arduino Uno, aprendendo como identificar o endereço de cada sensor e mostrar suas informações no serial monitor.

O sensor de temperatura DS18B20

O DS18B20 é um sensor de temperatura digital, sendo uma alternativa interessante ao já conhecido LM35.

As características do DS18B20 são:

  • Utilização de apenas 1 pino para conexão ao microcontrolador
  • Possibilidade de utilizar mais de 1 sensor na mesma porta do Arduino, pois cada sensor tem um endereço físico, podendo ser acessado individualmente pelo microcontrolador
  • Sua tensão de operação vai de 3.0V a 5.5V
  • Sua faixa de leitura de temperatura vai de -55°C a +125°C
  • Possui um alarme interno, que pode ser ativado caso a temperatura esteja fora de um limite pré estabelecido
  • Para obter o datasheet com as informações completas do DS18B20, clique aqui.

Abaixo temos a pinagem do sensor:

Pinagem DS18B20

Uma das grandes vantagens desse sensor é que você pode utilizar vários deles no mesmo circuito realizando a comunicação por uma única porta do Arduino.

Partindo desse principio, vou apresentar um circuito com 2 sensores, e vamos utilizar 2 programas para:

  • Identificar o endereço físico de cada sensor DS18B20
  • Utilizar esse endereço físico para obter a temperatura do sensor desejado

Os exemplos, com as alterações de praxe (traduções/comentários), foram retiradas do site Hacktronics.

Circuito sensor DS18B20 com Arduino

Monte o circuito abaixo, tomando cuidado com a pinagem do sensor: o pino de sinal é o pino central, que está conectado na porta digital 10 do Arduino Uno.

Circuito sensor de temperatura DS18B20 com Arduino

Obs: Utilizei resistores de 4K7.

Atualizado em 30-01-2020: Confira também como usar o DS18B20 com ESP8266 acessando o post Sensor de temperatura DS18B20 com ESP8266 ESP-01.

Identificando o endereço do sensor DS18B20

Para os exemplos deste post vamos usar as biliotecas OneWire e Dallas. Baixe as bibliotecas abaixo, e copie para a pasta LIBRARIES da IDE do seu Arduino:

Biblioteca Dallas

Agora carregue no Arduino o programa abaixo, que vai identificar os endereços físicos dos sensores:

//Programa: Scan DS18B20
//Alterações: Arduino e Cia
//Este programa procura pelos sensores no circuito e mostra o valor 
//do endereço físico de cada sensor no Serial Monitor

#include <OneWire.h>

//Conecte o pino central dos sensores ao pino 10 do Arduino
OneWire  ds(10);  

void setup(void) 
{
  Serial.begin(9600);
  discoverOneWireDevices();
}

void discoverOneWireDevices(void) 
{
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  Serial.print("Procurando dispositivos DS18B20...\n\r");

  while(ds.search(addr)) 
  {
    Serial.print("\n\rEncontrado sensor \'DS18B20\' com endereco:\n\r");
    for( i = 0; i < 8; i++) 
    {
      Serial.print("0x");
       if (addr[i] < 16) 
       {
        Serial.print('0');

       }
      Serial.print(addr[i], HEX);

       if (i < 7) 
       {
        Serial.print(", ");
       }

    }

    if ( OneWire::crc8( addr, 7) != addr[7]) 
    {
        Serial.print("CRC nao e valido!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rFinal da verificacao.\r\n");
  ds.reset_search();
  return;
}

void loop(void) 
{
  //Loop Vazio
} 

Após transferir o programa para o Arduino, abra o Serial monitor, e você verá uma tela como essa, mostrando o endereço de cada DS18B20 encontrado no barramento:

Serial monitor - Scan DS18B20

Mostrando informações do DS18B20 no serial monitor

Agora que você já tem o endereço de cada sensor, vamos utilizar um outro programa que vai usar os endereços obtidos anteriormente, relacionar cada um com uma variável, e mostrar as temperaturas na tela:

//Programa: Leitor temperatura sensor DS18B20
//Alterações: Arduino e Cia
//Este programa usa o endereço físico de cada sensor para mostrar as 
//informações de temperatura no Serial Monitor

#include <OneWire.h>

#include <DallasTemperature.h>

//Conectar o pino central dos sensores ao pino 10 do Arduino
#define ONE_WIRE_BUS 10

//Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

//Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x28, 0xE1, 0x20, 0x9D, 0x04, 0x00, 0x00, 0x1A };
DeviceAddress outsideThermometer = { 0x28, 0xE5, 0x82, 0x9D, 0x04, 0x00, 0x00, 0x76 };
DeviceAddress dogHouseThermometer = { 0x28, 0x59, 0xBE, 0xDF, 0x02, 0x00, 0x00, 0x9F };

void setup(void)
{
  //start serial port
  Serial.begin(9600);
  //Start up the library
  sensors.begin();
  //set the resolution to 10 bit (good enough?)
  sensors.setResolution(insideThermometer, 10);
  sensors.setResolution(outsideThermometer, 10);
  sensors.setResolution(dogHouseThermometer, 10);
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) 
  {
    Serial.print("Erro ao ler temperatura !");
  } 
  else 
  {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{ 
  delay(10000);
  Serial.print("Lendo temperaturas...\n\r");
  sensors.requestTemperatures();
  Serial.print("Temperatura Sensor 1: ");
  printTemperature(insideThermometer);
  Serial.print("\n\r");
  Serial.print("Temperatura Sensor 2: ");
  printTemperature(outsideThermometer);
  Serial.print("\n\r");
  Serial.print("Temperatura Sensor 3: ");
  printTemperature(dogHouseThermometer);
  Serial.print("\n\r\n\r");
}

Abra o serial monitor e verifique o valor da temperatura medido pelo sensor DS18B20, em Celsius e Fahrenheit:

Lendo temperatura sensores DS18B20

Gostou? Confira outros posts usando sensor de temperatura aqui mesmo no Arduino e Cia!

Avalie este post!