Você está na página 1de 6

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.
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 (cou nt=0;cou nt=t;count++){__delay_ms(100 );}
}

bit check ()
{
v=0;
f=0;
for (cou nt=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 (cou nt=0;cou nt<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; //con figurar comparador porta cin- é GP1
TRISIO=0b001011; //GP1: comparador, GP0: entrada analogica, GP3: entrada digital
VRCON=0b10101000; //referen cia 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
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.
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 (cou nt=0;cou nt=t;count++){__delay_ms(100 );}
}
bit check ()
{
v=0;
f=0;
for (cou nt=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) U pDwnFlag = 0;
}
else
{ // temperatura descendo
n-=1;
if(n<=0) U pDwnFlag = 1;
}

return (545 +n);


}

unsigned int temp ()


{
for (cou nt=0;cou nt<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; //con figurar comparador porta cin- é GP1
TRISIO=0b001011; //GP1: comparador, GP0: entrada analogica, GP3: entrada digital
VRCON=0b10101000; //referen cia 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);
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
}}