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.

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.

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:


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.

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.

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.
Você precisa fazer log in para comentar.