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!