Sensores ambientais são de grande importância em aplicações embarcadas. Muitos sensores de temperatura medem a temperatura ambiente ou a temperatura de uma superfície. Para medir a temperatura da água e outros fluidos, são necessários sensores de temperatura à prova d'água. Um desses sensores de temperatura é o DS18B20. Este sensor pode medir a temperatura do ar, de líquidos como a água e do solo. O sensor vem em dois formatos, um dos quais é um módulo à prova d'água. Ele pode ser usado para detectar a temperatura em aplicações como fogões elétricos a vapor, chaleiras elétricas e armazenamento de água com temperatura controlada.
Neste projeto, demonstramos o funcionamento do DS18B20 fazendo interface com o Arduino. O sensor não requer nenhum componente externo para interagir com um controlador/computador. Ele usa uma interface de fio único para comunicação de dados bidirecional com um controlador que torna sua interface descomplicada. O sensor vem em um pacote TO-92. Ele está disponível em dois formatos – em um, vem em um pacote simples semelhante a um transistor e, no outro, é encerrado em uma sonda à prova d'água.
Para uma demonstração em uma placa de ensaio, estamos usando o fator de forma semelhante ao transistor neste projeto. As leituras de temperatura do sensor são lidas pelo Arduino, que são exibidas no display OLED SSD1306.
Componentes necessários
- Arduino UNO x1
- Sensor de temperatura de 1 fio DS18B20 x1
- Tela OLED SSD1306 x1
- Resistor 4,7K x1
- Tábua de ensaio
- Conectando fios/fios de jumper
Sensor de temperatura DS18B20 de 1 fio
DS18B20 é um termômetro digital de 1 fio da Dallas Semiconductor Corp. Ele é baseado em uma interface de 1 fio que requer apenas um pino para conexões de circuito. O sensor possui um código serial exclusivo de 64 bits para endereçar uma interface de 1 fio. Possui capacidade multidrop, permitindo a interface de muitos sensores DS18B20 em uma única linha de dados como uma rede distribuída. É ainda possível alimentar o sensor a partir da própria linha de dados.
O sensor produz uma medição de temperatura com escalas de resolução de 9 a 12 bits. A faixa de temperatura operacional do DS18B20 é de -55˚C a 125˚C com uma precisão de +/-0,5˚C. A resolução padrão do sensor é de 12 bits, o que permite medir a temperatura com uma precisão de 0,0625˚C. Este sensor de temperatura leva menos de 750 ms para converter uma leitura. Portanto, é facilmente possível buscar medições de temperatura em intervalos de 1 segundo na rede de sensores.
A tensão operacional do DS18B20 é de 3,3 ~ 5V e o consumo de corrente é de cerca de 1mA. Portanto, ele pode ser facilmente conectado a qualquer microcontrolador ou microcomputador, desde que uma biblioteca de software para interface de 1 fio esteja disponível para essa plataforma. Com um consumo mínimo de corrente e uma interface simples de 1 fio, é até possível fazer a interface do DS18B20 com microcomputadores de baixo consumo de energia, como o Raspberry Pi.
DS18B20 possui o seguinte diagrama de pinos:
Na versão à prova d'água do sensor, os pinos são identificados por código de cores. As linhas GND, Dados e VDD são identificadas pelos fios preto, amarelo e vermelho. Deve-se notar que também existem alguns modelos chineses do sensor disponíveis. Nestes modelos a configuração dos pinos é invertida, ou seja, na vista frontal o pino esquerdo é VDD, depois Data e o pino mais à direita é GND.
Conexões de circuito
Neste projeto, conectamos um OLED DS18B20 e SSD1306 com Arduino UNO. Para fazer a interface do DS18B20, conecte os pinos GND e VDD do sensor ao aterramento e aos pinos de saída de 5V do Arduino, respectivamente. O pino de dados do sensor pode ser conectado a qualquer GPIO. Neste projeto, o pino de dados está conectado ao D2 do Arduino. Para estabilizar a linha de dados, recomenda-se um resistor pull-up de 4,7K para comunicação entre o pino de dados e o pino de alimentação. Os resistores pull-up integrados do Arduino são insuficientes para implementar um protocolo de 1 fio. Se um resistor externo não estiver conectado durante a interface com o Arduino, a placa poderá não ler corretamente o sensor. Também é importante garantir as conexões corretas para alimentação de tensão. Uma tensão reversa aplicada ao sensor pode facilmente aquecê-lo até a ruptura permanente.
O display OLED está conectado para mostrar leituras de temperatura. O SSD1306 faz interface com o Arduino usando a porta SPI física do Arduino. Para fazer a interface do SSD1306 OLED via porta SPI física, conecte os pinos D0/SCK e D1/MOSI do SSD1306 OLED aos pinos D13 e D11 do Arduino, respectivamente. Conecte os pinos DC, RESET e CS do SSD1306 aos pinos D9, D10 e D8 do Arduino, respectivamente.
Bibliotecas Arduino para DS18B20
Em primeiro lugar, para trabalhar com DS18B20, é necessária uma biblioteca de fios. Ele pode ser encontrado no gerenciador de biblioteca do Arduino IDE. Também pode ser baixado manualmente como ZIP neste link. A biblioteca one-wire serve para gerenciar a comunicação de dados em uma interface de 1 fio. A outra biblioteca necessária para DS18B20 é uma biblioteca específica de hardware para implementar o protocolo Dallas 1-wire. Ele pode ser encontrado no gerenciador de bibliotecas como DallasTemperature ou baixado como um arquivo ZIP neste link.
Esboço do Arduino
Como funciona
O sensor possui seu protocolo de 1 fio específico de hardware, implementado pela biblioteca Dallas Temperature. O Arduino se comunica com o DS18B20 através do protocolo de 1 fio. O protocolo pode ser implementado em qualquer GPIO. O Arduino lê a temperatura do sensor detectando os sinais específicos do protocolo em seu pino de dados e armazenando o valor em uma variável. A medição de temperatura lida é então exibida no SSD1306 OLED.
Guia de programação
O esboço começa importando as bibliotecas OneWire e DallasTemperature para trabalhar com o sensor de temperatura DS18B20. Em seguida, as bibliotecas SPI, Wire, Adafruit_GFX e Adafruit_SSD1306 são importadas para trabalhar com display OLED. Uma constante é definida para indicar a linha de dados do sensor de temperatura. Um objeto da classe OneWire é instanciado e o mesmo objeto é usado para instanciar um objeto da classe DallasTemperature. As constantes para resolução da tela e conexões de pinos do display OLED são definidas. Um objeto da classe Adafruit_SSD1306 é instanciado com SPI especificado explicitamente como protocolo de interface. Uma variável global 'temp' é declarada para armazenar valores de temperatura. Um bitmap é armazenado no PROGMEM para o log do site e um array é definido para o mesmo.
Na função setup , o DS18B20 é inicializado chamando o método sensors.begin . A taxa de transmissão para comunicação de dados é de 9600 bps chamando o método Serial.begin . O display OLED é inicializado chamando o método display.begin , e o logotipo do site é exibido na tela OLED chamando o método display.drawBitmap .
Na função loop , a leitura da temperatura do DS18B20 é feita chamando o método Sensors.requestTemperatures e o valor buscado é acessado em uma variável através do método Sensors.getTempCByIndex(0). A medição de temperatura lida é transferida para a porta serial e exibida no display OLED.
Resultado
Vídeo de demonstração