Página 1 de 1

Termômetro com LM35 e PIC

MensagemEnviado: 04 Mar 2009 18:18
por _blackmore_
Galera, boa noite.

Estou precisando de um termômetro e pretendo o fazer a toque de caixa, pois tenho vários componentes e pouca grana, se não eu compraria um.
Mas acontece que como não posso perder muito tempo pois quero no sábado colocá-lo para funcionar, pergunto antes se alguém recomenda algo para melhorar um circuito de termômetro feito com um PIC16F628, LM35 (sensor de temperatura), LM741, LCD ...
Encontrei alguns circuitos prontos, mas sem o código fonte :? , encontrei outros que o código não está completo :x , então se é para ter trabalho faço-o logo inteiro :twisted:
A temperatura de trabalho será entre 10 e 50ºC ... não mais que isso, onde o único problema a princípio será calibrar pois no momento não disponho de um outro termômetro (se não eu não precisaria fazer um dããããã! :D )
Fico no aguardo de comentários dos amigos.

abrax!

MensagemEnviado: 04 Mar 2009 18:48
por pbernardi
Olá Blackmore,

Não me leve a mal, mas pedir um projeto pronto, com pré requisitos (não pode calibrar), pra montar em 3 dias e evitar a compra de um... termômetro? :oops:

http://preco2.buscape.com.br/termometro-pg3.html

No link acima tem por R$ 11,90, digital, e nem precisa montar tudo isso :!: Na farmácia deve custar menos...

MensagemEnviado: 04 Mar 2009 23:05
por _blackmore_
certo ... vou ver o que posso fazer ...

abrax!

MensagemEnviado: 05 Mar 2009 01:36
por Djalma Toledo Rodrigues
Calibração :
Gelo fundente ( derretendo) Zero °C
Água fervente 100 °C
Ambos ao nível do mar e água pura.
.

MensagemEnviado: 05 Mar 2009 08:39
por Andre_Cruz
_blackmore_

Com esses componentes que você citou é sufuciente para fazer um termometro.
Se você precisa ler de 1ºC em 1ºC não precisa do Amp Op LM741, LM35 não se calibra ele vem calibrado de fabrica, 10mV por cada 1ºC.

O software é simples.

Mas pra ontem é complicado!

Se você tentar fazer, e postar as dúvidas é mais facil de ajudarmos a fazer funcionar.

Abraço

André

MensagemEnviado: 05 Mar 2009 13:20
por cmte
É possível fazer o 16F628 "ler" o LM35 através de seus comparadores ? Não é necessário um conversor A/D?
Pergunto pq meu primeiro projeto foi um termômetro com o LM35, LCD e um PIC 16F877. Mas se desse para usar um 628 seria melhor.

MensagemEnviado: 05 Mar 2009 13:58
por Vonnilmam
Uma dica para voce,

Usa um pic com conversor AD, e como o colega disse no post, o lm35 vem calibrado e sua escala é 10mv por grau centigrado...

Ao invés de ficar fazendo milhares de leituras, ou seja não coloque a rotina de leitura da temperatura no loop do programa diretamente!

Crie uma rotina de delay ex.: 2 segundos e a cada estouro desse delay é feita a leitura da temperatura...assim voce fica com um termometro estavel e mais preciso...

Eu acabei de fazer um termometro desses ele tem 4 digitos e mostra as horas também com base no 1307DS,

No meu caso utilizei um tempo de alternancia de 5 segundos aonde faço a leitura do LM35 ou do DS 1307...

Boa sorte,

MensagemEnviado: 05 Mar 2009 16:57
por kaoalex
Mais mastigado que isso só se eu montar para vc!! rs...
Boa diversão!

Driver LCD
http://www.ccsinfo.com/forum/viewtopic.php?t=24661

Esquema do Delta sigma.
(Aconselho a usar um trimpot para ter maior precisão)
Imagem

Exemplo do livro: Microcontroladores PIC – Programação em C do Fábio Pereira

Código: Selecionar todos
#include <16F628A.h>
#fuses INTRC_IO,NOWDT,PUT,BROWNOUT,NOLVP,NOMCLR
#use delay (clock=4000000)
#use rs232(baud=9200, xmit=PIN_B1, rcv=PIN_B2)

#include <regs_16.h>

#bit saida_comp = 0x1F.6 // C1OUT
#bit pino_modul = 0x05.3 // RA3
#bit tris_modul = 0x85.3 // TRISA3
#byte cmcon_reg = 0x1F
#byte vrcon_reg = 0x9F

void inicializa_delta_sigma()
{
   vrcon_reg = 0xEC;
   tris_modul = 0;
   cmcon_reg = 6;
}

long int adc_delta_sigma (long int resolucao)
{
   long int resultado = 0;
   t0cs = 0;  // timer 0 com clock interno
   psa = 1;  // clock tmr0 = 1Mhz
   cmcon_reg = 3;
   while (resolucao)
   {
      tmr0 = 247;  // configura o timer 0
      t0if = 0;  // apaga flag do timer 0
      if (saida_comp)
      {
         pino_modul = 1;
      } else
      {
         pino_modul = 0;
         resultado ++;  // incrementa acumulador de resultado
      }
      resolucao --; // decrementa o contador de ciclos
      while (!t0if);
   }
   cmcon_reg = 6;
   return (resultado);
}

main()
{
   long int valor;
   float val;
   printf ("\r\nADC delta sigma\r\n");
   inicializa_delta_sigma();
   while (true)
   {
      // a conversão até de 14 bits (16384)
      // usando apenas 10 bits

      valor = adc_delta_sigma(1023);
      val = 5 * (float) valor / 1023;


         // imprime os resultados na serial
         printf ("Tensao = %1.4f Volts\r\n",val);
         printf ("Valor = %lu\r\n",valor);
         delay_ms(1000);

   }
}

MensagemEnviado: 05 Mar 2009 19:13
por _blackmore_
Agradeço a ajuda de todos !!

Assim que terminar posto o resultado para os amigos ..

abrax!

MensagemEnviado: 06 Mar 2009 19:27
por cmte
kaoalex,

Valeu!

MensagemEnviado: 12 Abr 2009 21:48
por _blackmore_
depois de fuçar, montar e funfar o termômetro me ocoreram dúvidas ... talvez sejam coisas banais mas preciso entender e acabar com as dúvidas.
Vamos lah ...
Montei o termômetro com um pic, utilizei 8bits de resolução ... a tensão de referência do circuito é de 4.98volts (doido né?), a cada 3 segundos eu mostro o valor em um display LCD onde deixei 2 casas decimais para criar esta pulguinha na zoréba.
Sendo que o LM35 é linear de 10mV por grau, como estou conseguindo mostrar no display 25.31ºC se a resolução em bits do uC é de 0,01945volts (19,45mV) ???
Peguei um termômetro da marca Coel emprestado com um amigo, e este termômetro tem resolução de 0,1ºC e atualização a cada 10 segundos.
Alterei o funcionamento do meu termômetro para ficar igual o Coel e poder comparar resultados :)
Bem, valor chega com uma diferença mínima de 0,3ºC até 0,8ºC do termômetro comercial. então pergunto .. será que fiz algo errado? será que está tudo certo? ou está melando de marron minha montagem?
vou postar um trecho do programa para que possam me esclarecer esta dúvida.
Agradeço qqer comentário sobre este assunto

abrax!

Pic com cristal de 4MHz, AD com 8 bits

Código: Selecionar todos
   //  valor entrada RA2
      
      set_adc_channel(2);
      dado1 = read_adc(); // efetua a conversão A/D
      valor1 = ((dado1*498)/255);

   // compara valor e imprime o valor termometro 1 no display em Celsius

      if(valor1 != valor2){  // se diferente da medida anterior
            lcd_escreve ('\f');      // Apaga o display
            lcd_pos_xy(1,1);      // Posiciona cursor
            printf (lcd_escreve,"Temp ent %3.2f C ",valor1);   //Escreve valor no display

MensagemEnviado: 13 Abr 2009 09:27
por kaoalex
_blackmore_,

Acredito que esteja tudo certo sim.

Vamos considerar a tensão 4,98 como ref. e adc de 8 bits.
25,31º C = 0,2531 volts ≈ 13 bits (13,01076305)

Ou seja o adc lê 13 bits ≈ 25,29º C.

A próxima temperatura que ele será capaz de ler é de aproximadamente 27,23º C (14 bits).

edição para correção ortográfia

MensagemEnviado: 14 Abr 2009 01:24
por jorgeluiz
uma vez montei um termometro usando o delta-sigma do 16f628, com uma tensao de 5,12 volts em 9 bits. Dai' montei duas tabelas. Isso da exatamente a resoluçao de 0,1 grau. (eu multipliquei a tensao de saida do lm35 por 10 com A.O.)

MensagemEnviado: 14 Abr 2009 18:15
por _blackmore_
bom galera ... vi que estou fazendo coisa feia na resolução do bichin ...
obrigado ae a atenção dos amigos ... vou tentar resolver de alguma forma para obter a precisão necessária e espero conseguir postar os reesultados.
abrax!