Medidor de temperatura usando display OLED e um DS18B20 com um Arduino
Conteudo
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 Componentes | Descrição | Quantidade | |
---|---|---|---|
1 | Placa Arduino | Arduino Nano | 1 |
2 | Sensor DS18B20 | DS18B20 Sensor de temperatura à prova d’água | 1 |
4 | Display OLED | Tela I2C OLED de 0,96″ | 1 |
5 | Resistor | 4.7K | 1 |
6 | Fios de conexão | Jumper Wires | 10 |
7 | ProtoBoard | – | 1 |
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:
#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
O código do Arduino abaixo não usa nenhuma biblioteca para o sensor DS18B20. O pino analógico é usado para medir a temperatura.
- 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.
- ds18b20_write_bit (valor bool): grava um único bit no sensor DS18B20, que pode ser 1 ou 0.
- ds18b20_write_byte (valor de byte): grava 1 byte (8 bits) para o sensor DS18B20.
- bool ds18b20_read_bit (void): lê 1 bit do sensor DS18B20, retorna o valor lido (1 ou 0).
- byte ds18b20_read_byte (void): lê 1 byte do sensor DS18B20, com base no valor anterior.
- 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.