Termostato Arduino com Sensor de Temperatura DS18B20 e Relé

Você sabe como construir um termostato ON/OFF inteligente e com uma interface homem-máquina, para configuração de seus parâmetros ? Saiba tudo em nosso artigo!

Termostato Arduino

As prensas térmicas, chocadeiras e diversos equipamentos que trabalham com sistema de aquecimento necessitam de um controle de temperatura. Esse controle é utilizado, para manter a temperatura em um valor ajustado pelo usuário. Para isto, utilizamos um termostato.

Por meio dele, realizamos o controle de temperatura e configuramos o valor de setpoint. O setpoint é um valor de referência para controle da temperatura do sistema.

Quando o valor de temperatura do ambiente for maior ou igual ao setpoint, o sistema desativa o aquecedor. Caso seja menor, o sistema liga o aquecedor.

De acordo com seu funcionamento, desenvolveremos um termostato ON/OFF com Arduino, a fim de realizar o controle do sistema. Assim como, utilizaremos o sensor de temperatura DS18B20, para monitorar a temperatura do sistema e apresentar na tela de LCD.

Portanto, de acordo com valor de temperatura lido, ativaremos ou desativaremos o relé, para controlar o aquecimento do sistema.

A seguir, apresentaremos todo o projeto de construção do termostato ON/OFF.

 

Desenvolvendo o Termostato Arduino ON/OFF

De acordo com o princípio de funcionamento do dispositivo, serão implementadas as seguintes funcionalidades:

  1. Criação de tela de confirmação, para alteração do valor da temperatura;
  2. Implementar função para salvar o valor de temperatura ajustada pelo usuário, mesmo que o sistema desligue e ligue novamente;
  3. Criação de um teclado para configurar o valor da temperatura, de modo a utilizar apenas 2 botões;
  4. Trabalhar com o sensor de temperatura DS18B20;
  5. Criação de Menus no LCD 16 x 2.

E antes de começarmos, disponibilizamos toda a lista de materiais necessários para construir esse projeto.

 

Lista de Materiais

Todos os componentes eletrônicos abaixo serão utilizados:

A seguir, será apresentaremos o circuito Termostato com o Arduino.

 

O Circuito do Termostato

No circuito da Figura 1, temos 3 push buttons. O 1 (+) e o 2 (-), respectivamente, são utilizados para incremento e decremento do valor de ajuste da temperatura.

O botão 3 (set) é utilizado para entrar nas configurações de temperatura ou salvar a temperatura ajustada pelo usuário.

O LCD será utilizado para receber e apresentar as telas e informações de temperatura do sensor DS18B20 Arduino (4).

 

Esquema Eletrônico do Termostato

Figura 1 – Esquema Eletrônico do Circuito do Termostato.

Quando a temperatura do sistema for menor que o valor ajustado pelo usuário, o relé será acionado. Dessa forma, o aquecedor ligará, para manter a temperatura do sistema.

E agora, analisaremos todo o código desenvolvido para controle do termostato Arduino.

 

Análise do Código

Para este projeto, incluímos as bibliotecas dos periféricos e dispositivos utilizados no projeto, conforme apresentado nas linhas 001 a 004.

Os pinos do LCD foram configurados  (Linhas 006 e 007) e iniciamos o processo de configuração do sensor DS18B20.

O Sensor DS18B20 Arduino

O Sensor DS18B20 é um sensor digital que utiliza o protocolo 1-Wire (Saiba mais nesse outro artigo).

Portanto, é um sensor digital com boa precisão, confiável e com característica parasite power (Saiba mais sobre Parasite Power).

Nas linhas 009 a 017, fizemos a configuração de funcionamento do sensor DS18B20.

E observe que na linha 10, o valor 8 é definido com o nome ONE_WIRE_BUS. Isto serve para usarmos esse nome como referência ao pino digital 8, onde conectaremos o sensor de temperatura.

Logo em seguida, criamos uma instância chamada oneWire e passamos o pino digital que o nosso sensor está conectado (ONE_WIRE_BUS ).

No protocolo 1-Wire, o dispositivo se comunica por um único fio e permite a comunicação de diversos dispositivos no mesmo barramentos (Leia este Application Note).

Por fim, passaremos oneWire como referência para que o objeto sensors possa saber que utilizaremos o sensor DS18B20 conectado ao pino digital 8. Logo, todos os dados do sensor serão lidos e manipulados pelas funções da biblioteca DallasTemperatura.

Consequentemente, para que possamos trabalhar com esses dados e dispositivos de entradas, necessitamos criar diversos tipos de variáveis para manipular os dados de projeto.

 

Declaração de Variáveis e Definição de Dados

Foram declaradas diferentes variáveis para armazenar os dados dos botões, estado dos botões e sensor, de acordo como comentado em cada variável. E além da variável, fizemos 2 definições de extrema importância no código.

Definimos o valor 120 como EndVerif e o valor 125 como EndTemp (Linhas 035 e 038).

Esses dois valores serão utilizados para salvarmos dados nas posições 120 e 125 da memória EEPROM, referente ao nosso sensor de temperatura.

Mas antes de iniciarmos a apresentação da lógica de gravação dos dados na memória, devemos compreender o processo de configuração de cada dispositivo e sensor na função void setup.

Função void setup

Na função void setup, inicializamos o nosso LCD como 16 x 2 (Linha 043) e aguardamos um tempo de 500 ms para a sua inicialização (Linha 045). Em seguida, imprimimos a mensagem Loja UsinaInfo por 3 segundos (Linhas 047 a 052), conforme apresentada na Figura 2.

Mensagem Loja UsinaInfo.

Figura 2 – Apresentação da mensagem Loja UsinaInfo.

Em seguida, realizamos 4 comandos de configuração:

  1. Inicialização do sensor DS18B20 Arduino (Linha 055);
  2. Limpeza da tela do LCD 16 x 2 (Linha 057).
  3. Configuração do pino de conexão do relé como saída digital (Linha 059);
  4. Leitura do valor de temperatura salvo na memória (Linha 061).

O ponto quarto comando de configuração é bastante útil. Através desse comando, conseguimos resgatar  na inicialização, o valor de temperatura ajustado pelo usuário. A seguir, explicaremos como realizar o processo de salvar o valor na memória.

Após esta etapa, iniciaremos a apresentação de toda a lógica e configuração de parâmetros do termostato ON/OFF.

Lógica de funcionamento na função loop do código principal do termostato Arduino

No início, realizamos a leitura do pino do botão de configuração (Linha 068). Isto serve para verificar se o usuário pressionou o botão e, consequentemente, entrar no menu de configuração da temperatura.

 

Tela de Menu para ajuste de temperatura do termostato

Então, caso o usuário pressione o botão (Linha 070), o sistema apresentará uma mensagem. Então, aparecerá a mensagem Reconfigurar o Sistema com duas opções Sim e Não (Linhas 073 a 078). A tela de reconfiguração é apresentada na Figura 3.

Figura 3 – Tela de Reconfiguração da Temperatura do Sistema.

Portanto, o usuário poderá configurar a temperatura ou sair do menu, caso tenha pressionado o botão de forma acidental.

Após pressionar o botão e a mensagem for impressa, o sistema fica em loop no laço (Linhas 080 a 093). Nesse momento, realizará o processo de leituras dos botões incremento e decremento.

Além de utilizar esses botões como valor de ajuste, também utilizamos com outra finalidade, para reduzir a quantidade de botões. Isto torna a interface do usuário mais simples!

Logo após a leitura dos botões (Linhas 083 e 084), realizamos o tratamento de debounce com um delay (Linha 086). Por fim, analisamos uma condição (Linha 088), para verificar se o botão incremento está pressionado e o decremento não pressionado.

Portanto, caso a condição seja verdade, o valor 0 será salvo na posição EndVerif (120) da memória EEPROM. Em seguida, sairá do laço, já que a condição de permanência será falsa. A outra forma de saída do laço é quando o botão decremento (Não) é pressionado pelo usuário (Linha 093).

 

Importância do uso da EEPROM em máquinas com ajustes de parâmetros

Conforme é possível observar na linha 90, gravamos o valor 0 na posição de memória EndVerif(120). Afinal, por que gravar este valor na memória EEPROM ?

Este procedimento está presente em muitas máquinas. Ele é útil quando ocorre um processo de desligamento da máquina. Dessa forma, os dados de parâmetros permanecerão armazenados e serão lidos quando a máquina for ligada novamente.

Portanto, sempre que o dispositivo for ligado, ele verifica se o ajuste de temperatura da máquina já foi realizado (Linha 098).

Ele faz a leitura do valor da posição EndVerif (120) da memória EEPROM (Linha 098). Caso o valor lido seja diferente de 75, automaticamente o sistema entrará na condição (Linha 101). Portanto, o usuário realizará o processo de ajuste da temperatura do termostato.

O valor 75 foi escolhido de forma arbitrária. Logo, ele será salvo quando o usuário configurar a temperatura ou sinalizará que o sistema já está configurado.

É importante garantir que o sistema entre automaticamente na condição (Linha 100), na primeira vez que o equipamento for ligado. Dessa maneira, faça uma limpeza zerando todas as posições de sua memória EEPROM. Deste modo, o valor lido será 0, que é diferente de 75.

Diante disso, utilize este código Clear EEPROM Memory para limpar a memória EEPROM antes de gravar o código do projeto, segue o código:

 

Configuração do parâmetro de temperatura do Termostato Arduino

Após a entrada na condição (Linha 100), aparecerá a mensagem Configurar Temperatura (Linhas 103 a 106). Em seguida, é realizada a leitura do valor de temperatura armazenada na posição EndTemp (125) da memória EEPROM.

Logo após a leitura, o valor lido será 0, pois a memória EEPROM estará com todas as posições zeradas inicialmente. Em seguida, o valor será apresentado na tela, conforme apresentado na Figura 4.

Tela de Configuração da Temperatura

Figura 4 – Tela de Configuração de Temperatura.

Caso a temperatura já tenha sido configurada outra vez, aparecerá o último valor ajustado pelo usuário.

Então, o sistema ficará em loop realizando a leitura dos botões. A lógica de leitura verifica o botão pressionado e armazena seu estado anterior, para evitar incrementar mais de uma vez. Portanto, essa lógica simula um contador com incremento e decremento utilizando botões (Linhas 118 a 138).

A partir da modificação dos valores, o sistema apresenta o valor na tela.

Quando o usuário pressiona o botão set, a condição será falsa e a execução sairá do loop (Linha 145). Após isto, a tela do LCD será limpa e o valor 75 será salvo na posição EndVerif da EEPROM. Logo, esse valor será utilizado para sinalizar que a temperatura está ajustada no sistema.

Em seguida, o valor de ajuste da temperatura é salvo na posição EndTemp (Linha 149). Isto serve para manter o valor salvo em caso de falta de energia. Portanto, evitará a perda da informação, quando o sistema for ligado novamente. O valor salvo será lido novamente na inicialização do sistema (Linha 061).

 

Requisição de Temperatura e acionamento do aquecedor do Termostato

Após isto, o sistema voltará para execução nomal. Desse modo, fará a requisição de temperatura e receberá o valor pelo index 0. Este index representa o único sensor utilizado (Linha 154).

Por fim, apresentamos o valor da temperatura quando a condição (Linhas 156) é verdadeira, conforme apresentado na Figura 5. Esta condição é utilizada para evitar que o sistema apresente o mesmo valor anterior de temperatura.

Figura 5 – Apresentação da Temperatura do Sistema.

Em seguida, será verificado se o valor é diferente do anterior. Portanto, se for verdade, apresentará a temperatura na tela do LCD 16 x 2. Em seguida, pegará o valor atual e guardará na variável ValorAnterior para ser utilizada como referência na próxima comparação.

Após isto, o sistema compara a temperatura do ambiente com o valor de ajuste. Com base na comparação, ele acionará ou desligará o relé do aquecedor do sistema (Linhas 167 a 175).

 

Conclusão

Finalmente, através do sistema desenvolvido para o Termostato Arduino com Sensor de Temperatura DS18B20, foi possível obter o resultado esperado e implementar diversas funcionalidades. Portanto, entre as funcionalidades, foi possível criar um dispositivo termostato inteligente com os seguintes recursos:

  1. Criação de tela de confirmação, para alteração do valor da temperatura;
  2. Função para salvar o valor de temperatura ajustada pelo usuário, mesmo que o sistema desligue e ligue novamente;
  3. Criação de um teclado para configurar o valor da temperatura, de modo a utilizar apenas 2 botões;
  4. Trabalhar com o sensor de temperatura DS18B20;
  5. Criação de Menus no LCD 16 x 2.

Logo, todos os requisitos do sistema foram implementados e podem ser modificados para criação de um novo projeto.

Conheça toda Linha de Produtos Arduino na UsinaInfo.

 

Referências Bibliográficas

Todas as referências utilizadas, encontram-se disponíveis em links ao longo do nosso artigo.

Categorias
ArduinoProjetos

Técnico em Automação Industrial e graduando do curso de Tecnologia em Mecatrônica Industrial pelo Instituto Federal do Ceará. E, atualmente, trabalha como desenvolvedor de projetos, sistemas inteligentes e criador de conteúdo por meio da empresa Silícios Lab para o seu canal e para o blog da UsinaInfo. Nas horas livres, desenvolve alguns projetos com Microcontroladores e Arduino.
36 Número de Comentários
  • Nathan guimarães
    19 julho 2019 at 12:31
    Deixe seu Comentário

    Boa tarde, ótimo post. Tudo bem explicado. Só tem um problema alguns sinais foram trocados na hora de copiar para o site. Alguns consegui identificar mas outro não.

    • Equipe Usinainfo
      19 julho 2019 at 15:19
      Deixe seu Comentário

      Boa tarde Nathan, tudo bem?
      Obrigado pelo seu comentário.
      Editamos o código e a principio agora esta tudo ok.

      Qualquer duvida estamos a disposição.

      • Alberto
        22 março 2021 at 13:53
        Deixe seu Comentário

        Boa Tarde
        Na imagem mostra um potenciometro que não foi mencionado na lista de itens.. teria como colocar a lista toda.. selecionei todos os itens da lista porem não o vi a referencia desse potenciometro como mostra nas imagens. obg

        • Alberto
          22 março 2021 at 13:56
          Deixe seu Comentário

          POSSO SUBSTITUIR O Sensor de Temperatura DS18B20 PELO Termopar Tipo K 0 a 800°C + Módulo de Leitura Max6675??

          • Matheus Gebert Straub
            26 março 2021 at 09:07

            Olá Alerto! Possivelmente a troca de dispositivos irá acarretar também na troca de variáveis, então é necessário uma análise completa para adaptação.

        • Matheus Gebert Straub
          26 março 2021 at 09:03
          Deixe seu Comentário

          Olá Alberto! Para es te projeto foi utilizado um Potenciômetro 10K, responsável pelo ajuste de contraste do display.

    • Diego Moreira
      22 julho 2019 at 21:32
      Deixe seu Comentário

      Obrigado pelo elogio ao artigo, Nathan! Abraço.

  • Bruno
    13 novembro 2019 at 22:59
    Deixe seu Comentário

    Muitoo bom! Vc é 10, mas merece 11!! Parabéns!!

    • Diego Moreira
      19 março 2020 at 11:40
      Deixe seu Comentário

      Obrigado, Bruno. Obrigado pela sua leitura.

      Abração!

  • FELIPE.BORREGO
    19 fevereiro 2020 at 23:11
    Deixe seu Comentário

    artigo bem legal,,, uma pena terem colocado um IDP.51 (vulgo troia) empacotado no código, que feio em… triste

    • Matheus Gebert Straub
      28 fevereiro 2020 at 08:50
      Deixe seu Comentário

      Bom Dia Felipe! Pedimos desculpa pelo inconveniente, verifiquei o ocorrido e o que acontece é que alguns anti-vírus acusam o arquivo como spam por desconhecerem o conteúdo. Já inclui o código diretamente no texto do artigo e excluímos o arquivo para download para não ocasionar este transtorno a mais ninguém. Obrigado pelo feedback.

  • assahel
    10 março 2020 at 15:01
    Deixe seu Comentário

    ola copiei o codigo para a IDE e e apareceu a seguinte menssagem de erro :

    Arduino: 1.8.8 (Linux), Board: “Arduino/Genuino Uno”

    sketch_mar10A:1:10: error: #include expects “FILENAME” or
    #include LiquidCrystal.h //Inclusao da biblioteca do LCD
    ^
    sketch_mar10A:2:10: error: #include expects “FILENAME” or
    #include EEPROM.h //Inclusao da biblioteca para manipulacao das funcoes da memoria EEPROM
    ^
    sketch_mar10A:3:10: error: #include expects “FILENAME” or
    #include OneWire.h //Inclusao da biblioteca para manipulacao das funcoes de dispositivos OneWire
    ^
    sketch_mar10A:4:10: error: #include expects “FILENAME” or
    #include DallasTemperature.h //Inclusao da biblioteca para manipulacao das funcoes do sensor DS18B20
    ^
    exit status 1
    #include expects “FILENAME” or

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    Como resolver isso ?
    Muito obrigado !

  • Diego Moreira
    19 março 2020 at 11:41
    Deixe seu Comentário

    Oi Assahel,

    Esse erro está acontecendo, pois você não incluiu os arquivos de biblioteca.
    Inclua os arquivos e você verá o projeto sendo compilado normalmente.

    Abraço.

  • Assahel
    23 março 2020 at 13:31
    Deixe seu Comentário

    Como faco para usar esse mesmo cod para o sensor DHT11 ?

  • Andrew
    17 maio 2020 at 17:43
    Deixe seu Comentário

    Ola.Eu posso usar um sensor NTC 100K para regular temperatura de até 300º ?

  • marcelo
    3 junho 2020 at 21:30
    Deixe seu Comentário

    tentei usar mas não funciona

    while(incremento == 0 decremento == 0);{

    expected ‘)’ before ‘decremento’

  • cristiano
    25 junho 2020 at 19:10
    Deixe seu Comentário

    esse projeto pode ser usado em prensa termica? poqu vi um comentario”Ola.Eu posso usar um sensor NTC 100K para regular temperatura de até 300º ?” vc dizendo que nao pode ser feito

    • Matheus Gebert Straub
      30 junho 2020 at 15:52
      Deixe seu Comentário

      Boa Tarde Cristiano! Este sensor utilizado, possui limites de verificação de temperatura de -55°C a +125°C, a compatibilidade dele com o seu projeto vai depender da temperatura atingida e do modo de instalação.

  • Cristiano
    1 julho 2020 at 02:42
    Deixe seu Comentário

    Conseguir resolver, agora nao sai de reconfigurar, fica travado,
    no terminal fica assim…
    Solicitando temperatura…Leitura realizada!
    A Temperature e:27.25

  • Elio cassol
    7 julho 2020 at 20:16
    Deixe seu Comentário

    Não existe 1 kit desse para compra?

    • Matheus Gebert Straub
      24 julho 2020 at 17:25
      Deixe seu Comentário

      Boa Tarde Elio! Infelizmente este projeto não possui um kit pronto com os elementos utilizados, é necessário realizar a compra separada dos itens.

  • Geison pontes tavares
    23 novembro 2020 at 14:28
    Deixe seu Comentário

    Boa tarde, projeto fantastico!
    Voce poderia me dar uma dica de como realizar set de temperatura de modo remoto, utilizando o Telegram ou outros serviço.
    Estou implementano este seu projeto em uma ESP32 para um trabalho da faculdade.

  • fabricio delgado
    15 junho 2021 at 23:01
    Deixe seu Comentário

    tem como colocar um d.f. diferencial de temp. entre ligar e desligar ?

  • Fernando
    18 junho 2021 at 15:46
    Deixe seu Comentário

    @marcelo que perguntou o seguinte:

    “”tentei usar mas não funciona
    while(incremento == 0 decremento == 0);{
    expected ‘)’ before ‘decremento “”

    Esta faltando um conectivo lógico como &&

    while(incremento == 0 && decremento == 0);

    Méritos da Cheila da Usina Info !!!!!

  • Samuel
    5 julho 2021 at 17:54
    Deixe seu Comentário

    Estou com um erro no programa, mas não sei como resolver
    request for member ‘begin’ in ‘sensors’, which is of non-class type ‘DallasTemperature(OneWire)’

    • Matheus Gebert Straub
      6 julho 2021 at 09:37
      Deixe seu Comentário

      Olá Samuel! Você incluiu a biblioteca DallasTemperature.h na pasta “libraries” do Arduino ou instalou através do gerenciador de bibliotecas?

      • Samuel
        6 julho 2021 at 21:42
        Deixe seu Comentário

        Olá Mathues eu instalei através do gerenciador de bibliotecas

        • Matheus Gebert Straub
          7 julho 2021 at 08:54
          Deixe seu Comentário

          Olá Samuel! Tente trocar a linha 20 pelo seguinte: DallasTemperature sensors(&oneWire);
          Veja que inclui o conector & que acho estar faltando, acredito que este seja o problema.

          • Samuel
            7 julho 2021 at 19:22

            Deu certo muito obrigado, você salvou meu TCC

          • Matheus Gebert Straub
            8 julho 2021 at 09:03

            Olá Samuel! Que bom que deu tudo certo, agora sucesso para a sua apresentação …

  • Andre luiz
    22 agosto 2021 at 13:00
    Deixe seu Comentário

    Boa tarde!
    Pelo que entendi na linha 186 ele desliga o aquecimento quando a leitura da temperatura for igual ao valor configurado certo?
    Eu não consegui descobrir com que frequencia ele vai verificar a temperatura, mas nao ocorre o risco do sistema de aquecimento ter aquecido MAIS do que deveria? Em outra palavras se está configurado pra 50 graus, e por algum motivo atingir 52, ele não vai mais desligar o aquecimento, correto?
    Outra dúvida que tenho é saber se é possível prolongar a fiação desse sensor de temperatura para uns 5 ou 6 metros longe da placa do arduino.
    Obrigado e excelente trabalho de divulgação!

  • Roberto
    20 outubro 2024 at 06:52
    Deixe seu Comentário

    Muito bom !
    Copiei o código para usar em uma chocadeira preciso controlar a temperatura em 37.7C,o código só adicionava número inteiro 1 em 1 grau ,mudei o código e consigo adicionar ar de 0.1 em 0.1 graus ,porém eu configuro a temperatura em 37.7 e salvo na memória mais quando volto pra reconfigurar está marcando 37.1 ! Podem me ajudar ?

    • Victor Eduardo Ferreira
      21 outubro 2024 at 15:08
      Deixe seu Comentário

      Boa tarde Roberto!

      Provavelmente pela troca do tipo de dado, saindo de um int para float/long, sendo assim precisa de um intervalo maior de espaço na memória EPROM para salvar os valores e ler. Tente com a ajuda do ChatGPT aonde ele pode analisar detalhadamente seu código e adaptar de maneira rápida e fáci.

    Deixe seu Comentário

    *

    *

    Sobre nós

    Hoje a Usinainfo é um dos maiores ecommerces de Ferramentas, Peças para Eletrônica, Componentes Eletrônicos, Sensores e Arduino do Brasil, contando com uma grande diversidade de produtos na linha de eletrônica.

    Sugestões

    Artigos Relacionados