Ir ao conteúdo
  • Cadastre-se

LCD + PIC = Relógio e temperatura


Posts recomendados

Olá, boa noite a todos, gostaria novamente de uma ajuda.

Pela primeira vez irei mexer com PIC e LCD, queria começar com um projeto que é bastante utíl, gostaria de fazer um LCD que mostrasse a temperatura ambiente, usando um LM35 ou um sensor barato, e que mostrasse a hora também.

Por exemplo:

____________________________

| TEMPERATURA: | <LCD

|_________25ºC______________| <LCD

Depois de alguns segundos:

____________________________

| HORA ATUAL: | <LCD

|_______18:23_______________| <LCD

Depois de alguns segundos, volta para a temperatura, e fica mudando.

Existe alguma forma de fazer isso? Qual LCD terei de usar? http://www.soldafria.com.br/display-lcd-alfanumerico-c-35_103.html

Qual PIC terei de usar?

http://www.soldafria.com.br/microcontrolador-pic-c-27_82.html?mostra_id=0&itens_pag_id=0

Eu não faço a minima ideia de como programar PIC, será que acho um código para esse sistema?

Bom, se tiver algum jeito de fazer, que seja o mais simples e mais barato possível.

Obrigado a todos.

Link para o comentário
Compartilhar em outros sites

Use esse LCD:

http://www.soldafria.com.br/display-lcd-16x2-com-back-fundo-azul-letra-branca-80x36x13-p-1947.html

Use um 16F877A para controlar tudo: http://www.soldafria.com.br/microcontrolador-pic16f877a-ip-p-580.html

O sensor pode ser o LM35.

você já tem gravador de PIC aí? você precisa fazer um código e depois gravar o PIC com o gravador.

No www.roboticasimples.com você acha desse gravador simples serial. Custa 25 reais. Lembre-se q seu computador precisa da porta serial.

Posso até fazer o código pra você pois não é muito difícil. Mas responda o acima.

Melhor! Como estou sem meu PC pessoal esses dias, deixarei os colegas aprendizes e os já experts fazerem esse projeto.

Mãos à obra pessoal.

Falou

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

a certo. então acho melhor deixar de lado esse projeto por enquanto, amanha irei dar uma passada no ferro velho, e ver se acho alguma sucata eletrônica por lá, para mim retirar algo.

Ai vamos ver o que posso fazer. Caso acho um LCD irei dar continuidade, caso contrario, agradeço sua ajuda.

Link para o comentário
Compartilhar em outros sites

Eu ja coloquei isso em outro tópico mas ai vai:

Compre um desses: LINK

Se chama LaunchPad. É um kit de desenvolvimento da Texas para o MSP430. Ele custa 4 dolares e 30 e o frete é (ou pelo menos era) gratuito. Você so precisa de um cartão internacional. Nele vem um gravador para o MSP430, um MSP430, 2 leds e um botão (na verdade 2, mas o segundo é RST) e o MSP430 que vemjunto ja tem um sensor de temperatura interno. Além disso ele também tem um conversor USB para serial. Com isso você ja faz tudo que quer. O que você vai precisar é aprender como programar ele. A programação dele pode ser feita totalmente em C. O LCD não tem como... se você for de são Paulo eu ja achei na Multcomercial na Santa Infigenia por 10 Reais. Porém eu não sou

bonzinho que nem o Matheus... eu não vou fazer o codigo... porém não é nada complicado.. Você so vai precisa montar a placa para conectar o LCD aos pinos... Esse kit ja vem com um cristal de RTC... e você pode usar esse cristal, e o oscilador interno para alimentar a logica. O sensor não é MUITo preciso e você deve calibrar ele.. mas ... não custa nada fazer isso.. a não ser pensar...

Abs

Link para o comentário
Compartilhar em outros sites

bem já vi que a brincadeira vai ficar cara. não tem um PIC mais barato, visto que ele só será usado para isso?

Claro!,não precisa desperdiçar um 16F877 só para isso!

voce pode usar um 16F84 ou 16F628 + LCD+horas+temperatura.

Ja cansei de postar o Link,o projeto é feito em ASM(por isso é eficaz),é so compilar pelo MPLAb,caso não encontre o 16F84(que ja não é mais fabricado)pode procurar alguem que o fez no 16F628.

http://www.4shared.com/file/ojWFwRbW/zip.html

Link para o comentário
Compartilhar em outros sites

Claro!,não precisa desperdiçar um 16F877 só para isso!

voce pode usar um 16F84 ou 16F628 + LCD+horas+temperatura.

Baixei e analisei o circuito.

Só o DS1621 que você recomenda custa 17 reais na farnell: http://www.farnellnewark.com.br/cidigtermometroetermostato8pdip,product,1188024,4375591.aspx

Sem falar no 16f84 que custa 8 reais na solda fria: http://www.soldafria.com.br/microcontrolador-pic16f84a-04p-p-579.html

E o Lt1173 que custa absurdos 26 reais na farnell: http://www.farnellnewark.com.br/searchresults.aspx?dskeyword=lt1173&idproducttype=0&idproductcolor=0&iddept=0&nupricerangestart=1&nupricerangeend=9999999&type=2

Nesse caso, acredito q um 16F877A + LM35+LCD fique mais em conta e mais simples de fazer mesmo a ideia do colega acima sendo válida.

Falou

Link para o comentário
Compartilhar em outros sites

alem disso é profissional,não creio que ele queira montar um trambolho só para mostrar a temperatura e horas.

Pelo histórico do membro solicitante, percebo que é um usuário novo ao mundo da eletrônica. Já no 3º post já dá sinal de desistência por causa do preço. Isso leva a crer q seja um projeto pessoal e nao profissonal.

Sendo que a parte em vermelho nem faz parte do circuito do relógio e a adição de um LM35 ao circuito ocupa apenas 3 pinos na protoboard. O LM35 é do tamanho e um tranistor pequeno. Tendo um resultado como "trambolho" feito por mim uma vez, sem a parte da temperatura. Veja como é enorme (ironia):

8QOBu.jpg

Acho que simplesmente trocando o PIC16f877A pelo PIC16F628A

Nesse caso, um 16f628 não serve por não possuir um conversor analógico-digital sendo necessário um sensor de temperatura digital, que é mais caro, ou m AD externo. Aí nesse caso, perde-se a vantagem de uso do PIC mais barato.

No mais é isso.

Falou

Link para o comentário
Compartilhar em outros sites

Bem, estou verificando aqui e acho que vou dar continuidade ao projeto.

http://www.soldafria.com.br/display-lcd-16x2-com-back-fundo-azul-letra-branca-80x36x13-p-1947.html

Já o pic, pelo tópico não entendi qual é o mais viavél de utilizar, assim falando, já poderei perguntar ao professor se ele tem gravador para tal PIC, assim que decidido.

Link para o comentário
Compartilhar em outros sites

#include <16F887.h>

#device adc=10

#fuses HS,NOWDT,NOPROTECT,NOLVP,NOMCLR

#use delay(clock=20000000)

#include <lcd.c>

int value;

float tensão, temp;

void main() {

setup_adc( ADC_CLOCK_INTERNAL );

setup_adc_ports( sAN0 );

set_adc_channel( 0 );

lcd_init();

while (TRUE) {

value = read_adc();

tensão = (value*0.004888);

temp = (tensão/0.01);

delay_ms(300);

lcd_gotoxy(1,1);

printf(lcd_putc,"\fTemp.: %3.1f\nIFBO & BB Corp",temp);

delay_ms(10);

}

}

Aqui o Codigo amigo, essa ai é apenas uma base para a temperatura, mas não é difícil implementar um relogio com pic ... não será dos mais precisos, mas funciona =) abraços

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Montei esse projeto do matheus,ate adaptei para display sete segmentos ,montei os dois e em pratica funciona perfeito e é pontual.........O meu tbem lia temperatura,dai depois inovei,lia temperatura e luz ambiente tbem.........bom mais esse é para outro projeto,simbora com meu propeller que é o relogio que to fazedo agora.kkkkkkkk.So pra constar ,meu propeller tbem vai medir temperatura kkkkkkkkkk,aff vai ficar muito louco

Link para o comentário
Compartilhar em outros sites

Acabei fazendo aqui. Fiz de um código que eu já tenho aqui. O circuito não utiliza RTC. É um código de teste e exemplo. Serve para você poder estudar ele.

Como o circuito deve ser:

eVKfH.jpg

O código fonte:


Programa teste para fazer um relógio com o 16F877A
Implementada funções que mostram data e dia da semana
Teste promo_version v1.1
by MatheusLPS (Koala)
=============================================================================*/

#include <16F877A.h> //O PIC utilizado, obrigatório!
#device adc=10
#FUSES NOWDT //Sem Watch dog, evitando reset
#FUSES XT //Crystal de oscilação igual a 4mhz
#FUSES PUT //Tempo de início do PIC
#FUSES NOPROTECT //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection


#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!

#include <lcd.C> //Inclusão da biblioteca de LCD. Obrigatório!

// D0 enable //Pinos utilizados pelo LCD. Podem ser alterados.
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7

/*=====================
Meu Botões:
=======================*/

#define BOTAO1 PIN_B0 //Botão de escolha de ajuste das funçoes.
#define BOTAO_INCREMENTO PIN_B1 //Botão incremento de variáveis.
#define BOTAO_DECREMENTO PIN_B2 //Botão de decremento das variáveis.
//Foram utilizados resistores pull-up e
//pull-down em todos os botões para
//evitar ruídos.

/*=====================
Minhas variáveis:
=======================*/

int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1.
int s=0; //Variável dos segundos, incrementa na metade de q.
int m=0; //Variável dos minutos. 0 a 59
int h=0; //Variável das horas. 0 a 23.
int contador=0; //Variável de controle do botão de ajuste.
int ndia_semana=1; //Variável dos dias da semana, é associada a uma string.
int dia=1; //Variável dos dias do mês. 0 a 31.
int mes=1; //Variável dos meses. 0 a 12.
int16 ano=2010; //Variável dos anos. 2000 a 2099.

int16 q1,q2;
float p;

/*=====================
Minha Interrupção:
=======================*/

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
set_timer1 (3036); //Preload do Timer1
}

/*=====================
O programa Principal:
=======================*/
void main()
{
lcd_init(); //Inicializa o LCD (obrigatório)!

/*lcd_gotoxy (2,1); //Coluna 6, linha 1.
lcd_putc("Projeto Tempo:");
delay_ms(2000);
lcd_gotoxy (2,2);
lcd_putc("Com PIC16F877A");
delay_ms(2000);
lcd_putc ("\f");
lcd_gotoxy (2,1);
lcd_putc("Promo Version");
delay_ms(2000);
lcd_gotoxy (6,2);
lcd_putc ("1.10");
delay_ms(2000);
lcd_putc ("\f");
lcd_gotoxy (7,1);
lcd_putc("by");
lcd_gotoxy (2,2);
lcd_putc ("Matheus Koala");
delay_ms(3000);
lcd_putc ("\f");
delay_ms(1000);
lcd_gotoxy (1,1);
lcd_putc ("Iniciando");
lcd_gotoxy (10,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (11,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (12,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (13,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (14,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (15,1);
lcd_putc (".");
delay_ms(500);
lcd_gotoxy (16,1);
lcd_putc (".");
delay_ms(500);
lcd_putc ("\f");
delay_ms(1000);*/

setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_DIV_8); //Fuente de reloj RC
set_adc_channel(0); //Habilitación canal0
delay_us(20);

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while(TRUE) //Loop Principal
{
/*=====================================================================
Teste do botão de ajuste. A medida que é precionado, a variável contador
incrementa e as diversas funções de ajustes podem ser efetuadas. São 6
funções de ajuste, HORA, MINUTO, DIA DA SEMANA,DIA DO MES, MÊS e ANO. A
cada ajuste de uma função, o menu principal com todas as informações é
mostrado.
=====================================================================*/

if (input(BOTAO1)) //Teste do botão.
{
delay_ms (100); //Para evitar retorno.
if (contador>11) //Se maior q 11, zera o contador.
{
contador=0;
}

contador++; //Incremento da variável contador.
}

switch (contador) //Depois de incrementada, a variável CONTADOR
{ //assume um dos casos a seguir:
case 1: //Menu de ajuste da HORA.
{
if (input (BOTAO_INCREMENTO)) //Incrementa a variável H(hora).
{
delay_ms (75);
h++;

if (h>23) //Se a hora for maior que 23, reset.
{
h=0;
}
}

if (input (BOTAO_DECREMENTO)) //Decrementa a variável H(hora).
{
delay_ms (75);
h--;

if (h==255) //H é uma variável inteira de 8 bits.
{ //Quando é decrementada para um valor
h=23; //menor que zero, se torna 255. Ou seja,
} //deve voltar para 23.
}

q=0; //Quando se está em algum menu, Q é resetada.
lcd_gotoxy (1,1); //Vá para a coluna 1 e linha 1 do LCD.
printf (lcd_putc, "\fAjuste Hora:%02u", h); //Escreva com 2 digitos a variável H.
delay_ms (100); //Mantenha na tela.
break;
}

case 3: //Menu de ajuste do MINUTO. Idem ao anterior.
{
if (input (BOTAO_INCREMENTO))
{
delay_ms (75);
m++;

if (m>59) //Diferente aqui.
{
m=0;
}
}

if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
m--;

if (m==255) //Igual aqui.
{
m=59;
}
}

q=0;
lcd_gotoxy (1,1);
printf (lcd_putc, "\fAjuste Minuto:%02u", m);
delay_ms (100);
break;
}

case 5: //Menu de ajuste do DIA DA SEMANA.
{
/*=====================================================================
Ajuste do DIA DA SEMANA. A função ficou meio bagunçada. Pesquisarei
um pouco sobre como trasformar uma string numa variável. Só
consegui fazer isso com 1 (um) caracter, mas não é o ideal. Depois disso,
provavelmente essa parte ficará mais enxuta.

A função ficou assim: Uma variável chamada ndia_semana(número dia da
semana) é incrementada de 1 a 7. Cada número é associado a um dia da
semana. 1 é Domingo, 2 é Segunda e assim por diante. Se ndia_semana for
maior que 7, ela é resetada em 1 de novo. Utilizei a função SWITCH para
associar cada número de 1 a 7 a cada dia da semana.
=====================================================================*/
if (input (BOTAO_INCREMENTO))
{
delay_ms (100);
ndia_semana++;
if (ndia_semana>7)
{
ndia_semana=1;
}

}

if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
ndia_semana--;
if (ndia_semana==255)
{
ndia_semana=7;
}
}

switch (ndia_semana)
{
case 1:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nDomingo ");
delay_ms (100);
break;
}

case 2:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nSegunda ");
delay_ms (100);
break;
}

case 3:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nTerca ");
delay_ms (100);
break;
}

case 4:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nQuarta ");
delay_ms (100);
break;
}

case 5:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nQuinta ");
delay_ms (100);
break;
}

case 6:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nSexta ");
delay_ms (100);
break;
}

case 7:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "\fDia da Semana:\nSabado ");
delay_ms (100);
break;
}
}

q=0; //Variável q sempre resetada nos menus.
break;
}

case 7: //Menu de ajuste do DIA DO MES. Idem ao caso 3.
{
if (input (BOTAO_INCREMENTO))
{
delay_ms (100);
dia++;
if (dia>31)
{
dia=1;
}

}

if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
dia--;
if (dia==0)
{
dia=31;
}
}

q=0;
lcd_gotoxy (1,1);
printf (lcd_putc, "\fAjuste dia Mes: \n%02u", dia);
delay_ms (100);
break;
}

case 9: //Menu de ajuste do MES. Idem ao caso 3.
{
if (input (BOTAO_INCREMENTO))
{
delay_ms (100);
mes++;
if (mes>12)
{
mes=1;
}

}

if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
mes--;
if (mes==0)
{
mes=12;
}
}

q=0;
lcd_gotoxy (1,1);
printf (lcd_putc, "\fAjuste Mes: \n%02u", mes);
delay_ms (100);
break;
}

case 11: //Menu de ajuste do ANO. Idem ao caso 3.
{
if (input (BOTAO_INCREMENTO))
{
delay_ms (100);
ano++;
if (ano>2099)
{
ano=2000;
}

}

if (input (BOTAO_DECREMENTO))
{
delay_ms (75);
ano--;
if (ano==1999)
{
ano=2099;
}
}

q=0;
lcd_gotoxy (1,1);
printf (lcd_putc, "\fAjuste Ano: \n%Lu", ano);
delay_ms (100);
break;
}

default: //Menu principal. Mostra todas as informações.
{
s=q/2; //A variável Q incrementa a 2Hz, então os segundos
//devem ser a metade.
if (s==60) //Se for igual a 60, reset em Q e S. M incrementa.
{
q=0;
s=0;
m++;
}

if (m>59)
{
m=0;
h++;
}

if (h>23) //Se H(horas) for maior q 23, reset. DIA DA SEMANA
{ //e DIA DO MÊS incrementam.
dia++;
ndia_semana++;
h=0;
}

if (ndia_semana>7)
{
ndia_semana=1;
}

switch (ndia_semana) //Os DIAS DA SEMANA só alteram sozinhos no menu
{ //principal. Idem ao caso 5.
case 1:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "DOMINGO ");
delay_ms (100);
break;
}

case 2:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "SEGUNDA ");
delay_ms (100);
break;
}

case 3:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "TERCA ");
delay_ms (100);
break;
}

case 4:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "QUARTA ");
delay_ms (100);
break;
}

case 5:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "QUINTA ");
delay_ms (100);
break;
}

case 6:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "SEXTA ");
delay_ms (100);
break;
}

case 7:
{
lcd_gotoxy (1,1);
printf (lcd_putc, "sábado ");
delay_ms (100);
break;
}
}

switch (mes) //Para saber se um mês possui 31, 30 ou 28 dias.
{ //Numa versão mais nova, farei essa rotina mais enxuta.
case (1):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}

case 2:
{
if (dia>28)
{
dia=1;
mes++;
}
break;
}

case (3):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}

case (4):
{
if (dia>30)
{
dia=1;
mes++;
}
break;
}

case (5):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}

case (6):
{
if (dia>30)
{
dia=1;
mes++;
}
break;
}

case (7):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}

case (8):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}

case (9):
{
if (dia>30)
{
dia=1;
mes++;
}
break;
}

case (10):
{
if (dia>31)
{
dia=1;
mes++;
}
break;
}

case (11):
{
if (dia>30)
{
dia=1;
mes++;
}
break;
}

case (12):
{
if (dia>31)
{
dia=1;
mes=1;
ano++;
}
break;
}
}
q1 = read_adc(); //Lectura canal0
p = (q1*5.0*100)/1024;

lcd_gotoxy (9,1);
printf (lcd_putc, "%02u:%02u:%02u\n%02u/%02u/%Lu %2.1f%C", h, m, s, dia, mes, ano,p,0xdf);
delay_ms (100);
break;
}
}
}
}
/*=============================================================================

Arquivos para download: Relogio_LCD_2

Essa versão aqui não tem a temperatura mas tem fotos e vídeos da 1ª versão: Relogio_LCD

Falou

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Hmm Matheus, muito bom mesmo.

Gostei, ficou do jeito que queria, o circuito é só aquilo ou tem algo a mais?

Como já disse, não manjo nada de PIC. Se tiver mais, poderia postar completo?

O gravador irei ver com meu professor para ver se ele possui. O PIC e o LCD vou juntar uma grana e comprar. Mas tá perfeito, o LCD vai ser aquele branco com back azul. E o PIC 16F877A

Link para o comentário
Compartilhar em outros sites

E o cristal, aqueles capacitores que tem no video? Nada?

Para utilizar a energia, pode usar uma daquelas fontes, carregadores de celular? Devo ter uma de 5V. Vcc, seria o positivo, ou tem que fazer o 7805?

Matheus, seu relógio está com um atraso enorme.

Veja as prints:

Hora de inicio: http://img24.imageshack.us/img24/9388/184100.png Os dois sincronizados.

Hora de termino: http://imageshack.us/m/33/2682/192112.png Quase 10 minutos de diferença após +- 50 minutos depois.

Teria como arrumar isso?

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...