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:
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.
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:
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:
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:
Gostou? Confira outros posts usando sensor de temperatura aqui mesmo no Arduino e Cia!