FAÇA UM TERMÔMETRO DIGITAL COM 2 SENSORES DS18B20 E LCD – COM PIC 16F628A-MODO MANUAL OU AUTOMÁTICA (REF148)

0

Vários sensores de temperatura DS18b20 podem ser acessados usando um único pino do pic. Como fazer isto?

Existe dois métodos de aprendermos os sensores DS18B20 usando um único pino:
1) De forma automática, em que o PIC procura por Seriais Numbers de sensores ligados a linha 1-wire toda vez que ocorrer um reset. Exige um software especial, que consegue identificar colisões de bits por analisar o envio de bit normal e o bit invertido. Quanto maior a quantidade de sensores maior o tempo de busca.
2) Por programar um sensor por vez, após baixarmos o firmware no pic, de forma definitiva. Neste caso, ao trocar qualquer sensor, deveremos reaprender todos os sensores novamente. Iniciaremos com esta opção.

Veja o esquema abaixo:

Conforme visto no esquema acima, usaremos apenas 2 sensores que sejam monitorados usando um único pino do PIC. Foi limitado por software a apenas 2, visto que na tela do LCD somente permite mostrar duas leituras diferentes em uma linha. Para isto, devemos aprender um sensor por vez antes de efetivamente usa-los em conjunto.
Como fazemos isto?
1) Primeiro, carregue o firmware (arquivo hex) no PIC.
2) Desligue a alimentação e coloque o PIC no circuito, deixando apenas um sensor de temperatura DS18B20 conectado.
3) Ligue a alimentação. Deverá aparecer a temperatura deste sensor em ‘A=”, com o valor do momento e em ‘B=?’ para indicar a inexistência do sensor.
4) Desligue a alimentação e retire este sensor (ou desligue o pino central ‘DQ’). Conecte o outro sensor.
5) Religue a alimentação. Deverá mostrar em ‘A=?’ e em ‘B=’ a temperatura deste outro sensor.
6) Desligue a alimentação e conecte os 2 sensores. Ao religar deverá apresentar as 2 temperaturas, sendo um em ‘A’ e outra em ‘B’.

Mas, se você desejar usar outros 2 sensores diferentes? Ou caso um deles apresente mau funcionamento e necessite ser trocado?
Neste caso, existe um recurso de apagamento previsto no circuito por meio de um ‘jumper’ entre o pino de sinal dos sensores (pino 16 do PIC) e o gnd.
Faça desta forma:
1) Desligue a alimentação.
2) Coloque o ‘jumper’ ligando assim o pino 16 ao gnd.
3) Religue a alimentação. Espere aparecer a mensagem ‘APAGADO SENSORES’.
4) Desligue a alimentação.
5) Retire o ‘jumper’
6) Siga os passos para gravar os 2 novos sensores, conforme já delineado acima.

O ARQUIVO “C”

A comunicação com os DS18B20 é formada em 3 partes distintas que tem que ser seguidas para ser bem sucedida:
1) Iniciar sempre com um ‘RESET’ especial (veja detalhes no datasheet DS18b20 pag 15).
2) Enviar um comando de ‘ROM’ (Veja na pagina 10, os vários comandos ‘ROM’s disponíveis).
3) Enviar um comando de ‘FUNÇÃO’ (Veja na pagina 11, os vários comandos ‘FUNCTIONS’s disponíveis).

Após a inicialização de portas e registradores, o programa testa por aterramento no pino 16, para fins de apagamento de sensores. Se o ‘jumper’ estiver colocado ocorrerá neste momento o apagamento dos sensores na EEprom interna do PIC. No caso da memória estar vazia, será seguido todo o procedimento de gravação e serão gravados 8 bytes por sensor na EEprom. Se a memória estiver com 2 sensores gravados, o programa passa a buscar o primeiro, enviando o RESET, o comando ‘MATCH ROM’ e enviando primeiro serial number da EEprom. Em seguida, faz a conversão seguida da leitura da temperatura e do byte de configuração para fins de confirmação da existência do sensor na linha. O mesmo procedimento é realizado com o segundo sensor. Caso não exista o sensor que foi endereçado, aparecerá uma ‘?’ ao apresentar no display do LCD.
Note que no arquivo “C” não foi usado bibliotecas prontas e específicas para 1-wire, mas rotinas ‘caseiras’ feitas a partir de datasheets, e explicadas com comentários, para ficar mais fácil do hobista entender como o circuito funciona.
Logicamente, existem bibliotecas específicas para isto, usadas pelos programadores profissionais, que poderá usar se desejar. Mas ficará por sua conta realizar estas mudanças, e se necessário, buscar ajuda de outros profissionais nesta área, quanto ao uso correto destas rotinas.
Para conhecer mais do sensor DS18b20 poderá estudar seu manual fornecido pela Maxim. O circuito é alimentado por uma fonte convencional de 5 volts, regulada por um 7805. Se dispor de outras fontes de 5 volts , como carregador de celular (regulados) poderá usar.
Obs. Esta montagem é didática, sendo realizada apenas em placa de protoboard, sujeita a bugs ainda não observados. Esta sendo fornecido os arquivos “C” e ‘Hex’ que poderão ser alterados conforme a necessidade do hobista.

Segue pasta com arquivos desta montagem:

PIC_TERMOMETRO_2Sensores

Passaremos agora para analisar a primeira opção de gravação: aprendizado automático dos sensores ligados a um único pino.

Quando vários sensores estão na linha 1-wire e enviamos o comando ‘ROM SEARCH’, todos eles passam a enviar seus seriais number ao mesmo tempo.
Isto gera conflito entre ‘1’ e ‘0’ de cada serial. Como é resolvido esta situação?
Funciona deste forma:
1) Pic envia o comando ‘ROM SEARCH’ na linha 1-wire.
2) Pic lê um bit (A), salvando-o para comparação. Os sensores enviarão este bit sem inversão.
3) Pic lê mais um bit (B), que será enviado invertido por todos os sensores.
4) O programa irá comparar o bit ‘A’ com ‘B’: Se iguais ambos a ‘1’- não temos sensores na linha
Se forem diferentes – todos os sensores tem este bit comum em seus seriais numbers.
Se forem ambos = ‘0’ – Temos dois ou mais sensores na linha.
5) O Pic envia o bit ‘A’ para bit comum e ‘0’ ou ‘1’ para quando houver conflitos.
Após este envio, somente os sensores com o mesmo bit enviado continuarão sendo acessados e os demais entrarão
em repouso até um novo ‘reset’ na linha.
6) Através de sucessivas leituras, alterando os bits conflitantes entre ‘0’ e ‘1’ obtemos todos os seriais ligados a linha.

Como proceder após a carga do firmware?
No primeiro reset do PIC após a carga do arquivo hex em sua flash, o programa procurará por sensores na linha e gravará de forma automática.
Mas, caso tenha gravado apenas um e deseja aprender o outro, faça assim:
1) Desligue a alimentação.
2) Ligue o Jumper na placa para apagamento.
3) Religue a alimentação, e espere aparecer mensagem ‘apagado Sensores’.
4) Desligue a alimentação e retire o ‘Jumper’.
5) Coloque os 2 sensores no circuito.
6) Religue a alimentação, devendo programar automaticamente e funcionar normalmente este 2 sensores.

Segue pasta com os arquivos para esta versão automática:

termostato_autoprog

Adicionalmente, segue pasta com arquivos ‘List’ e ‘reassemblados’ para fins de estudo das rotinas e modificações em assembly usando o MPLAB-IDE:

reassembler_list

Manuais:
DS18B20
PIC16F628A

Curiosidades:
O papel vital das enfermeiras
Você se exercita o suficiente?
Idosos: reavaliando os conceitos
Medicina transfusional — seu futuro está garantido?
O seguro que todos devem ter
Como vencer a obesidade infantil
Trabalho — bênção ou maldição?
Cinco sugestões para conseguir um emprego
Topografia — O que é?

Outros assuntos:
Quando seu casamento não é o que você esperava
Como controlar os gastos
Como controlar seu estresse
Recuperar a confiança no casamento
Como acabar com a tática do silêncio
Como ser feliz no casamento?
Como ser um bom ouvinte
Como lidar com as dívidas
Como resolver problemas no casamento
Aprenda a perdoar
Como lidar com os sogros
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?

Até o próximo artigo!!!

0

22 comentários sobre “FAÇA UM TERMÔMETRO DIGITAL COM 2 SENSORES DS18B20 E LCD – COM PIC 16F628A-MODO MANUAL OU AUTOMÁTICA (REF148)

  1. 0

    Boa tarde Claudio.
    Não consigo fazer a leitura da temperatura deste sensor.
    você teria como fazer um código que me desse a temperatura em uma variável e depois eu terminasse o programa?
    preciso muito desta leitura para um trabalho da faculdade.
    desde ja agradeço, e parabenizo pela iniciativa.

    1. 0

      Olá Alexandre!
      Após chamar a rotina ‘void ler_sensor(x)’ o valor do sensor escolhido (x) ficará disponível na variável buffer[1] o valor inteiro e na variável buffer[0] a parte fracionária (após a virgula).
      Poderá salvar estes valores em outra variável de 16 bits (concatenando os valores de buffer[1],buffer[0]) antes de chamar novamente a rotina ‘void ler_sensor(x)’ , e então, tratar os resultados de ambos em sua rotina.
      Como apenas faço estes programas por hobbie, acredito que não saia da forma mais correta segundo os padrões profissionais da área de programação de embarcados.
      Assim, poderá também buscar exemplos de software mais ‘refinados’, usando as note applications do produto. Acredito que se você estudar o datasheet, você mesmo poderá criar rotinas da forma que lhe seja mais convenientes.
      Cláudio

  2. 0

    Ola´boa noite Claudio,Estou Apreciando Seu Blog e como sempre navegando por ele(he he) Por curiosidade pode colocar até quantos sensor 18B20 em paralelo sem ter que mexer no .ASM . E outra pergunta, Você tem algum projeto desse com sensor DHT11 (temperatura e umidade) com LCD ou com display 7 seguimento mesmo Att.

    1. 0

      Olá Bagini!
      Obrigado por apreciar o blog e seus artigos. Respondendo a primeira pergunta : O arquivo foi feito para manusear apenas 2 sensores, devido a questão de apresentação no Lcd e salvamento em memória EEprom. O datasheet do produto, na pagina 2 diz, devido a cada Ds18b20 ter um único número serial, que é possível colocar um número ilimitado de sensores. Mas neste caso, terá que usar algum outro tipo de programa, geralmente limitando a quantidade ao objetivo do sistema.
      Quanto a segunda pergunta, sobre o sensor DHT11: não tenho familiaridade com ele, pois nunca o usei. Também não conheço algum artigo que possa indicar sobre ele. Procure na internet que deverá encontrar bastante material para seu uso.
      Cláudio

      1. 0

        Grato por ter respondido, Era Apenas por curiosidade, Quanto ao DHT11 tem Vários Projetos na internet, Pensei Que Tivesse Algum, Abç.

  3. 0

    Aramis Claudio tou compilando o arquivo asm mas tar
    dando erro #include sera porquer eu tou
    usando o programa miKroBasic pro for pic v.6.0.1

    1. 0

      Olá Aramis!
      Com certeza. Em geral, cada fabricante de compilador ‘C’ tens suas pequenas diferenças. Terá necessidade de converter para o ‘jeito’ do seu compilador ou usar o compilador CCS.
      Cláudio

  4. 0

    olá , não imaginava que era tão complicado assim , mas mesmo assim obrigado pela sua atenção .

  5. 0

    olá claudio , venho aqui para dar mais uma ideia para o seu caderninho . um circuito de campainha sem fio e com microfone . se for interessante está aqui uma ideia . um abraço e até mais .

    1. 0

      Olá Michael! Poderia dar mais detalhes das intenções de uso deste microfone na campainha? Só ouvir o que se fala? Ou pensou em um intercomunicador?
      Cláudio

      1. 0

        olá bom dia , seria como um intercomunicador , também seria interessante se tivesse um comando para abertura de uma fechadura elétrica .

        1. 0

          Olá Michael! Creio que isto pode ser feito mais facilmente com circuito discretos do que usando microcontroladores. Experimentou pesquisar por esquemas prontos na internet?
          Cláudio

          1. 0

            olá claudio , desculpe pela demora . os que achei eram todos com fio , e sem fio achei apenas campainha mas sem ser interfone .

          2. 0

            Olá Michael! Os intercomunicadores modernos sem fio são muito complexos de serem feitos, alguns usam tecnologia de frequência espalhada e outras técnicas similares. Este trabalham em frequências de 800 Mhz a 2,2 Gigaherts. Existe comercialmente, um modelo de interfone que atende o portão e também é o telefone sem fio da casa, pois é ligado a linha telefònica. Poderia fazer algo mais simples, como um tx de 49mhz/rx de 46 mhz no botão de chamada, junto ao portão , e dentro de casa um tx de 46mhz e um rx de 49mhz. Seriam assim 2 canais de transmissão, sendo um da casa para o portão e outro do portão para a casa. Ao acionar o botão ‘campainha’, poderia enviar uma frequência especifica de audio que ao ser recebida, acionasse um som de campainha de telefone (ou escolher ao gosto), que faça o morador pegar o gancho e falar com a pessoa no portão. Infelizmente, também não tenho ainda nenhum esquema deste tipo de interfone.
            Cláudio

  6. 0

    Olá Claudio, que Deus continue ti abençoando grandemente, como sempre mais um grande projeto.
    Se possível gostaria de receber o código em assembly também, pois não tenho afinidade em C talvez num futuro quem sabe.

    Obrigado pela grande ajuda em compartilhar seu conhecimento.

    Fica com Deus e que ele ilumine todos os dias de sua vida.

    1. 0

      Olá Radamm!
      Fiquei feliz com seu comentário apreciativo! Vou ver o que posso fazer quanto ao asm.
      Obrigado
      Cláudio

    2. 0

      Olá Radamm! Postei pasta com arquivos list e reassemblados. Poderá examinar como funciona as rotinas no ‘list’ e usar o ressemblado com o Mplab_ide para alterar. A unica dificuldade é localizar os registradores, pois não usa rotulos para as variavéis, mas sim seu endereço físico. Espero que possa ser de ajuda. Veja link aqui.
      Cláudio

  7. 0

    bom dia lario: voce é mesmo fora de serie na arte de criar mecanismo de suma importancia no dia a dia como aborda este artigo, leitura de dois codigo de temperatura na mesma entrada isto é formidavél.congratulation for you.rsrsr não repare o inglese.lario será possivel voce inserir no seu caderninho um circuitinho que usa 3 lcd 16×2 e 3 pic? que se comunica serialmente.seria tipo assim são 3 conjunto 1 pic + 1 lcd um bip e um botão,vou enviar um nome,tipo jose,joão e maria.sendo eu jose se eu apertar o botão aparecerá meu nome nos demais 2 lcd e vice versa.se possivel.

    1. 0

      Olá José ! Obrigado pelo seu comentário e sua sugestão de projeto. Ela irá para o ‘caderninho’, aguardando uma futura oportunidade de montagem, ok.
      Cláudio

  8. 0

    Ola Claudio interessante este projeto. teria como você fazer uma versão em assembly gostei muito mas não tenho conhecimento em c Obrigado

    1. 0

      Olá Ronaldo! No inicio até pensei em fazer em assembler, mas é muito cansativo fazer cada rotina linha a linha. Por isto decidi usar ‘c’ por ser mais fácil. Se desejar, poderei enviar o arquivo ‘list’ onde poderá acompanhar em linguagem assembly o que o programa realiza.
      Cláudio

    2. 0

      Olá Ronaldo! Postei pasta com arquivos list e reassemblados. Poderá examinar como funciona as rotinas no ‘list’ e usar o ressemblado com o Mplab_ide para alterar. A unica dificuldade é localizar os registradores, pois não usa rotulos para as variavéis, mas sim seu endereço físico. Espero que possa ser de ajuda. Veja link aqui.
      Cláudio

Os comentários estão fechados.