Projeto 84 - Controle de temperatura em baixo d'água - sensor DS18B20 e Arduino

Básico - Projeto 84

Controlando temperatura em baixo d'água - DS18B20 com display

Objetivo

Neste projeto vamos demonstrar como controlar as temperaturas em um reservatório com água utilizando o sensor de temperatura DS18B20 com cápsula blindada a prova de água. Controlado pelo Arduino, vamos simular um reservatório para manter a temperatura entre 18ºC e 22ºC. Ao atingir os valores máximo ou mínimo um alarme de som é disparado, o que poderia ser substituído por um sistema liga e desliga de uma resistência para aquecer um aqúario, por exemplo. Ao clicarmos em botão (push button) o sistema entra no modo silencioso, onde o buzzer é desativado e apenas o led vermelho é acionado. No projeto, os valores da temperatura são exibidos em um display LCD.

Observações:

1) Utilizamos o sensor DS18B20 com cápsula a prova de água como controle de temperatura da água. O sensor DS18B20 à prova d'água é recomendado para situações onde é necessário medir a temperatura em ambientes úmidos. Também existe a possibilidade de ele ficar submerso, já que ele possui um cabo envolto de PVC e uma ponta de aço inox, o que facilita a utilização sem medo de danificá-lo.

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 individual e fixo

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. Veremos na prática este recurso em projetos futuros.

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.

Sensor DS18B20 à prova d'água

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

Aplicação

Para fins didáticos e projetos onde é necessária a medição de temperatura do ambiente e monitoramento piscinas, banheiras e aquários.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

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 DISPLAY LCD 16X2

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 Módulo I2C display LCD Arduino

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 a prova de água)

1

Sensor DS18B20 à prova d'água

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)

Led 5mm Led 5mm 2

1 led vermelho

1 led verde

(Obs.: você poderá utilizar leds de quaisquer cores, de 5 ou 3mm)

Resistor

Resistor

 3

 1 resistor de 4,7KΩ a 10KΩ (sensor)

2 resistores de 150Ω ou superior (leds)

  Push Button Push button 6X6X5mm 1  
Buzzer Buzzer ativo 5V 12mm 1 Utilize um buzzer, um disco piezoelétrico  ou um mini autofalante
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.

DISPLAY LCD 16X2

2. Para a montagem do display com adaptador, entenda a estrutura do módulo I2C para display LCD 16x2 / 20X4:

Módulo I2C - Detalhes

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. Lembre-se que o LED tem polaridade: O terminal maior tem polaridade positiva e o lado do chanfro tem polaridade negativa.

3.1. Portanto, faça a conexão do Arduino no terminal positivo do led (anodo) e o GND no terminal negativo (catodo).

3.2. Para evitar danos ao led é necessário a inclusão de um resistor no circuito. Como o resistor é um limitador da corrente elétrica, ele poderá estar conectado no anodo (terminal maior) ou no catodo (terminal menor) do led, tanto faz.

4. Determinamos o valor do resistor através da tabela prática: Tabela prática de utilização de leds 3mm e 5mm. Entretanto, o mais correto é sempre verificar o datasheet do fabricante do LED para você ter os exatos valores de tensão e corrente do mesmo - leia  Leds ligados em série e em paralelo.

2.1. Valores utilizados para nossos projetos: LEDs difusos ou de alto brilho: Vermelho, Laranja e Amarelo: 150 Ω | Led Verde e Azul: 100 Ω (utilizamos resistores de 200 Ω neste projeto)

5. O buzzer tem polaridade. Portando, cuidado para não ligar o buzzer invertido. Se você retirar o adesivo superior do buzzzer poderá ver um sinal de positivo (+). Este sinal mostra onde está o pino positivo do componente que deverá estar conectado ao potenciômetro (neste projeto) ou a uma porta digital do Arduino e o polo negativo ao GND.

6.  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).

7. Para fazer a conexão do sensor DS18B20 é preciso observar a posição e cor dos fios. A conexão para utilização deste sensor é bastante simples, comece conectando o VCC e o GND do sensor de temperatura ao pino de saída 5V e no GND Arduino. Em seguida, conecte o Sinal do sensor ao pino digital do Arduino (no nosso projeto utilizamos o pino 9). Também será necessário incluir um resistor de 4,7K a 10K entre o sinal e o pino de energia do Arduino para manter a transferência de dados estável, veja o esquema para ligação de um sensor de temperatura DS18B20


8. 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.

Utilizando as bibliotecas DallasTemperature.h e OneWire.h

Após incluirmos as bibliotecas, precisamos instanciar as classes OneWire e DallasTemperature e definir o método DeviceAddress, conforme exemplo abaixo:

OneWire pino(3);
DallasTemperature barramento(&pino);
DeviceAddress sensor;

Denominamos "pino" como objeto da classe OneWire e "barramento" como objeto da classe DallasTemperature, onde passamos o parâmetro pino como referência.

Dentro da estrutura setup(void), acionamos o método begin() e obtemos o endereço do sensor, conforme exemplo abaixo:

void setup(void) {
  barramento.begin();
  barramento.getAddress(sensor, 0);
}

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.

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 projeto84.ino no IDE do Arduino:  DOWNLOAD - projeto84.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 lcd.begin(16,2) 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: No programa definimos as temperaturas máxima (setMx) e mínima (setMin) como 18 e 22ºC. Entretanto, você poderá utilizar qualquer valor que seja adequado ao seu projeto.

Se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    Projeto 84: Medindo temperatura em baixo d'água com disparo de alarme
*    Autor: Angelo Luis Ferreira
*    Data: 15/06/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 = 9;
const byte botPin = 10;
const byte buzzerPin = 13;
const byte ledVermelho = 8;
const byte ledVerde = 7;

// define o estado do botão
boolean estado = 0;

// instancia a classe OneWire da biblioteca "OneWire.h" com o nome "pin"
OneWire pin(sensorPin); 
// instancia a classe DallasTemperatura da biblioteca DallasTemperature.h com o nome "bus"
DallasTemperature bus(&pin);
// define o endereço com o nome de "sensor"
DeviceAddress sensor;
 
// Inicializa o LCD com o módulo I2C
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);

// Declara as temperaturas minima, maxima e leitura 
float minC, minF;
float maxC, maxF;
float tC, tF;

// Set temperaturas alarme
const float setMx = 22;
const float setMn = 18;

void setup() {
  Serial.begin(9600);// inicia monitor serial
  lcd.begin(16, 2); // inicia lcd
  pinMode(botPin, INPUT_PULLUP); // define botão como pullup interno do Arduino
  pinMode(ledVermelho, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(buzzerPin, OUTPUT); 
  lcd.clear(); // limpa o disply
  bus.begin(); // inicializa o objeto bus
  bus.getAddress(sensor, 0); // localiza o sensor ds18b20  
  // definie as temperaturas max e mi (primeira leitura)
  minC = 999;
  maxC = -999;
}

void loop() {
  // faz leitura do sensor
  bus.requestTemperatures(); // permite a leitura do sensor
  tC = bus.getTempC(sensor); // temperatura em ºC
  // Atualiza temperaturas minima e maxima
  if (tC < minC)  minC = tC;
  if (tC > maxC)  maxC = tC;
    
  celsius(); // mostra valores em ºC no display

  verifica(); // verifica se o botão foi pressionado
    
  // verfica a temperatura máxima e mínima
  if(tC > setMx){ // setado como 32ºC        
    sirene(); 
  } else if (tC < setMn) {
    sirene();   
  } else {
    digitalWrite(ledVermelho, LOW);
    noTone(buzzerPin); // interrompe o tom
  }
}

// liga/desliga o modo silencioso 
void verifica() { 
  // verifica se o botão está pressionado 
  if (!digitalRead(botPin)) {
       estado = !estado; // muda o valor do estado
       digitalWrite(ledVerde, estado); // acende luz verde                            
       while(!digitalRead(botPin)) {}
       delay(150);
    }   
}

// função exibe no display
void celsius() {
  // mostra valores no LCD em ºC
  lcd.setCursor(0,0);
  lcd.print("Temp.: "); 
  lcd.print(tC);
  lcd.write(B11011111); // Símbolo de grau
  lcd.print("C ");
  lcd.setCursor(0,1);
  lcd.print("L=");
  lcd.print(minC);
  lcd.print("  H=");
  lcd.print(maxC);
}

//Função sirene
void sirene(){ 
  // desliga led vermelho 
  digitalWrite(ledVermelho, LOW);
  delay(50);
  verifica();
  // verifica se é modo sirene ou modo silencioso
  if (estado) { // modo silencioso
    noTone(buzzerPin);
    digitalWrite(ledVermelho, HIGH); 
    delay(150); 
    verifica(); 
  } else {
    // modo sirene - tocar 5 ciclos
    for (int k=0; k<5; k++){
      verifica(); 
      tone(buzzerPin, 1350); //Gerar um sinal de 1350Hz
      delay(150);
      tone(buzzerPin, 1050); //Gerar um sinal de 1050Hz
      delay(150); 
      digitalWrite(ledVermelho, HIGH);          
      }           
 }
} 

Vídeo

Como o projeto deve funcionar

1. Ao executar o programa, será exibida a temperatura da água em Celsius na primeira linha do display.

2. A linha de baixo exibirá as temperaturas máxima e a mínima, registradas desde que o Arduino foi ligado ou o programa reiniciado.

3. Ao atingir a temperatura máxima ou a temperatura mínima definidas, o alarme soará junto com o led vermelho que permanecerá piscando.

4. Ao pressionar o botão, um led verde acenderá. Solte o botão para acionar o modo silencioso. Assim o led vermelho piscará mas sem o som do buzzer.

5. Para sair do modo silencioso, pressione o botão até apagar o led verde. Solte o botão para acionar o modo alarme com som.

5. Quando a temperatura da água atingir os valor adequado, ou seja, maior que a temperatura mínima e menor que a temperatura máxima, o alarme é desligado.

6. Para resetar os valores máximo e mínimo de temperaturas, basta desligar o arduino ou reiniciar o programa pela IDE.

Desafios

Com base neste projeto, resolva o seguinte desafio:  Desafio 71

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores