DS18B20 Sensor de temperatura a prova de água

O DS18B20 é um circuito integrado que atua como termômetro digital e é facilmente confundido com um transistor devido ao seu encapsulamento, sendo também é facilmente encontrado em sondas para medição de temperatura, geralmente para aplicações de alta exposição a umidade.

Aplicações

  • Sensoriamento remoto;
  • Estações meteorológicas;
  • Controle por temperatura.



Especificações

  • Voltagem de Trabalho: 5
  • Consumo: 6mA com giroscópio e acelerômetro;
  • Tamanho: 4,0mm x 4,0mm x 0,9mm;
  • Interface de comunicação: I²C.



Faixas de Leitura

  • Temperatura: -55°C/-67°F a +100°C/+212°F;
  • Resolução de 9 e 12 bit.

Peculiaridades

O DS18B20 é ideal para quem busca um “termômetro digital” de 12bit que esteja dentro da faixa de leitura de -55°C/-67°F a +100°C/+212°F com comunicação digital via um único fio.

Tipos de encapsulamentos do sensor de temperatura DS18B20

O sensor ele é um chip comumente encontrado com o encapsulamento TO-92 mas existe o de modelo sonda em que o DS18B20 é inserido em um case metálico, resinado e vedado para aplicações de alta umidade ou submersão. Esse modelo de sonda está disponível para venda em nossa loja.

Sensor De Temperatura Ds18b20 Sonda À Prova Dágua Arduino - Armazém Tech

Esse modelo seria ideal para nosso projeto de sensor de umidade caseiro pois os termistores usados ficaram expostos a umidade e sofreram oxidação. Além de já fornecer uma resolução acima que dos 10bit do ADC do Atemega328p.

Leitura

A precisão do DS18B20 vai depender da configuração da resolução do ADC, podendo variar de 9 e 12bits, quanto maior a resolução maior a precisão terá a leitura.

Foi feito um teste com a sonda submersa em uma garrafa com água até que a temperatura se estabilizasse, logo em seguida foi feito o teste com 9bit e 12bit e esses foram respectivamente os resultados:

Leitura do sensor de temperatura DS18B20 com resolução de 9bit
Leitura do sensor de temperatura DS18B20 com resolução de 12bit



Dimensões do DS18B20

O encapsulamento mais popular desse sensor é o TO-92 que é o mesmo de um transistor BC547 por exemplo e por isso pode ser facilmente confundido com um transistor mas se trata de um circuito integrado.

Sensor DS18B20



DS18B20 com Arduino

O uso do DS18B20 com o Arduino é extremamente simples por já ter diversas bibliotecas prontas que facilitam muito o processo de comunicação entre microcontrolador e sensor(es). Caso não tenha nem o Arduino e nem o DS18B20 saiba que ambos estão disponíveis em nossa loja.

Diagrama

No caso do modelo sonda, os fios de alimentação são bem definidos com preto e vermelho e o de dados geralmente é amarelo. Como a sonda não tem um resistor de 4k7 integrado, o ideal recomendado pelo datasheet é o uso de um resistor em pullup ligado ao pino de dados.

Diagrama esquemático do sensor de temperatura DS18B20 com Arduino

Código DS18B20 e Arduino

Para o funcionamento completo do DS18B20 é necessário o uso de duas bibliotecas, uma será responsável pelo tipo de comunicação OneWire e outro será do próprio sensor DallasTemperature.

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

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS A4
#define TEMPERATURE_PRECISION 9 // Lower resolution

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address

void setup(void)
{
  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  //Serial.print("Locating devices...");
  
  //Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  //Serial.println(" devices.");

  // report parasite power requirements
  //Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
  {
    //Serial.print("Found device ");
    Serial.print(i, DEC);
    //Serial.print(" with address: ");
    printAddress(tempDeviceAddress);
    //Serial.println();
    
    Serial.print("Setting resolution to ");
    Serial.println(TEMPERATURE_PRECISION, DEC);
    
    // set the resolution to TEMPERATURE_PRECISION bit (Each Dallas/Maxim device is capable of several different resolutions)
    sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);
    
    Serial.print("Resolution actually set to: ");
    Serial.print(sensors.getResolution(tempDeviceAddress), DEC); 
    Serial.println();
  }else{
    Serial.print("Found ghost device at ");
    Serial.print(i, DEC);
    Serial.print(" but could not detect address. Check power and cabling");
  }
  }

}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);
  if(tempC == DEVICE_DISCONNECTED_C) 
  {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC, 6);
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC),6); // Converts tempC to Fahrenheit
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  //Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  //Serial.println("DONE");
  
  
  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++)
  {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i))
  {
    // Output the device ID
    //Serial.print("Temperature for device: ");
    //Serial.println(i,DEC);
    
    // It responds almost immediately. Let's print out the data
    printTemperature(tempDeviceAddress); // Use a simple function to print out the data
  } 
  //else ghost device! Check your power requirements and cabling
  
  }
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

Funcionamento DS18B20 com Arduino

Considerações

O DS18B20 é um sensor ideal para quem busca um sensor de temperatura com resolução de 12bit, saída digital e com uma faixa de operação de -55°C/-67°F a +100°C/+212°F, podendo ser encontrado facilmente em modelos de sonda para aplicações de alta umidade.