FAÇA UM SIMPLES TERMOSTATO ELETRÔNICO COM UM PIC 16F676 (SENSOR LM35)

Gostaria de controlar de forma automática a temperatura de seu aquário? Ou ainda, de um aquecedor de café? Ou quem sabe, de uma chocadeira de ovos? Então, você vai querer saber mais…

Existem muitas maquinas que trabalham com termostato interno: geladeiras, freeser, cafeteiras de padaria, ar condicionado, fornos, aquários, etc. Muitos usam laminas de bimetal (ferro de passar roupa), outros usam a expansão dos gases para pressionar um interruptor (geladeira) e ainda os que usam a eletrônica para o controle. A vantagem dos termostatos eletrônicos está na possibilidade de visualizar a temperatura e as facilidades de calibração.
Neste projeto didático, estamos usando um microcontrolador PIC 16F676 e um sensor LM35 para ligar/desligar um relé de carga. Este relé poderá acionar inúmeras cargas, dependendo da necessidade do hobista.
Veja o esquema elétrico abaixo:

Em princípio, não difere muito do PIC_TERMOMETRO, exceto pelas chaves de controle e rele adicionado.
Ao ligar, aparecerá o seguinte no display:

| PIC_TERMOSTATO |
|LARIOS.TECNOL.WS|

E após alguns instantes, vai para tela de trabalho, como abaixo:

|TEMP= 30.4Cº ON |
|L= 28.4 D= 32.5 |

Onde, a primeira linha do LCD, indicará a temperatura atual do sensor e a situação do relé:  ligado ou desligado. Na segunda linha, a letra “L” indica a temperatura que irá ligar o relé e a letra “D”, a temperatura que irá desligar o relé. No pino 2 do PIC, foi colocado um botão para fazer incremento de temperatura (up) e no pino 3, o botão de decremento (down). Quando apertamos ‘up’ irá incrementar e apertando ‘down’ irá decrementar os dígitos (da função “L” =  ligar abaixo desta temperatura). Para ajustar a função “D” (desligar acima desta temperatura) , o botão ligado ao pino 4 (func) deverá ser acionado antes do botão, e mantê-lo pressionado, enquanto se aciona o botão ‘up’ ou ‘down’. O incremento na função “L” ocorrerá até o seu valor ser igual ao da função “D”. Depois, para de incrementar, mesmo com botão pressionado. Sempre o valor ajustado na função “L’ será menor ou igual ao valor ajustado na função “D”, nunca superior.
Os fios que ligam o sensor LM35 devem ser preferivelmente curtos para evitar interferências que possam gerar instabilidades na leitura. Foi colocado um filtro, com um resistor de 75 ohms em série com capacitor de 1 uF, conforme sugestão do datasheet do componente.
No ponto de teste PT1, poderá ser colocado um voltímetro de precisão para ler a temperatura para fins de calibração. A cada 10mVolts corresponderá a um grau centígrado. No ponto de teste PT2, deverá ser colocado também o voltímetro e ajustado no potenciômetro para obter 2,048 volts, em relação ao GND. Este potenciômetro, deverá ser preferencialmente do tipo ‘multivoltas’, o que facilitará em muito a calibração desta tensão.
As regulagens são salvas nas primeiras posições da EEprom interna do PIC. Assim, mesmo que acabe a energia, não será perdido este valores, sendo recuperados da EEprom, na ocasião da reinicialização.
O relé de carga tem bobina para 5 volts, sendo seus contatos para 10 a 15 amperes (dependendo da sua aplicação, poderá ser alterado).
A fonte de alimentação poderá ser feita com um pequeno transformador de 110/9 volts, retificadores, capacitores e um regulador 7805 para obter os ‘regulados’ 5 volts.

Abaixo temos a primeira sugestão de uso: Controlar a temperatura de um aquário !

Deverá ser usada as resistências apropriadas para aquário nesta aplicação e tomar todas as medidas de segurança e isolação de fios.
O LM35 deverá ser soldado a 3 fios flexíveis de comprimento suficiente para chegar a placa. Depois, este sensor, já com os fios ligados, deverá ser colocado em um pequeno tubo de ensaio (de vidro) e preenchido com cola resistente a água (silicone por exemplo). O tubo de ensaio, com o sensor em dentro, deverá ficar mergulhado dentro do aquário.

A próxima sugestão: Controlar a temperatura de uma chocadeira !

Poderá ser usado um conjunto de lâmpadas para prover o calor necessário ao ambiente dos ovos a serem chocados.
Deverá ser pesquisado qual é a temperatura ideal para esta aplicação, visto ser muito critica.

Uma sugestão final: Aquecedor de cafeteira

Também, deverá ser usado resistências ‘blindadas’, com aterramento em toda a estrutura metálica, visando a segurança do operador deste equipamento. O relé nesta função, deverá ser bem dimensionado, ou ainda, faze-lo acionar um ‘contator’ elétrico adicional.
Obs: Este material é publicado com objetivos didáticos. Poderá estar sujeito a bug’s ainda não detectados. Esta montagem foi realizada e testada apenas em protoboard.
Visto que está sendo fornecido os arquivos do programa, cada hobista poderá fazer as alterações que julgar necessário, em conformidade com as suas necessidades. Visto que algumas sugestões envolvem riscos de choque elétrico, cada montador assumirá seus próprios riscos de segurança.
Caso queira uma versão com display de 7 seguimentos, veja este link.

Clique abaixo para visualizar o arquivo ASM da primeira versão:
PIC_TERMOSTATO_ASM

Clique abaixo para visualizar o arquivo HEX da primeira versão:
PIC_TERMOSTATO_HEX

Poderá baixar estes arquivos com terminação ‘.asm’ e ‘.hex’, na pasta abaixo:
PIC_TERMOSTATO_V1_FILES

Em 08/02/2012 foi feita uma alteração, com aprimoramento na velocidade de incremento do ajuste inicial, em 3 etapas: lento, médio e rápido, mantendo-se simplesmente apertado o botão de ajuste. Adicionalmente, a frase ‘off’ foi substituída por ‘des’ e ‘on’ por ‘lig’ (padronizado para português).

Poderá visualizar o arquivo ASM desta segunda versão clicando abaixo:
PIC_TERMOSTATO_V2_ASM

Poderá visualizar o arquivo HEX da segunda versão clicando abaixo:
PIC_TERMOSTATO_V2_HEX

Poderá baixar os arquivos da versão 2, com terminação ‘.asm’ e ‘.hex’, clicando na pasta abaixo:
PIC_TERMOSTATO_V2_FILES

Segue abaixo, pasta para baixar, com versão 3 de 13/03/2014, com aprimoramentos citados acima, acrescentando mais estabilidade na leitura:
PIC_TERMOSTATO_V3

Segue a placa para circuito impresso, sendo gentileza do Agnaldo ‘Foxcom’ (dúvidas: agnaldofraga@hotmail.com):
TERMOMETRO 676 LCD PCB FOXCON

Em 21/03/2021 foi postado a versão 4, reescrita em linguagem “C” para CCS C Compiler:

PIC_TERMOSTATO_V4_ZIP

Manuais:
datasheet Pic16f676
LM35

Curiosidades:
A ventilação do cupinzeiro
A longa soneca dos ursos
Cuidado com alimentos
Fim do mundo – Do que as pessoas tem mais medo?

Outros assuntos:
Ensine seus filhos bons principios com atividades de colorir
Como posso ter ânimo para exercitar
Entrevista com um bioquímico
Como posso controlar meu peso?
Como reagir a um assédio sexual?
Como lidar com os sogros?
Converse com seus filhos sobre sexo
Desempenhem bem seu papel de pais
Como lidar com dívidas
Como parar de discutir com seu conjuge
Como sobreviver ao primeiro ano de casamento

Até o próximo artigo!!!

112 comments on “FAÇA UM SIMPLES TERMOSTATO ELETRÔNICO COM UM PIC 16F676 (SENSOR LM35)

  1. como eu faço para inverter o L de ligar para D de desligar…queria instalar em uma geladeira…e a opção so funcinaria invertida…so queria mudar as letras no display

    1. Olá Yagomn! Este circuito trabalha apenas com temperatura positivas, de 0 a 150 graus centigrados. Para usar com temperatura negativas, será necessário outro esquema de funcionamento. Neste blog temos um termostato que pode ser usado tanto em temperaturas positivas como negativas, mas usa display de 7 seguimentos. Verifique se atende sua necessidade.
      Cláudio

      1. e o que eu mudaria na programação para inverter somente as letras
        mas continuar com a mesma função…pois depois eu ligo na outra saida do relé…
        queria o valor que liga o relé…fosse a letra D ao invez da L
        e o valor que desliga teria q ser L ao invez da letra D…tendeu…so queria essa mudança na programação…se sim teria como enviar no meio e-mail.

        1. Olá Yagomn!
          Bem, se o caso é só de inverter, procure no arquivo asm a seguinte porção de código:

          FRASE1:
          dt ” PIC_TERMOSTATO “,0
          FRASE2:
          dt “LARIOS.TECNOL.WS”,0
          FRASE3:
          dt “TEMP= “,0
          FRASE4:
          dt “L= D= “,0 ; nesta parte você deve trocar o ‘L’ pelo ‘D’ como deseja e ficaria assim:

          FRASE4:
          dt “D= L= “,0 ; já trocado.

          Depois, é só recompilar no Mplab_ide, para obter o arquivo hex alterado.

          Cláudio

  2. Boa Tarde, muito bom esse projeto e didatico tanto é que vou usa-lo no projeto de tcc, eu nao sei como programa o pic

    1. Olá Jeferson!
      Obrigado por seu comentário apreciativo sobre o artigo. Para programar um pic você necessitará de um programador para pic ( o aparelho onde você coloca o PIC para programa-lo). Existem vários fabricantes e os modelos ‘caseiros’ como o JDM Programmer, bem fáceis de serem construídos. Poderá ver na Internet, em especial no Youtube, vários tutoriais de como programar um pic. Neste blog tem um esquema de um simples programador de pic, onde você poderá gravar um pic usando um simples protoboard e conectando 3 fios e alimentação de 5 volts. Utiliza a saída serial de um PC (DB9). No PC deverá estar rodando o programa WinPic, devidamente configurado.
      Cláudio

  3. OLÁ CLÁUDIO,DOBRE VICHER,BOA NOITE .OBRIGADO PELA VIAGEM KKK
    TUDO FUNCIONANDO ,PORÉM A TEMPERATURA AMBIENTE MOSTRADA NO LCD ESTA FLUTUANDO DE MAIS CHEGANDO A SALTOS DE 1 DE 2 ,3 GRAUS ,MESMO COM O LM35 EM CONDIÇÕES ESTÁVEIS ,TEM COMO ESTABILIZA-LO?
    (ISPACIBA) OBRIGADO.

    1. Olá Yuri! A parte mais crítica é justamente esta. No datasheet do LM35 tem algumas sugestões para isto. Costuma-se contornar a situação por filtrar bem a alimentação do LM35 , usar cabos blindados e aterrados do LM35 ao pic. Aumentar a quantidade de leituras (tipo 200 a 300) e depois tirar a média tende a reduzir os erros e estabilizar. Com esta montagem é mais de natureza didática, não entrei a fundo nesta questão.
      Cláudio

      1. olá cláudio bom dia.
        gostaria de saber se o termostoto de 3 d de7 também apresenta a mesma instabilidade.
        obrigado.

        1. Olá Yuri! Visto que usa PIC e também o LM35, apresenta também os mesmos problemas de instabilidade. Como eu falei, a instabilidade pode vir de interferências no fio do LM35 até o PIC. Cabos blindados e um filtro com resistor de 4k7 seguido de um capacitor de 1uf ao gnd e mais um outro resistor de 1k podem amenizar isto.
          Outro fator tem que ver com ruídos no pino da tensão de referencia . Coloque também um capacitor de 1 microfarads ao gnd.
          O ideal é que o PIC tivesse gnd diferenciados para parte analógica e digital, como é no ATMEL. Até o formato das trilhas podem influir nos ruídos. Os que são causados pela parte digital causam instabilidade no conversor AD ( ruídos do LCD, propagação em trilhas de rf, etc)
          Também, gostaria que você fizesse este teste. Ao invés de alimentar o circuito com fonte chaveada, use 4 pilhas AA com um diodo 1n4007 em série. Se a instabilidade melhorar, você saberá que era devido a fonte. Se for isto, terá que tentar outros modelos inclusive fonte convencional com trafo e regulador, ou blindadar, ou filtrar (Digamos que começa outra diversão!)
          Note que muitos passam pelo mesmo problema. Digite no googgle ‘como eliminar instabilidade na leitura do lm35′ e verá o que eu digo. Talvez encontre mais dicas que possa funcionar no seu caso.
          Cláudio

  4. olá Cláudio ,parece que esta quase tudo ok,porém já fiz mudanças nas ligações do lcd, mas o mesmo mostra-se quadriculado ,sem letreiro ,por favor ,obrigado.

    1. Olá Yuri!
      Confira realmente as ligações pino a pino da sua montagem. O fato de aparecer quadriculados no display é sinal que não está recebendo corretamente os sinais nos seus pinos. Experimente, se dispor de um osciloscópio, se tem sinais nos pinos ligados ao LCD. Se não tiver osciloscópio, poderá visualizar com um led e um resistor de 470 ohms em série, colocando pino a pino com o outro extremo no gnd (respeite a polaridade do led). Se perceber ele piscando, o pic está ativo e pode ser erro de ligação ou problemas no LCD. Se não ocorre nenhuma piscada ou não vemos sinal no osciloscópio, talvez precisará verificar se o seu pic está ainda com o byte de calibração intacto. Este byte fica no ultimo endereço da Flash e será perdido quando apagamos a Flash. Alguns aparelhos programadores salvam este byte antes de apagar a Flash e depois o devolve ao seu lugar, ao término. Faça o seguinte:
      Use o seu programador para ler a inteira Flash. Após a leitura, examine a ultima posição da Flash e ve se encontra um valor começando com 0x34YY onde ‘YY’ poderá ser um valor qualquer de calibração.
      Se encontrar um 0xFFFF é porque você perdeu o byte de calibração e não irá funcionar. O porque é que quando começa a rodar o programa, temos logo no inicio uma intrução de CALL 0x3ff. Esta busca na ultima posição o valor que deverá ajustar o oscilador do pic para uma melhor precisão. Se não encontrar um valor começando com 0x34 (retlw) , ele não conseguirá retornar do CALL e se perderá o programa.
      Caso chegue a conclusão que realmente perdeu este byte de calibração, terá algumas opções de solução:
      1) Um pic novo
      2) Restaurar o byte de calibração no pic. Isto exigirá um circuito especial, conforme tratado no artigo ‘como calibrar a frequência do oscilador interno do pic 12f675/629’ mas adaptando para o 16f676.
      3) Comentar as instruções de procura do byte de calibração e recompilar o programa ASM no Mplab_ide,
      conforme mostrado na porção de código abaixo:
      ;==================================================================================
      ; INICIO DO PROGRAMA
      ;==================================================================================
      ;CONFIGURAÇÕES INICIAIS DOS REGISTRADORES E PORTAS
      INICIO
      BANK1 ;BANCO 1
      ; CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR ; Comente esta linha de código
      ; MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR ; e esta também
      MOVLW .0
      MOVWF INTCON ;DESLIGA TODAS INTERRUPCOES

      4) Ao carregar o arquivo .hex para o buffer do programador, antes de gravar o chip, ir até o endereço 0x3ff da Flash e alterar para 0x3480 (valor médio).
      Depois sim, grave o pic. Isto pode ser facilmente feito com o WinPic800. Não conheço os outros programadores, como o que você usa.
      Espero que isto possa ajudar você a resolver o problema.
      Claudio

  5. Boa Tarde Claudio,
    Estou tentando fazer este termostato.
    Baixei o programa Pic C compiler e adicionei o arquivo ASL que você passou acima.
    Mas ao compilar acontece um erro. *Error 128*
    o que pode estar acontecendo? Obrigado.

    1. Olá Yuri!
      Este projeto foi feito unicamente em assembly, portanto, não tem como você tentar usar um compilador C para abri-lo. Antes, você deverá usar o Mplab-Ide caso queira alterar o programa assembly (.ASM) e em seguida, recompilar para gerar o novo arquivo . hex. Este sim, será usado para programar o PIC usando um programador de sua preferência ou então usar o ‘simples programador’ deste blog , junto com o Winpic800 (software). Veja videos de como usar o Mplab e também o Winpic800.
      Caso não necessite fazer nenhuma modificação, poderá usar o arquivo .hex fornecido para gravar diretamente seu PIC.
      Cláudio

      1. Obrigado pela atenção,
        Eu fiquei na duvida para que devo recompilar e tornar o aquivo em .hex. E como devo fazer isso.

        Agradecido.

        1. Olá Yuri!
          Basicamente, o Pic só poderá ser carregado com dados de programação na forma de ‘1’ ou ‘0’s. O arquivo ‘.hex’ tem estas informações prontas para ser carregado no Pic. Mas quando você deseja criar um programa, ficaria difícil manusear bit a bit, para nosso objetivo. Aí entra a linguagem de programação. Ela facilita a programação, pois usamos instruções que podem ser aprendidos pelo programador e alterar o programa ficará mais fácil. A compilação é o processo que convertemos o programa de certa linguagem em códigos que poderão ser usados para carregar o PIC (ou outro microcontrolador), ou seja , o código ‘.hex’. Note que cada linguagem tem um conjunto diferente de palavras e símbolos específicos (reservados), próprios da linguagem. Podemos ter compilador em Assembly, em “C”, em Basic, em Pascal,etc. Também, cada família de microcontrolador tem seu compilador específico, pois as instruções mudam de fabricante para fabricante e de modelo para modelo.
          Assim, se você, por exemplo, tiver um programa em ‘c’, poderá abri-lo em um compilador ‘C’ e alterar o programa conforme desejar. Depois, clique em ‘Compile’ e será gerado um arquivo ‘.hex’ junto a pasta do programa “c”.
          Quando não precisar alterar o programa e já tiver um arquivo ‘.hex’, como os fornecidos neste blog, basta usa-los sem necessidade de recompilar.
          Recapitulando: Compilamos um programa para converte-lo em arquivo ‘.hex’ , o único que poderá ser carregado no PIC (usando um programador, é claro).
          Cláudio

          1. Ola Claudio ,obrigado mais uma vez pelas elucidações .Baixei o winpic800
            mas não consegui gravar o pic , ate assisti uns videos do youtube, mas preciso exatamente gravar o pic 16f676 e não encontrei video deste em especifico ,e pelo que entendi de acordo com o nº do pic ,varia também a posição dele no programador , copiei para um bloco de notas e colei no programa o codigo “HEX” passado por você nesta pagina. Enfin não deu certo,você pode me dar uma dica de como usa-lo? ou videos seus sobre ou ate mesmo existe um programa mais facil ? Desde ja agradeço.

          2. Olá Yuri!
            Exatamente. Se você tem programador profissional, geralmente ele já grava automáticamente sem se preocupar com pinagem. Mas, quando for usar o gravador deste blog, o ‘simples programador’ , você deverá baixar o datasheet (ou ver on line) quais são os pinos usados na programação. São 3 pinos: VPP( recebe tensão de programação de 12 volts), o ICSPDAT (recebe o ‘dado’serial), o ICSPCLK (recebe o ‘clock’ para ’empurrar os dados para o chip) mais o VCC (+5volts) e o VDD (GND ou – da alimentação). Assim, tendo Datasheet do pic a programar em mãos para saber qual pino ligar os 5 fios citados, um protoboard, uma fonte de 12 volts e o simples programador deste blog, com o WinPic800 rodando no PC, fazendo uso da porta serial DB9, você poderá gravar TODOS os pic’s alistados no Winpic800.
            Cláudio

          3. OLA CLAUDIO ,
            USEI O PROGRAMA DIY K150 E DE ACORDO COM O PROGRAMA FOI GRAVADO COM SUCESSO ,NO MEU PROJETO O LCD ACENDEU MAS NÃO MOSTROU A ESCRITA ,DUVIDA:
            1º- NO ESQUEMA A CIMA ,OS RESISTORES NO VALOR 220 PARA O LCD ,SÃO OHms ou K?
            2º PARA O TERMOSTATO LCD FOI USADO PIC 16F676 OU PIC 12F676 ,PORQUE NO TITULO VOCÊ CITA UM E NO TEXTO CITA O OUTRO ,OU ELES SÃO EQUIVALENTES? OBRIGADA.

          4. Olá Yuri!
            Os resistores são realmente de 220 ohms e o PIC é um 16f676 (postei o título errado). Obrigado por trazer atenção esta falha, para poder corrigi-la. Se não aparece o nome do aparelho ao ligar, procure confirir as ligações em especial as que vão para o LCD. É comum se enganar o ‘RS’ com o ‘E’.
            Claudio

    2. OLA CLAUDIO ,BOA NOITE
      QUANTO AO LCD MOSTRAR QUADRICULADO,FIZ OS TESTE QUE VC INDICOU .CONFERI AS SAÍDAS COM O LED NOS PINOS E ESTÃO PISCANDO,CADA UM EM INTERVALOS E INTENSIDADES DIFERENTES .TROQUEI O LCD ,CONFERI AS LIGAÇÕES(FIOS DE CORES DIFERENCIADAS)MAS O LCD CONTINUA QUADRICULADO.SERÁ QUE TEM À VER COM O PROGRAMA PELO QUAL CONFIGUREI O PIC? E USO COMO FONTE UM CARREGADOR DE CEL DE5V 350mA PODE SER? (ISPACIBA OBRIGADO)

      1. Olá Yuri!
        Bom sinal. Todos os pinos do pic para o LCD acredito que foi testado por você com o led (db4 a 7 , RS e E). Vamos pensar em mais possibilidades:
        O resistor que você colocou no pino ‘VO’ ao gnd é de 1KiloOhms? Ele controla o contraste do display. Valores baixos tendem a deixar tudo ‘quadriculado’ (escuro). Valores altos tendem a apagar e tornar muito fraco a visualização. Confira por favor.
        Você citou se tinha que ver “com o programa que configurei”. Você alterou o modelo de pic ou fez outras modificações no programa ou está original?
        Caso seje original, qual das versões você está usando? Se for a versão 2 tente carregar a primeira versão e ver se funciona. Na segunda versão usei um tempo de delay para o pulso no pino ‘E” do display bem menor. Alguns display não funcionam bem com tempos menores. Caso a primeira versão funcione bem ( pois está compilada para tempos de pulso “E” maiores) então, poderá comentar a primeira opção de tempo ( mais rápida) e ficar com a segunda (descomentando, sendo esta mais lenta), e recompilar no Mplab_ide , conforme a porção de código abaíxo:

        ;LcdPulse_E ;(comente esta primeira opção mais rápida e problemática)
        bsf LCD_E ;Enables LCD
        goto $+1
        goto $+1
        goto $+1
        goto $+1
        goto $+1
        goto $+1
        goto $+1
        ; goto $+1
        ; goto $+1
        bcf LCD_E ;Disabled LCD

        return

        LcdPulse_E ;(descomente esta segunda opção, mais lenta)
        bsf LCD_E ;Enables LCD
        ; movlw 1 ;Wait 1ms
        ; call LcdDelay
        movlw .200
        call WAIT_uS
        bcf LCD_E ;Disabled LCD
        ; movlw 1 ;Wait 1ms
        ; call LcdDelay
        return

        Por favor, verifique qual caso e retorne , por favor.
        Claudio

        1. Olá Claudio, bom dia.
          Consegui regular as escritas dentro dos quadradinhos usando na saída do contraste ligado ao GND um tripote de 10K. Afetaria alguma outra cosia? Pois parece que deu certo. Preciso apenas ajudar a temperatura.

          1. Olá Yuri! Você esta indo bem. Já apareceu então a mensagem inicial? Em exatamente no que precisa de ‘ajuda na temperatura’?
            Claudio

Comments are closed.

Back To Top