Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Miguel73

PIC16F877A-controle temperatura

Recommended Posts

Olá Pessoal! Sou iniciante no Forum do Hardware e peço ajuda sobre um projeto (TCC).

Projeto: Controle de temperatura em ambientes fechados (indústria, comércio, residencial)

Hardware: um pic16f877a, um lm35(sensor temperatura), display LCD (lm016 -16:2), teclado matricial.

Configuração do hardware: portas do pic: portA(0) = saída p/acionar um relé, portA(1)=entrada analógica p/ saída do lm35; portB(0 a 3)=entrada para sinais das colunas do teclado, portB(7 a 4)=saídas para linhas do teclado; portD(7 a 0)=saídas digitais para o display LCD - barramento de dados; portE(0)=RS do LCD, portE(1)=E = enable do LCD.

Algorítimo (resumido) do projeto:

1) lê teclado;

2) imprimir tecla no LCD;

3) salvar tecla primida - aqui o programa deve ser orientado a salvar duas teclas de 00 a 99 fins comparação com a saída do ADC do PIC após converter sinal analógico do portA(1);

4) lê entrada analógica (RA1);

5) ligar o ADC do PIC fins converter uma mostra do sinal analógico do portA(1);

6) saída do ADC imprimir no LCD;

7) saída do ADC comparar com valores das teclas primidas (00 a 99) do teclado matricial;

8) se teclas primidas =< saída ADC do PIC

então RA0 = 0

se não RA0 = 1.

Minha dificuldade consiste em como salvar as teclas primidas e comparar seus valores que estão em "opcode" com a saída do conversor ADC do PIC.

Desde já agradeço a quem possa sugerir uma ideia para resolver este problema.

Com relação ao teclado: é um teclado matricial 4 x 4. O portB está assim organizado:

RB0 a RB3 - ativam as colunas; RB4 a RB7 - lêm o estado das linhas. A linha 1 = teclas 0, 1, 2, 3; linha 2= 4, 5, 6, 7; linha 3= 8, 9, 10, 11; linha 4= 12, 13, 14, 16. Como não serão usados os numerais de 10 a 15, logo, no programa (linguagem Assembly) será ignorada a linha 4 e na linha 3 o numeral 10.

Exemplo de estados lógicos dos bits do portB para o dígito "0" (zero) - 0 0 0 1 0 0 0 1 (bits RB0 e RB4 em nível lógico 1 os demais, 0), ou seja, o programa vai enviar nível alto para o bit RB0 e lê o RB4.

Meu "cérebro", até o momento, não conseguiu encontrar um modo de "salvar" as teclas primidas, por exemplo, 25 que representam 25°C, para comparar com a saída do AD e fazer a comparação:

SE TECLADO =< SAÍDA ADC

ENTÃO RA0=0

SE NÃO

RA0=1.

Ok, Matheus. Sem problemas. Vou alterar os pinos do portA e portC. RB0 = entrada analógica para o LM35 e RC0 = saída digital p/acionar um relé.

A linguagem de programação que estou usando é "ASSEMBLY".

A ideia do projeto é: lê o teclado, imprimir teclas no LCD (00 a 99), salvar teclas primidas (setadas) para comparar com o valor da saída do ADC do PIC, lê entrada analógica, converter (ADC) e comparar saída do AD com as teclas setadas. Por exemplo: se for digitado as teclas 2 e 5 (o programa deve imprimir no LCD "25"), salvar em alguma posição de memória e comparar com a saída do ADC. Se o valor 25 =< saída do ADC, RC0 = 0, se não, RC0 =1.

Editado por Miguel73
responder ao MatheusLPS e acrescentar informações

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu nao entendi bem a sua duvida quanto a salvar as teclas e comparar com o valor do AD. Para comparar basta voce condicionar o seu sinal analogico para a faixa de temperatura desejada, fazer uma leitura periodica do AD, converter o sinal digital para o seu equivalente em graus e comparar (usar um If). Quanto a tecla, se explique melhor

Um abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

[off]ahhh nao.. mais um projeto....

sério, tô cansando de fazer projeto pra galera.....

vocês estão com preguiça de programar?[/off]

Respondendo a sua pergunta....

você quer ler o canal adc e marcar um "setpoint". Um valor minimo e maximo para a temperatura para q seus pinos sejam RA0 = 0 se não RA0 = 1.

Como o colega Sink disse, você só deve usar um if. você lê o ADC, condiciona o sinal e compara.

Mas não compreendo porq você quer q seu PORTA seja 0 ou 1... esse port é a entrada analógica nesse e na maioria dos pics.

Acredito q você queira por exemplo: Se a temperatura for maior q 30º C, acenda um led.

Mas para te ajudar, preciso saber qual linguagem de programação você está acostumado.

E desculpe o desabafo no inicio do topico...

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezados, tenho um protótipo onde estou usando lm35, pic 16f877a, celula de peltier. Quero reaproveitar a água, esfriando e esquentando a mesma de acordo com o usuário, porém o lm35 esta oscilando muito, alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já colocou um pequeno capacitor na saída do LM35?

Qual o comprimento do cabo?

Ta usando amplificador?

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara minha logica é meio doida mais olha,se tu ler o teclado e salvar tipo a dezena e a unidade digitada no teclado tipo :30 unidade=0 ,dezena=3 ,e pegar o resultado do ad e fazer a seguinte conta ,dezena=resultado/10 ,você tem a dezena, unidade=(resultado*dezena)/10,ai é so comparar, ser forem iguais você aciona o led.É uma logica doida mais acho q funciona. kkkkkkkkkkkkkkkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites
Minha dificuldade consiste em como salvar as teclas primidas e comparar seus valores que estão em "opcode" com a saída do conversor ADC do PIC.

Se sua dúvida é só esta,voce deve postar o código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue o código que estou utilizando, esta oscilando muito o Lm35.

#include "D:\Programa Projeto Final\ProjetoPrograma.h"

#include "D:\Programa Projeto Final\Flex_LCD.c"

void main();

int readTMP(int numeroLM);

int convVolt_TMP(long int tensão);

void atualizaLCD();

void tmpAcima();

void controlaCelulas();

void modoVentilacao();

int tempSet = 0;

int ventilacao = 0;

#INT_RB

void setTMP(void)

{

while(input(PIN_B4) == 1)//if (input(PIN_B4) == 1)

{

disable_interrupts(INT_RB);

delay_ms(10);

tempSet++;

enable_interrupts(INT_RB);

return;

}

if (input(PIN_B5) == 1)

{

disable_interrupts(INT_RB);

delay_ms(10);

tempSet--;

enable_interrupts(INT_RB);

return;

}

if (input(PIN_B6) == 1)

{

if (ventilacao == 0)

{

disable_interrupts(INT_RB);

ventilacao++; //Liga a função somente ventilação.

enable_interrupts(INT_RB);

return;

}

if (ventilacao == 1)

{

disable_interrupts(INT_RB);

ventilacao--;

enable_interrupts(INT_RB);

return;

}

}

}

void main()

{

setup_ADC_ports(RA0_RA1_RA3_ANALOG);

setup_adc(ADC_CLOCK_INTERNAL);

set_adc_channel(0);

enable_interrupts(GLOBAL|INT_RB);

lcd_init();

tempSet = 25; // Seta a temperatura inicial interna para 25 graus;

while(1)

{

if (ventilacao == 1)

{

lcd_putc('\f');

printf(lcd_putc, "Modo ventilador ON!");

modoVentilacao();

delay_ms(250);

}

if (ventilacao == 0)

{

tmpAcima();

atualizaLCD();

controlaCelulas();

}

}

}

void modoVentilacao()

{

output_bit(PIN_D4, 0);

output_bit(PIN_D5, 0);

output_bit(PIN_D7, 0);

}

void atualizaLCD()

{

lcd_putc('\f');

printf(lcd_putc, "INT:%uC EXT:%uC\nEXIT:%uC SET:%uC %u", readTMP(0), readTMP(1), readTMP(3), tempSet, ventilacao);

delay_ms(250);

}

int convVolt_TMP(long int tensão)

{

tensão++;

return (tensão * 4 + ((int32)tensão * 113)/128)/10;

}

int readTMP(int numeroLm)

{

set_adc_channel(numeroLm);

return convVolt_TMP(read_adc());

}

/*

Caso o usuário set a temperatura interna acima da temperatura de leitura do

termometro interno emite um aviso no LCD e

*/

void tmpAcima()

{

if (tempSet > readTMP(0) )

{

lcd_putc('\f');

printf(lcd_putc, "Temperatura\n Int. << Set.");

delay_ms(250);

return;

}

return;

}

/*

Caso a temperatura interna seja maior que 5 gruaus da temperatura alvo liga as

duas séries de células de Peltier;

*/

void controlaCelulas()

{

//7 = 33 - 25

signed int difTMP = 0;

difTMP = readTMP(0) - tempSet;

if (difTMP < 0 || difTMP == 0)

{

output_bit(PIN_D5, 0);

output_bit(PIN_D4, 0);

output_bit(PIN_D7, 0);

if (difTMP <= -5)

{

output_bit(PIN_D6, 0);

}

else

{

output_bit(PIN_D6, 1);

}

}

if (difTMP > 5)

{

output_bit(PIN_D5, 1);

output_bit(PIN_D4, 1);

output_bit(PIN_D6, 1);

output_bit(PIN_D7, 1);

}

if ((difTMP < 5 && difTMP > 0) || difTMP == 5)

{

output_bit(PIN_D5, 1);

output_bit(PIN_D4, 0);

output_bit(PIN_D7, 1);

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites
16. Como não serão usados os numerais de 10 a 15, logo, no programa (linguagem Assembly) será ignorada a linha 4 e na linha 3 o numeral 10.

voce citou Assembly,se estivesse em ASM talvez ja teria uma rotina pronta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×