domingo, 9 de novembro de 2014

Medir temperatura com sensor DS18B20.

Medir temperatura com sensor DS18B20.

O DS18B20 é um sensor de temperatura digital que permite medir com precisão a variação de temperatura em graus Celsius com uma resolução configurável de 9 a 12 bits. 

O DS18B20 ou Dalas 18B20, como também é conhecido, usa a interface 1-Wire para se comunicar, ou seja, é necessário apenas um fio ligando à um Arduino ou microcontrolador para enviar os dados de forma digital. 

Este sensor trabalha entre -55°C e 125°C com uma precisão de 0.5°C quanto está operando entre -10°C e 85°C. Cada sensor DS18B20 possui um número de identificação de 64 bits, que permite ligar vários destes sensores no mesmo pino e consultar a informação de cada um de forma independente, ou seja, você pode espalhar 50 sensores em regiões diferentes e saber qual a temperatura de cada um acessando seu endereço. 

A ligação deste sensor de temperatura é bem simples. Para usá-lo, juntamente com um Arduino ou com um microcontrolador, basta alimentar o sensor com uma fonte de 3 a 5.5 volts ou diretamente no Arduino e ligar o pino de sinal no pino digital 2 do Arduino. Também é necessário um resistor de 4.7k pull-up entre o pino de sinal e a alimentação, como está indicando nas imagens. 

Medir temperatura com sensor DS18B20.

Ou mais de um sensor DS18B20 juntos:

Medir temperatura com sensor DS18B20.

Note que o sensor DS18S20 é semelhante ao DS18B20.

Ele também pode ser ligado com apenas dois fios, mas sua velocidade de comunicação é diminuída. 

É possível encontrar este sensor no Aliexpress e no DX por poucos doláres.
Para usar o DS18B20 com o código abaixo, você necessitará da biblioteca OneWire e da biblioteca DallasTemperature em sua pasta de biblioteca do Arduino. 

Para baixar essas bibliotecas, clique aqui

Depois, você tem que encontrar o número de identificação do sensor ou dos sensores. Para isso, rode o seguinte código primeiro. 

Código: 
#include <OneWire.h>

OneWire  ds(2);  // Coloque o pino de sinal do sesnor no pino 2

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

void discoverOneWireDevices(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  Serial.print("Procurando por dispositivos...\n\r");
  while(ds.search(addr)) {
    Serial.print("\n\rOs seguintes id de disposivos foram encontrados :\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 valido!\n");
        return;
    }
  }
  Serial.print("\n\r\n\rPronto.\r\n");
  ds.reset_search();
  return;
}

void loop(void) {
  
}


Vai encontrar algo assim:

0x28, 0x8A, 0xB1, 0x40, 0x04, 0x00, 0x00, 0xC7

Substitua os números de identificação no código abaixo. Note que neste código está sendo usado dois sensores, mas pode ser somente um ou vários outros, basta duplicar ou excluir os trechos de códigos necessários. 

Código: 
#include <OneWire.h>
#include <DallasTemperature.h>

// Declarando pino de entrada do sinal do sensor
#define sinal_sensor 2

// Iniciando instancia OneWire para comunicado com o dispositivo
OneWire oneWire(sinal_sensor);

// Referencia
DallasTemperature sensors(&oneWire);

// Indereço de cada sensor DS18B20
DeviceAddress sensor01 = { 0x28, 0x8A, 0xB1, 0x40, 0x04, 0x00, 0x00, 0xC7 }; 
DeviceAddress sensor02 = { 0x28, 0xCC, 0x92, 0x40, 0x04, 0x00, 0x00, 0xB6 };

void setup()   
{
  // inicializando porta serial
  Serial.begin(9600);
  
  sensors.begin();
  
  // Setando a resolução para 10 bit (Mas pode ir de 9 a 12)
  sensors.setResolution(sensor01, 10);
  sensors.setResolution(sensor02, 10);
}

void loop()   
{
  delay(1000);
  Serial.println();
  Serial.print("Numero de sensores = ");  
  Serial.println(sensors.getDeviceCount());   
  Serial.print("Calculando a temperatura... ");  
  Serial.println();   
  
  // Chamando todos os sensores a forncer a temperatura 
  sensors.requestTemperatures();  
  
  Serial.print("A temperatura no sensor 01:   ");
  printTemperature(sensor01);
  Serial.println();

  Serial.print("A temperatura no sensor 02:   ");
  printTemperature(sensor02);
  Serial.println();
  
}

void printTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);

   if (tempC == -127.00) 
   {
   Serial.print(" Erro ao calcular temperatura  ");
   } 
   else
   {
   Serial.print("C: ");
   Serial.print(tempC);
   }
}


Viu como é simples o uso deste sensor! Releia todo o código e a biblioteca para aumentar seu conhecimento. Estude formas de melhorar a ligação destes sensores no Arduino.

Confira também: Medir temperatura com sensor infravermelho MLX90614 e Arduino.

É isso galera! Venha fazer parte da maior página de Engenharia Elétrica e Eletrônica no facebook. Até a próxima!
Sobre: Fellipe Bastos (Catrak)

Fellipe Bastos: Mineiro, graduado em Ciência e Tecnologia, programador C/C++ e Engenheiro Eletricista em formação. Tem interesse pelas áreas da robótica, eletrônica de potência, sistemas de controle e afins.

Confira também:

0 comentários: