Início
/
Projetos Arduino
/
Projetos Squids
/
Básico
/
Projeto 86 - Como identificar o endereço serial de sensores DS18B20 em projetos com Arduino
Projeto 86 - Como identificar o endereço serial de sensores DS18B20 em projetos com Arduino
Angelo Luis Ferreira | 02/07/2020
Acessos: 4.578
Básico - Projeto 86
Trabalhando com vários sensores DS18B20 identificados por serial
Objetivo
Montar um sistema com vários sensores de temperatura DS18B20 conectados em um único pino do Arduino através da comunicação OneWire, onde utilizaremos o código serial exclusivo de cada sensor identificá-los. Este projeto tem a mesma funcionalidade do projeto anterior, ou seja, simular uma casa onde temos 3 sensores distribuídos nos seguintes locais: 1 sensor na Sala, 1 sensor no Quarto e um sensor blindado para medir a temperatura da água na piscina. Os valores são exibidos em graus Celsius em um display de LCD.
Observações:
1) Utilizamos sensores DS18B20 com encapsulamento TO-92 e a prova d'água como controle de temperatura.
2) Este projeto foi desenvolvido para um display LCD com controlador HD44780 em conjunto com o módulo serial I2C (soldado ou não).
3) Se você não possui um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador. Veja como montar o display no projeto Projeto 38 - Controlando um display LCD (instalação e comandos básicos).
Definições
Sensor DS18B20 - O DS18B20 é um sensor de temperatura capaz de efetuar leituras entre -55ºC e 125ºC com precisão de até ±0,5 ºC. Cada sensor possui um endereço físico, possibilitando que se utilize vários sensores em uma única porta do microcontrolador e mesmo assim, efetuar a leitura individualmente. Ele portanto, pode ler a temperatura, interpreta-la e enviar a informação do valor de temperatura em graus Celsius para o microcontrolador usando um barramento de apenas um fio (protocolo de comunicação OneWire ou 1-wire). Em geral, os sensores de temperatura trabalham de forma diferente, pois a maioria deles são analógicos e fornecem um valor de tensão ou de corrente que precisa ser interpretado pelo microcontrolador.
Endereço fixo e exclusivo
Cada sensor de temperatura DS18B20 possui um endereço serial de 64 bits próprio, possibilitando a montagem com vários sensores em uma única porta digital do microcontrolador e obter valores de temperatura para cada sensor separadamente.
Sistema de comunicação OneWire
O sistema de comunicação Onewire que mostraremos nesse tutorial somente poderá ser utilizado com os sensores DS18B20, pois cada cada componente possui um código exclusivo de 64bits configurado de fábrica que permitirá que o Arduino diferencie um sensor do outro individualmente.
A utilização desse sistema de comunicação aumenta consideravelmente a utilização e desenvolvimento de projetos, pois ao utilizarmos apenas um pino do Arduino poderemos utilizar diversos sensores distribuídos em grandes áreas ou mesmo para medição de temperatura de vários equipamentos ou processos.
Encapsulamento
a) O sensor de temperatura DS18B20 é fornecido com o encapsulamento TO-92, o mesmo utilizado no sensor LM35.
b) O sensor DS18B20 também é produzido com proteção à prova de água (cápsula metálica) com fios. São muito comuns no controle de temperatura de aquários, piscinas e banheiras aquecidas.
Outros Recursos
Estes recursos não serão utilizados nesse tutorial:
a) Modo parasita: pode ser utilizado apenas 2 terminais para ligar o sensor.
b) Alarme programável de temperatura alta e baixa.
c) Resolução configurável para 9, 10, 11 ou 12 bits
Sensores de temperatura são dispositivos que identificam a temperatura de um determinado equipamento, processo ou do próprio ambiente, podendo ser utilizados no monitoramento e controle para que se mantenham as condições adequadas de funcionamento e/ou conforto térmico. Veja abaixo altguns tutoriais que apresentamos medições de temperatura com diferentes sensores:
Projeto 39 - Display LCD como mostrador de temperatura (sensor LM35)
Projeto 40 - Sensor de temperatura e umidade DHT11 com display LCD
Projeto 41 - Usando o sensor de temperatura termistor NTC 10K com LCD
Projeto 51 - Relógio digital com temperatura - RTC DS3231 Arduino
Projeto 83 - Termômetro digital com sensor DS18B20 e Arduino
Projeto 84 - Controle de temperatura em baixo d'água - sensor DS18B20 e Arduino
Projeto 85 - Como conectar vários sensores DS18B20 em uma única porta do Arduino
Aplicação
Para fins didáticos e projetos onde é necessária a medição de temperatura do ambiente e monitoramento de máquinas, equipamento, processos e sistemas de controle.
Componentes necessários
Referência
|
Componente
|
Quantidade
|
Imagem
|
Observação
|
Protoboard |
Protoboard 830 pontos |
1 |
|
No mínimo utilizar protoboard com 830 pontos
|
Jumpers |
Kit cabos ligação macho / macho |
1 |
|
|
Display LCD |
Display LCD 16X2 com pinos soldados
|
1 |
|
LCD que utilize o controlador HD44780 (veja na descrição ou datasheet do componente)
O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)
|
Módulo I2C para display LCD |
Módulo I2C com CI PCF8574
(opcional)
|
1 |
|
O módulo I2C poderá vir separado ou já soldado no display LCD
(datasheet)
Se você não possui um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador.
|
Sensor de Temperatura DS18B20 |
Sensor de Temperatura DS18B20
(encapsulamento TO-92 ou a prova de água)
|
2 |
|
Tensão de operação: 3 a 5,5V
Faixa de medição de temperatura: -55 ºC a +125 ºC
Precisão: +/- 0,5 ºC entre -10 ºC e +85 ºC
(Ponta de aço inoxidável (6 x 50mm), com cabo de 108 cm de comprimento - encapsulamento a prova de água)
(datasheet)
|
Sensor de Temperatura DS18B20 |
Sensor de Temperatura DS18B20
(encapsulamento a prova de água)
|
1 |
|
Tensão de operação: 3 a 5,5V
Faixa de medição de temperatura: -55 ºC a +125 ºC
Precisão: +/- 0,5 ºC entre -10 ºC e +85 ºC
Ponta de aço inoxidável (6 x 50mm), com cabo de 108 cm de comprimento
(datasheet)
|
Resistor |
Resistor
|
1 |
|
1 Resistor de 4,7KΩ a 10KΩ
|
Arduino UNO R3 |
Arduino UNO |
1 |
|
Você poderá utilizar uma placa Arduino UNO original ou similar
|
Montagem do Circuito
Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.
Atenção
1. Neste projeto vamos utilizar um display LCD 16x2 com controlador HD44780, que se adapta aos mais diversos projetos com vários modelos de placas e microcontroladores. Este display possui 16 colunas por 2 linhas com backlight (luz de fundo) verde, azul ou vermelha e tem 16 pinos para a conexão. Atenção: Utilize um display LCD com os pinos soldados.
2. Para a montagem do display com adaptador, entenda a estrutura do módulo I2C para display LCD 16x2 / 20X4:
2.1. Na lateral do adaptador encontramos 4 pinos, sendo: 2 pinos para alimentação (Vcc e GND) e 2 pinos para conexão com a interface I2C (SDA e SCL) que deverão estar conectados nos pinos analógicos A4 (SDA) e A5 (SCL) do Arduino Uno ou nos pinos A20 (SDA) e A21 (SCL) do Arduino Mega 2560. Veja a tabela abaixo com onde temos as principais placas Arduino e suas conexões com o I2C.
2.2. Para controlar o contraste do display, utilize o potenciômetro de ajuste de contraste. O jumper lateral, quando utilizado, permite que a luz do fundo (backlight) seja controlada pelo programa ou permaneça apagada.
2.3. A seleção de endereço do adaptador I2C para display LCD, na maioria dos módulos fornecidos no mercado já vêm configurados com o com o endereço 0x27. Se você não sabe qual endereço que o seu módulo I2C e/ou módulo RTC DS3231 está configurado, baixe o seguinte "sketch":
DOWNLOAD - I2C_scanner.ino
2.3.1 Após instalar e rodar o sketch acima, abra o monitor serial que mostrará qual é o endereço que o seu módulo I2C está configurado:
2.3.1.1 Nos casos em que módulo I2C estiver configurado com uma faixa de endereços diferente do endereço 0X27 altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto.
2.5. Para saber mais sobre a montagem e utilização de display LCD com módulo I2C leia: Projeto 48 - Como controlar um display LCD com o módulo I2C.
3. Monte o botão (push button) sem o resistor, pois através da programação vamos habilitar o resistor pull-up interno do arduino. Desta forma, quando o botão estiver pressionado, o Arduino retornará "LOW" ou "0". Para saber mais sobre botões,assista o vídeo Arduino: Botão e Resistor de Pull Up Interno ou leia os artigos: Projeto 04a - Push Button como interruptor - liga e desliga (padrão para pull-down ou pull-up) e Como usar push button com Arduino (programação).
4. Para fazer a conexão do sensor DS18B20 é preciso observar a posição dos seus terminais conforme imagem abaixo:
4.1. A conexão para utilização deste sensor é bastante simples, comece conectando o VCC e o GND dos sensores de temperatura nas linhas de 5V e GND do protoboard. Em seguida, conecte o Sinal do sensor ao pino digital do Arduino (no nosso projeto utilizamos o pino 2). Também será necessário incluir um resistor de 4,7K a 10K entre o sinal e o pino de energia manter a transferência de dados estável. Veja o esquema para ligação três sensores de temperatura DS18B20:
5. A montagem do nosso projeto foi realizada em um protoboard com linhas de alimentação contínuas. Verifique se o seu protoboard possui linhas de alimentação contínuas ou separadas.
Incluindo as bibliotecas do Sensor de Temperatura DS18B20
O protocolo de comunicação One-Wire utilizado pela empresa Dallas, fabricante do sensor de temperatura DS18B20, é muito complexo e necessita de grande quantidade de variáveis para funcionar. Para facilitar o desenvolvimento de projetos foi criada a biblioteca DallasTemperature.h. Para baixar a biblioteca clique no botão abaixo:
DOWNLOAD - DallasTemperatura.zip
Para saber detalhes desta biblioteca clique aqui.
Também é necessária a instalação da biblioteca auxiliar OneWire.h, responsável para assegurar a comunicação do sensor DS18B20 em um único fio. Para baixar esta biblioteca clique no botão abaixo:
DOWNLOAD - OneWire.zip
Para saber detalhes desta biblioteca clique aqui.
Instalando as bibliotecas pelo IDE do Arduino
Após fazer o download dos arquivos DallasTemperature.h e OneWire.h com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.
Obs.: Para acessarmos uma biblioteca embutida na IDE do Arduino, assim como, para acessarmos um biblioteca local através de um header file, utilizaremos a diretiva #include.
Localizando e reconhecendo os sensores instalados
Utilizando as bibliotecas DallasTemperature.h e OneWire.h para localizar os sensores instalados
Após incluirmos as bibliotecas, precisamos instanciar as classes OneWire e DallasTemperature, conforme exemplo abaixo:
OneWire oneWire(2);
DallasTemperature sensor(&oneWire);
Denominamos "oneWire" como objeto da classe OneWire e "sensor" como objeto da classe DallasTemperature, onde passamos o parâmetro oneWire como referência. Utilizamos o pino 2 do Arduino para fazer a conexão.
Dentro da estrutura setup(void), acionamos o método begin() e atribuímos à variável ndispositivos o número de sensores encontrados através do método getDeviceCount. Nesse projeto, se a montagem do circuito estiver correta, devemos receber 3 dispositivos encontrados.
void setup(void) {
sensor.begin();
ndispositivos = sensor.getDeviceCount();
}
Finalmente acionamos o método requestTermpertures() e assim podemos realizar as leituras de temperatura do sensor em ºC. Veja o exemplo abaixo:
barramento.requestTemperatures();
float temperatura = barramento.getTempC(sensor);
Observação: Para fazer a leitura em Fahrenheit altere o método getTempC para getTempF.
Testando a conexão e bibliotecas do sensor
Com o circuito já montado e as bibliotecas instaladas, faça o teste para verificar se a conexão do sensor DS8B20 está correta. Faça o upload do código abaixo no IDE do Arduino e verifique se o sensor irá fazer as leituras da temperatura ambiente:
/*
* Localizando sensores DS18B20
*/
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2);
DallasTemperature sensor(&oneWire);
int ndispositivos = 0;
float tempC;
void setup() {
sensor.begin();
Serial.begin(9600);
Serial.println("Localizando Dispositivos ...");
Serial.print("Encontrados ");
ndispositivos = sensor.getDeviceCount();
Serial.print(ndispositivos, DEC);
Serial.println(" dispositivos.");
Serial.println("");
}
void loop() {
sensor.requestTemperatures();
for (int i = 0; i < ndispositivos; i++) {
Serial.print("Sensor ");
Serial.print(i+1);
Serial.print(": ");
tempC = sensor.getTempCByIndex(i);
Serial.print(tempC);
Serial.println("ºC");
}
Serial.println("");
delay(1000);
}
O resultado deve ficar parecido com a imagem a seguir:
Identificando cada sensor
Nosso objetivo é simular o controle de temperatura em 3 ambientes: sala, quarto e piscina. Para isso, vamos definir cada sensor da seguinte forma:
Agora precisamos identificar quem são os sensores: sensor 1, sensor 2 e sensor 3 localizados pelo software.
Para isso será necessário o teste de variação de temperatura para distinguirmos cada sensor. Vamos começar com o sensor da sala. Toque o sensor para promover um aumento de temperatura (nossa temperatura corporal é de 36º aproximadamente) e verifique qual sensor obteve este aumento. Veja o nosso exemplo abaixo:
No exemplo, podemos observar que o Sensor 2 demonstrou um aumento significativo na temperatura. Portanto, podemos concluir que o Sensor 2 é o sensor da sala. Repita este procedimento nos outros sensores também para identificá-los.
No nosso exemplo, obtivemos as seguintes identificações:
Sensor 1 |
Quarto |
Sensor 2 |
Sala |
Sensor 3 |
Piscina |
Leitura do código serial de cada sensor
Nessa próxima etapa vamos obter o código serial exclusivo de cada sensor. Assim, podemos definir cada sensor individualmente. Para isso, vamos utilizar o método getAddress(). Faça o upload do código abaixo no IDE para identificar o código serial de cada sensor instalado:
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2);
DallasTemperature bus(&oneWire);
DeviceAddress sensor; // le endereço do sensor
int ndispositivos = 0;
void setup() {
bus.begin();
Serial.begin(9600);
Serial.println("Localizando Dispositivos ...");
Serial.print("Encontrados ");
ndispositivos = bus.getDeviceCount(); // detecta e conta o número de sensores
Serial.print(ndispositivos, DEC);
Serial.println(" dispositivos.");
Serial.println("");
Serial.println("Imprimindo Endereco");
for (int i = 0; i < ndispositivos; i++) {
Serial.print("Sensor ");
Serial.print(i+1);
Serial.print(": ");
bus.getAddress(sensor, i);
serialCode(sensor);
}
}
void loop() {}
void serialCode(DeviceAddress address) {
for (uint8_t i = 0; i < 8; i++) {
Serial.print("0x");
if (address[i] < 0x10) Serial.print("0");
Serial.print(address[i], HEX);
if (i < 7) Serial.print(", ");
}
Serial.println("");
}
Veja o resultado abaixo com a leitura dos sensores utilizados no projeto:
Atenção: Os endereços são exclusivos para os sensores que utilizados no projeto. Portanto, cada sensor terá um endereço único e deverá ser identificado através deste teste.
Com os código seriais em mãos, temos agora a identificação completa dos nossos sensores:
Sensor 1 |
Quarto |
0x28, 0x8A, 0x1B, 0x16, 0xA8, 0x01, 0x3C, 0x0C |
Sensor 2 |
Sala |
0x28, 0xD5, 0xCA, 0x12, 0x0A, 0x00, 0x00, 0xFB |
Sensor 3 |
Piscina |
0x28, 0xFF, 0x0A, 0x79, 0xA2, 0x00, 0x03, 0x95 |
Incluindo biblioteca LiquidCrystal_I2C
Atenção: Caso você opte pela utilização do display de LCD sem o módulo I2C, siga os procedimentos do Projeto 38 - Controlando um display LCD (instalação e comandos básicos) e não instale a biblioteca abaixo.
Para que o módulo I2C funcione corretamente é necessário adicionarmos a biblioteca LiquidCrystal_I2C no IDE do Arduino. Uma das grandes vantagens das placas Arduino é a diversidade de bibliotecas disponíveis que podem ser utilizadas em seus programas. Estas bibliotecas podem ser criadas para a linguagem "C" ou especificamente para o Arduino, reduzindo drasticamente o tempo gasto com programação. Veja a tabela Coletânea de bibliotecas para módulos.
Download dos arquivos da biblioteca LiquidCrystal_I2C
DOWNLOAD - NewliquidCrystal_1.3.4.zip
Para saber detalhes desta biblioteca clique aqui.
Instalando a biblioteca pelo IDE do Arduino
Após fazer o download do arquivo NewliquidCrystal_1.3.4.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.
Utilizando a biblioteca LiquidCrystal_I2C
Para instalação e utilização da biblioteca para o módulo I2C como comunicação para um display LCD siga o tutorial: Projeto 48 - Como controlar um display LCD com o módulo I2C
Comandos do display LCD para a biblioteca LiquidCrystal
No projeto vamos utilizar alguns comandos de controle do display LCD através da biblioteca LiquidCrystal que já vem embutida na IDE do Arduino. Para conhecer todos os comandos desta biblioteca, acesse o link: LiquidCrystal - Comandos display LCD e LiquidCrystal Library (Arduino Reference).
Obs.: Para acessarmos uma biblioteca embutida na IDE do Arduino, assim como, para acessarmos um biblioteca local através de um header file, utilizaremos a diretiva #include.
Código do Projeto (Sketch)
1) Faça o dowload e abra o arquivo projeto86.ino no IDE do Arduino: DOWNLOAD - projeto86.ino
Obs. 1: Nos casos em que módulo I2C estiver configurado com um endereço diferente do endereço 0X27, altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto. - Veja o tutorial Projeto 48 - Como controlar um display LCD com o módulo I2C
Obs. 2: Se estiver utilizando um display de LCD 20 X 4, altere o comando da linha 36 para lcd.begin (20,4);
Obs.3: Se não possuir o módulo I2C utilize apenas o display LCD conforme Projeto 38 - Controlando um display LCD (instalação e comandos básicos)
Obs.4: Atenção: Altere os valores do endereço do sensores de acordo como os valores identificados no seu projeto. O endereço do sensor DS18B20 é exclusivo e único para cada sensor. Para identificar os sensores, faça o teste como mostramos anteriormente neste tutorial.
Ou se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* Projeto 86: Identificando sensores DS18B20
* Autor: Angelo Luis Ferreira
* Data: 03/07/2020
* http://squids.com.br/arduino
*
*******************************************************************************/
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
// define a conexão do terminal de sinal do DS18B20 e o botão com o Arduino
const byte sensorPin = 2;
const byte botPin = 10;
// define o estado do botão
byte menu = 0;
// declara a variável que receberá o número de sensores conectados
byte nSensores = 0;
// instancia a classe OneWire da biblioteca "OneWire.h" com o nome "pin"
OneWire oneWire(sensorPin);
// instancia a classe DallasTemperatura da biblioteca DallasTemperature.h com o nome "bus"
DallasTemperature bus(&oneWire);
// Endereço dos sensores DS18B20 - ALTERAR DE ACORDO COM OS SENSORES UTILIZADOS NO SEU PROJETO
uint8_t sensorSALA[8] = { 0x28, 0xD5, 0xCA, 0x12, 0x0A, 0x00, 0x00, 0xFB };
uint8_t sensorQUARTO[8] = { 0x28, 0x8A, 0x1B, 0x16, 0xA8, 0x01, 0x3C, 0x0C };
uint8_t sensorPISCINA[8] = { 0x28, 0xFF, 0x0A, 0x79, 0xA2, 0x00, 0x03, 0x95 };
// Inicializa o LCD com o módulo I2C
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
void setup() {
bus.begin(); // inicializa o objeto sensor
Serial.begin(9600);// inicia monitor serial
lcd.begin(16, 2); // inicia lcd
pinMode(botPin, INPUT_PULLUP); // define botão como pullup interno do Arduino
lcd.clear(); // limpa o disply
nSensores = bus.getDeviceCount(); // obtem o número de sensores conectados
DeviceAddress sensorSALA;
DeviceAddress sensorQUARTO;
DeviceAddress sensorPISCINA;
}
void loop() {
// faz leitura do sensor
bus.requestTemperatures(); // permite a leitura dos sensores
// verifica se o botão foi pressionado para mudar de local
if (!digitalRead(botPin)) {
menu++;
if(menu>nSensores) menu=0;
lcd.clear();
exibir();
while(!digitalRead(botPin)) {};
delay(50);
} else exibir(); //exibir temperaturas
}
void exibir() {
/*
* Sensor 1 Quarto 0x28, 0x8A, 0x1B, 0x16, 0xA8, 0x01, 0x3C, 0x0C
* Sensor 2 Sala 0x28, 0xD5, 0xCA, 0x12, 0x0A, 0x00, 0x00, 0xFB
* Sensor 3 Piscina 0x28, 0xFF, 0x0A, 0x79, 0xA2, 0x00, 0x03, 0x95
*
*/
switch(menu) {
case 0:
lcd.setCursor(0,0);
lcd.print("Controle Squids");
lcd.setCursor(0,1);
lcd.print("N. Sensores = ");
lcd.print(nSensores);
break;
case 1:
lcd.setCursor(0,0);
lcd.print("SALA");
lcd.setCursor(0,1);
lcd.print("Temp.: ");
lcd.print(bus.getTempC(sensorSALA));
lcd.write(B11011111);
lcd.print("C");
break;
case 2:
lcd.setCursor(0,0);
lcd.print("QUARTO");
lcd.setCursor(0,1);
lcd.print("Temp.: ");
lcd.print(bus.getTempC(sensorQUARTO));
lcd.write(B11011111);
lcd.print("C");
break;
case 3:
lcd.setCursor(0,0);
lcd.print("PISCINA");
lcd.setCursor(0,1);
lcd.print("Temp.: ");
lcd.print(bus.getTempC(sensorPISCINA));
lcd.write(B11011111);
lcd.print("C");
break;
}
}
Vídeo
Como o projeto deve funcionar
1. Ao executar o programa, será exibida a tela inicial, indicando o número de sensores localizados no projeto.
2. Pressione o botão e espere até que seja exibido um local de controle de temperatura.
3. Solte o botão para obter as temperaturas atualizadas do local onde está instalado o sensor.
4. Para alterar o local de leitura do sensor pressione novamente o botão.
4. Repita esta operação até voltar para a tela inicial novamente.
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários