Programa Para Monitorar Temperatura Com LM35 e PIC12F675

6

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

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

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

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

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

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

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