Programa Para Monitorar Temperatura Com LM35 e PIC12F675
Click here to load reader
Transcript of Programa Para Monitorar Temperatura Com LM35 e PIC12F675
![Page 1: Programa Para Monitorar Temperatura Com LM35 e PIC12F675](https://reader037.fdocumentos.com/reader037/viewer/2022100406/5571fb12497959916993dcaf/html5/thumbnails/1.jpg)
Programa para monitorar temperatura com LM35 e PIC12F675
H. Limborço e J.M.T. Roquette
O objetivo é montar um circuito que faça leitura de temperatura através do LM35
e responda de forma diferente se for noite ou dia. Durante a noite, o programa deve acionar
uma buzina e acender o led vermelho (verde) se a temperatura estiver acima (abaixo) da faixa
desejada e durante o dia, não é necessário soar a buzina.
A faixa de temperatura de trabalho escolhida é entre 45°C e 60°C, que de acordo
com as curvas de calibração do LM35 correspondem a uma faixa 45mV até 60mV.
O circuito para essa montagem é indicado na figura, onde os valores dos
componentes estão incorretos e os valores que devem ser usados estão indicados a seguir.
O amplificador em destaque foi ajustado para ganho de 46, já que a saída do
LM35 é na faixa de 0~100mV na região de trabalho desejada.
![Page 2: Programa Para Monitorar Temperatura Com LM35 e PIC12F675](https://reader037.fdocumentos.com/reader037/viewer/2022100406/5571fb12497959916993dcaf/html5/thumbnails/2.jpg)
R1= 2,2k R5=220Ω Relé: 12v Iop≈100mA
R2= 100k R6=220Ω LDR: Rclaro≈50kk / Rescuro≈150k
R3=500Ω R7=100k
R4=100k Transistor BC639
Como o valor da corrente de operação do relé é da ordem de 100mA e a corrente
máxima que o PIC pode fornecer em qualquer saída é de 25mA, o transistor BC639 foi usado
para operar o relé. Como β=20, a corrente necessária na base é da ordem de 5~10mA,
determinando o valor do resistor R3. O resistor R4 é usado para impedir que o relé opere
quando a saída esteja em nível baixo, mantendo a tensão na junção BE fixa.
O resistor R7 foi dimensionado para que a tensão no comparador esteja acima de
2,5V quando for noite e abaixo de 2,5V quando for dia.
----------Inicio do código---------- #include <htc.h>
#define _XTAL_FREQ 4000000
#define noite COUT
#define red GPIO5
#define green GPIO4
#define buzz GPIO2
__CONFIG (UNPROTECT & PWRTDIS & BORDIS & WDTDIS & MCLRDIS & INTIO);
unsigned char n, count, v, f;
unsigned int T, tmax, tlow;
void delay (unsigned char t)
for (count=0;count=t;count++)__delay_ms(100 );
bit check ()
v=0;
f=0;
for (count=0; count<10; count++)
if (GPIO3) v=v+1; else f=f+1;
if (v>f) return 1; else return 0;
unsigned int temp ()
T=0;
for (count=0;count<10;count++ )
GODONE=1;
while (GODONE);
T=(T+ADRESH<<8+ADRESL)/2;
return T;
void main()
//comparador fi cou configurado assim: 0V = 0ºC, 4,6V=100ºC e 0V=0b e 5V=1023b
//
ANSEL=0b0000011; //porta GP0 e GP1 sao entradas analogicas
ADCON0=0b10000001; //justificado a direita, referencia interna (5v), 00 bits inuteis, 00 porta AN0, godone 0, A/D on
CMCON=0b0000010 0; //configurar comparador porta cin- é GP1
TRISIO=0b001011; //GP1: comparador, GP0: entrada analogica, GP3: entrada digital
VRCON=0b10101000; //referencia de tensão para o comparador 50%Vdd
OPTION=~GPPU;
GPIO=0; //T=°C-TensãoLM35 -LidoPeloPI C
tmax=565; //60ºC=2,76V=565b
![Page 3: Programa Para Monitorar Temperatura Com LM35 e PIC12F675](https://reader037.fdocumentos.com/reader037/viewer/2022100406/5571fb12497959916993dcaf/html5/thumbnails/3.jpg)
tlow=424; //45ºC=2,07=424b
while (!check()) ;
//gp3 deve ser pressionado por alguns milisegundos para o programa passar daqui
red=0;
green=1;
delay (5); // tentei funcionalizar o pisca pisca dos led's mas deu muito erro, entao desisti
red=1;
green=0;
delay (5);
green=0;
red=0;
while(1)
#if (noite) //se for noite (ldr ligado ao comparador)
while ((temp()<tlow)||(!che ck())) //se T esta fora do limite e o botao nao esta apertado
buzz=0;
green=1;
delay (5);
buzz=1;
green=0;
delay (5);
while ((temp()>tma x)||(!check ()))
buzz=0;
red=1;
delay (5);
buzz=1;
red=0;
delay (5);
#endif
#if (!noite)
while ((temp()<tlow)||(!che ck())) //se T está fora do limite e o botao nao esta apertado
green=1;
delay (5);
green=0;
delay (5);
while ((temp()>tma x)||(!check ()))
red=1;
delay (5);
red=0;
delay (5);
#endif
red=0;
green=0;
buzz=0;
delay(100); //10 segundos pra resolver o problema da temperatura antes do programa voltar a dar o alarme
------Fim do Código-----
O programa foi compilado com sucesso e utiliza pouca memória do
microcontrolador.
Não foi possível usar o stimulus workbook para gerar o sinal analógico para a
simulação do funcionamento do programa.
![Page 4: Programa Para Monitorar Temperatura Com LM35 e PIC12F675](https://reader037.fdocumentos.com/reader037/viewer/2022100406/5571fb12497959916993dcaf/html5/thumbnails/4.jpg)
O código foi ligeiramente modificado, para introduzir uma função que gera
valores para temperatura, conforme sugerido durante a aula. As partes alteradas do código
estão em vermelho e os atrasos foram comentados para viabilizar a simulação.
O novo programa comportou-se como o planejado.
-----Inicio do Codigo-----
#include <htc.h>
#define _XTAL_FREQ 4000000
#define noite 1
#define red GPIO5
#define green GPIO4
#define buzz GPIO2
__CONFIG (UNPROTECT & PWRTDIS & BORDIS & WDTDIS & MCLRDIS & INTIO);
unsigned char n, count, sGP, v, f;
unsigned int T, tmax, tlow;
void delay (unsigned char t)
for (count=0;count=t;count++)__delay_ms(100 );
bit check ()
v=0;
f=0;
for (count=0; count<10; count++)
if (GPIO3) v=v+1; else f=f+1;
if (v>f) return 1; else return 0;
unsigned int simT ()
static unsigned char UpDwnFlag = 1;
static unsigned int n = 0;
if(UpDwnFlag == 1)
// temperatura subindo
n+=1;
if(n>=30) UpDwnFlag = 0;
else
// temperatura descendo
n-=1;
if(n<=0) UpDwnFlag = 1;
return (545 +n);
![Page 5: Programa Para Monitorar Temperatura Com LM35 e PIC12F675](https://reader037.fdocumentos.com/reader037/viewer/2022100406/5571fb12497959916993dcaf/html5/thumbnails/5.jpg)
unsigned int temp ()
for (count=0;count<10;count++ )
// GODONE=1;
// while (GODONE);
// T=(T+ADRESH<<8+ADRESL)/2;
T=T/2+simT()/2;
return T;
void main()
//comparador fi cou configurado assim: 0V = 0ºC, 4,6V=100ºC e 0V=0b e
5V=1023b
ANSEL=0b0000011; //porta GP0 e GP1 sao entradas analogicas
ADCON0=0b10000001; //justificado a direita, referencia interna (5v), 00 bits inuteis, 00 porta AN0, godone 0, A/D on
CMCON=0b0000010 0; //configurar comparador porta cin- é GP1
TRISIO=0b001011; //GP1: comparador, GP0: entrada analogica, GP3: entrada digital
VRCON=0b10101000; //referencia de tensão para o comparador 50%Vdd
OPTION=~GPPU;
GPIO=0; //T=°C-TensãoLM35 -LidoPeloPI C
tmax=565; //60ºC=2,76V=565b
tlow=424; //45ºC=2,07=424b
T=0;
while (!check()) ;
//gp3 deve ser pressionado por alguns milisegundos para o programa passar daqui
red=0;
green=1;
//delay (5); //tentei funcionalizar o pisca pisca dos led's mas deu muito erro, entao desisti
red=1;
green=0;
//delay (5);
green=0;
red=0;
while(1)
#if (noite) //se for noite (ldr ligado ao comparador)
while ((temp()<tlow)||(!che ck())) //se T esta fora do limite e o botao nao esta apertado
buzz=0;
green=1;
// delay (5);
buzz=1;
green=0;
// delay (5);
while ((temp()>tma x)||(!check ()))
buzz=0;
red=1;
// delay (5);
buzz=1;
red=0;
// delay (5);
#endif
#if (!noite)
while ((temp()<tlow)||(!che ck())) //se T esta fora do limite e o botao nao esta apertado
green=1;
// delay (5);
green=0;
// delay (5);
while ((temp()>tma x)||(!check ()))
red=1;
// delay (5);
![Page 6: Programa Para Monitorar Temperatura Com LM35 e PIC12F675](https://reader037.fdocumentos.com/reader037/viewer/2022100406/5571fb12497959916993dcaf/html5/thumbnails/6.jpg)
red=0;
// delay (5);
#endif
red=0;
green=0;
buzz=0;
//delay(100); //10 segundos pra resolver o problema da temperatura antes do programa voltar a dar o alarme