Medidor de temperatura usando display OLED e um DS18B20 com um Arduino

Tempo de leitura: 5 minutes

Medidor de temperatura usando display OLED e um DS18B20 com um Arduino

Neste artigo, aprenderemos como fazer a interface do sensor de temperatura DS18B20 com display OLED e Arduino. Simplesmente faremos a interface do sensor de temperatura DS18B20 Dallas com o Arduino e exibiremos o valor da temperatura em um display OLED de 128×64.

O sensor de temperatura DS18B20 é um sensor de temperatura digital de 1 fio. Isso vem com um pacote selado que permite medir com precisão as temperaturas em ambientes úmidos com uma interface simples de 1 fio. Ele se comunica em um barramento comum. Isso significa que ele pode conectar vários dispositivos e ler seus valores usando apenas um pino digital do Arduino.

 

Lista de Materiais

Os componentes necessários para fazer o medidor digital de temperatura são os seguintes. Todos esses componentes podem ser adquiridos facilmente no Brasil

Nome dos ComponentesDescriçãoQuantidade
1Placa ArduinoArduino Nano1
2Sensor DS18B20DS18B20 Sensor de temperatura à prova d’água1
4Display OLEDTela I2C OLED de 0,96″1
5Resistor4.7K1
6Fios de conexãoJumper Wires10
7ProtoBoard1

 

 

DS18B20 Sensor de temperatura digital à prova d’água:

Esta é uma versão pré-cabeada e à prova d’água do sensor DS18B20. Útil para quando você precisa medir algo longe ou em condições úmidas. O sensor pode medir a temperatura entre -55 a 125°C (-67°F a + 257°F). O cabo é revestido em PVC.

Por ser digital, não há degradação do sinal mesmo em longas distâncias. Esses sensores de temperatura digitais de 1 fio são bastante precisos, ou seja, ± 0,5°C em grande parte da faixa. Ele pode fornecer até 12 bits de precisão do conversor digital para analógico integrado. Eles funcionam muito bem com qualquer microcontrolador usando um único pino digital.

A única desvantagem é que eles usam o protocolo Dallas 1-Wire, que é um tanto complexo e requer muitos códigos para analisar a comunicação. Lançamos um resistor de 4,7k, que é necessário como um pullup de DATA para a linha VCC ao usar o sensor.

 

Diagrama de circuito e conexões

Conecte o pino VDD do DS18B20 a 5V e o pino GND ao aterramento. Conecte seu pino de dados ao pino analógico A0 do Arduino. Entre o pino de dados e o VDD, conecte o resistor de 4.7K.

Conecte o display OLED SSD1306 de 0,96″ aos pinos I2C do Arduino, conforme mostrado na figura acima.

 

Código Fonte/Programa

O código-fonte para fazer a interface do Display OLED e do Sensor DS18B20 com o Arduino é fornecido abaixo. Precisamos adicionar as 2 bibliotecas a seguir:

  1. SSD1306 OLED driver
  2. OLED GFX Library

 

#include <Adafruit_GFX.h> // inclui biblioteca de gráficos Adafruit
#include <Adafruit_SSD1306.h> // inclui driver de exibição OLED Adafruit SSD1306
 
#define OLED_RESET 4 // define display reset pin
Adafruit_SSD1306 display(OLED_RESET);
 
#define DS18B20_PIN A0 // define a conexão do pino de dados DS18B20
 
void setup(void)
{
   delay(1000); // espere um segundo
 
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa o display OLED SSD1306 com endereço I2C 0x3C
   display.clearDisplay(); // limpa o buffer de exibição.
 
   display.setTextSize(2);
   display.setTextColor(WHITE, BLACK);
   display.setCursor(34, 5);
   display.print("CAPSISTEMA");
 
   display.setTextSize(1);
   display.setTextColor(WHITE, BLACK);
   display.setCursor(29, 33);
   display.print("Temperatura:");
   display.display();
   display.setTextSize(2);
}
 
unsigned int ds18b20_temp;
char _buffer[11];
 
void loop()
{
   display.setCursor(1, 50);
 
   if(ds18b20_read(&ds18b20_temp))
   {
      if (ds18b20_temp & 0x8000) // se a temperatura <0
      {
          ds18b20_temp = ~ds18b20_temp + 1; // altera o valor da temperatura para a forma positiva
          sprintf(_buffer, "-%02u.%04u C", (ds18b20_temp/16) % 100, (ds18b20_temp & 0x0F) * 625);
      } else { // caso contrário (temperatura> = 0)
        if (ds18b20_temp/16 > 100) // se a temperatura> = 100 ° C
           sprintf(_buffer, "%03u.%04u C", ds18b20_temp/16, (ds18b20_temp & 0x0F) * 625);
        else // caso contrário (0 <= temperatura <100)
           sprintf(_buffer, " %02u.%04u C", ds18b20_temp/16, (ds18b20_temp & 0x0F) * 625);
      }
 
      display.print(_buffer);
      display.drawCircle(103, 52, 2, WHITE); // colocar símbolo de grau ( ° )
 
   } else
     display.print(" ERROR ");
   
   display.display();
   delay(1000); // espere um segundo
}
 
bool ds18b20_start()
{
   bool ret = 0;
   digitalWrite(DS18B20_PIN, LOW); // envia pulso de redefinição para o sensor DS18B20
   pinMode(DS18B20_PIN, OUTPUT);
   delayMicroseconds(500); // espere 500 nós
   pinMode(DS18B20_PIN, INPUT);
   delayMicroseconds(100); // aguarde para ler a resposta do sensor DS18B20
   if (!digitalRead(DS18B20_PIN))
   {
      ret = 1; // Sensor DS18B20 está presente
      delayMicroseconds(400); // wait 400 us
   }
   return(ret);
}
 
void ds18b20_write_bit(bool value)
{
   digitalWrite(DS18B20_PIN, LOW);
   pinMode(DS18B20_PIN, OUTPUT);
   delayMicroseconds(2);
   digitalWrite(DS18B20_PIN, value);
   delayMicroseconds(80);
   pinMode(DS18B20_PIN, INPUT);
   delayMicroseconds(2);
}
 
void ds18b20_write_byte(byte value)
{
   byte i;
   for(i = 0; i < 8; i++)
      ds18b20_write_bit(bitRead(value, i));
}
 
bool ds18b20_read_bit(void)
{
   bool value;
   digitalWrite(DS18B20_PIN, LOW);    
   pinMode(DS18B20_PIN, OUTPUT);
   delayMicroseconds(2);
   pinMode(DS18B20_PIN, INPUT);
   delayMicroseconds(5);
   value = digitalRead(DS18B20_PIN);
   delayMicroseconds(100);
   return value;
}
 
byte ds18b20_read_byte(void)
{
   byte i, value;
   for(i = 0; i < 8; i++)
      bitWrite(value, i, ds18b20_read_bit());
   return value;
}
 
bool ds18b20_read(int *raw_temp_value)
{
   if (!ds18b20_start()) // enviar pulso inicial
   return(0);
   ds18b20_write_byte(0xCC); // enviar comando pular ROM
   ds18b20_write_byte(0x44); // enviar comando de conversão de início
   while(ds18b20_read_byte() == 0); // aguarde a conclusão da conversão
   if (!ds18b20_start()) // enviar pulso inicial
       return(0); // retorna 0 se houver erro
  
   ds18b20_write_byte(0xCC); // enviar comando pular ROM
   ds18b20_write_byte(0xBE); // enviar comando de leitura
 
   *raw_temp_value = ds18b20_read_byte(); // lê o byte LSB de temperatura e armazena-o no byte LSB raw_temp_value
   *raw_temp_value |= (unsigned int)(ds18b20_read_byte() << 8); // lê o byte MSB de temperatura e armazena-o no byte MSB raw_temp_value
 
   return(1);
}

Demonstração do Projeto

Sketch Original do Teste, traduzi para melhor entendimento.

 

O código do Arduino abaixo não usa nenhuma biblioteca para o sensor DS18B20. O pino analógico é usado para medir a temperatura.

  1. bool ds18b20_start (): verifica se o sensor DS18B20 está conectado corretamente ao circuito ou não e retorna 1 se estiver OK e 0 se houver erro.
  2. ds18b20_write_bit (valor bool): grava um único bit no sensor DS18B20, que pode ser 1 ou 0.
  3. ds18b20_write_byte (valor de byte): grava 1 byte (8 bits) para o sensor DS18B20.
  4. bool ds18b20_read_bit (void): lê 1 bit do sensor DS18B20, retorna o valor lido (1 ou 0).
  5. byte ds18b20_read_byte (void): lê 1 byte do sensor DS18B20, com base no valor anterior.
  6. bool ds18b20_read (int * raw_temp_value): lê os dados brutos de temperatura que têm 16 bits (dois registros de 8 bits), os dados são armazenados na variável raw_temp_value, retorna 1 se estiver OK e 0 se houver erro.

 

Conclusão

Neste artigo, mostrei como usar um Sensor DS18B20 à prova d’água com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esse Sensor DS18B20 à prova d’água. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.