Ir ao conteúdo
  • Cadastre-se

Duduzinho07

Membro Júnior
  • Posts

    5
  • Cadastrado em

  • Última visita

Reputação

0
  1. @MatheusLPG O link que me enviou se trata apenas de um display mostrando data e temperatura. O meu também é assim porém só me falta a temperatura, só que no meu projeto depois de se ajustar a data e hora eu consigo temporizar o horario de ligar e desligar saidas no PIC atraves do display. Exemplo RB0>L 12.00.00 (ligar) D 15:00:00(desligar) Tentei fazer esta função de temporazação no codigo que me enviou do link,porém sem Exito algum, também tentei passar a parte do LM35 pro meu mas não consegui. Será que consegue aplicar a função de temporização naquele ou adicionar o lm35 ao meu ? To quebrando a cabeça, mas não consigo. @MatheusLPS O link que me enviou se trata apenas de um display mostrando data e temperatura. O meu também é assim porém só me falta a temperatura, só que no meu projeto depois de se ajustar a data e hora eu consigo temporizar o horario de ligar e desligar saidas no PIC atraves do display. Exemplo RB0>L 12.00.00 (ligar) D 15:00:00(desligar) Tentei fazer esta função de temporazação no codigo que me enviou do link,porém sem Exito algum, também tentei passar a parte do LM35 pro meu mas não consegui. Será que consegue aplicar a função de temporização naquele ou adicionar o lm35 ao meu ? To quebrando a cabeça, mas não consigo.
  2. Saudações companheiros. Estou fazendo um projeto cuja função é me informar a data e horáio atual com ajuda de um RTC 1307, através de um display LCD, além de temporizar as saidas do pic com horarios que eu escolher atraves do proprio lcd com auxilio de botões. Até então está OK. Minha dificuldade é a seguinte: Como adicionar um sensor LM35 á programação e jogar a informação do mesmo na tela principal?? Assim teria além das infromaçoes de horario também teria a temperatura ambiente no display. Necessito de orientaçoes, agradeço desde já. estou programando no ccs. segue o codigo #include <16F628A.h> #use delay(clock=4000000) #fuses NOWDT,INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, MCLR, NOLVP, NOCPD #use fast_io(a) #use fast_io( #ZERO_RAM //configuração dos ports #byte trisb = 0x86 #byte trisa = 0x85 #byte portb = 0x06 #byte porta = 0x05 //flags #bit tmr1_if = 0x0c.0 //pinos de saída #bit canal1 = 0x05.1 //ra1 pino 18 #bit canal2 = 0x05.0 //ra1 pino 17 #bit canal3 = 0x05.7 //ra1 pino 16 #bit canal4 = 0x05.6 //ra1 pino 15 #bit canal5 = 0x06.1 //rb1 pino 7 #bit canal6 = 0x06.0 //rb1 pino 6 // lcd e chaves #bit en = 0x06.2 //rb2 lcd 'enable' pino 8 #bit rs = 0x06.3 //rb3 lcd 'rs' - comando/dado pino 9 #bit sw_seg = 0x06.4 //rb4 chave segundos db4 pino 10 #bit sw_min = 0x06.5 //rb5 chave minutos db5 pino 11 #bit sw_hora = 0x06.6 //rb6 chave horas db6 pino 12 #bit sw_menu = 0x06.7 //rb7 db7 pino 13 #bit sw_adj = 0x06.7 //rb7 db7 pino 13 #bit db4 = 0x06.4 //rb4 db4 pino 10 #bit db5 = 0x06.5 //rb5 db5 pino 11 #bit db6 = 0x06.6 //rb6 db6 pino 12 #bit db7 = 0x06.7 //rb7 db7 pino 13 // comunicação com o ds1307 #bit sda = 0x05.2 // ra2 sda pino 1 #bit tris_sda = 0x85.2 #bit scl = 0x05.3 // ra3 scl pino 2 //constantes de in-out const int8 tris_out = 0x00;//db7 a db4 saidas const int8 tris_in = 0xf0; //db7 a db4 entradas //CONSTANTES PARA DIA DA SEMANA const int8 semana[]={ 'D','O','M','S','E','G','T','E','R' 'Q','U','A','Q','U','I','S','E','X' 'S','A','B'}; const int8 eep_[]={ 0x24,0x17,0x1e,0x21,0x19,0x1b,0x21,0x31, 0x15,0x21,0x20,0x26,0x24,0x21,0x1e,0x1e, 0x13,0x24,0x1b,0x21,0x25,0x00,0x26,0x17, 0x15,0x20,0x21,0x1e,0x00,0x29,0x25 }; //variáveis globais int8 cnt; int8 r1,pos,vez,val,k,qcan; int8 time[7];//armazena as variáveis do DS1307 após sua leitura int8 cal[6]={0x12,0x03,0x14,0x07,0x05,0x45}; int1 f,fc; //============================================================================== // ROTINAS PARA DS1307 //============================================================================== void delay_m(void){ delay_us(5);} VOID I2C_START(VOID){//INICIA COMUNICAÇÃO 'START' sda=0; scl=1; delay_m(); sda=1; delay_m(); sda=0; delay_m(); scl=0; } void I2C_STOP(void){//ENCERRA COMUNICAÇÃO I2C sda=1; scl=1; delay_m(); sda=0; delay_m(); scl=0; } void CLOCK(void){//CLOCK delay_m(); scl=1; delay_m(); scl=0; } void ACK(void){//envia 'ack' sda=0; clock(); } void NO_ACK(void){//envia 'no ack' sda=1; clock(); } void I2C_WRITE(int8 valor){//ESCREVER 8 BITS NO DS1307 int8 a; for(a=0;a<8;a++){ if(bit_test(valor,7)){sda=1;} else{sda=0;} clock(); valor=valor<<1; } } int8 I2C_READ(void){ //LER 8 BITS DO DS1307 int8 c=0; int8 a; tris_sda=1; for(a=0;a<8;a++){ c=c<<1; if(sda) c++; clock(); } tris_sda=0; return ©; } void ds_write(int8 adr,int8 valor){//escreve 8 bits no endereço informado I2C_START(); I2C_WRITE(0xd0); ACK(); I2C_WRITE(adr); ACK(); I2C_WRITE(valor); ACK(); I2C_STOP(); } int8 ds_read(int8 adr){//le 8 bits do DS1307 no endereço informado int8 a; I2C_START(); I2C_WRITE(0xd0); ACK(); I2C_WRITE(adr); ACK(); I2C_START(); I2C_WRITE(0xd1); ACK(); a=I2C_READ(); NO_ACK(); I2C_STOP(); RETURN (a); } void ds_read8(void){//ler todos os registradores de tempo int8 a; I2C_START(); I2C_WRITE(0xd0); ACK(); I2C_WRITE(0); ACK(); I2C_START(); I2C_WRITE(0xd1); ACK(); for(a=0;a<7;a++){ time[a]=I2C_READ(); if(a==6)no_ack();else ACK(); } I2C_STOP(); } void ds_write8(void){//escreve todos os registradores de tempo int8 a; I2C_START(); I2C_WRITE(0xd0); ACK(); I2C_WRITE(0); for(a=0;a<7;a++){ ACK(); I2C_WRITE(time[a]); } ACK(); I2C_STOP(); } //============================================================================== // ROTINAS PARA LCD //============================================================================== //clock para lcd void lcd_clk(void){ trisb=tris_out; en=1; delay_us(58); en=0; } //envia nible para lcd void env_nib(int8 { int8 pb; pb=portb&0x0f; portb= pb|(b&0xf0); lcd_clk(); } //envia comando para lcd void env_lcd_c(int8 val){ rs=0; env_nib(val); env_nib(swap(val)); delay_ms(10); } //envia dados para lcd void env_lcd_d(int8 val){ rs=1; env_nib(val); env_nib(swap(val)); } //inicialização do lcd void lcd_init(void){ int8 a,*b; b=&k; delay_ms(40); db4=1; db5=1; for(a=0;a<3;a++) lcd_clk(); db4=0; lcd_clk(); env_lcd_c(0x28);//ajusta para 4 bits o modo de envio env_lcd_c(0x06);// no shift env_lcd_c(0x0c);//Display ON, Cursor OFF, Blink OFF env_lcd_c(0x01);//limpa tela *b=(eep_[0x16]|0x08);// } //apresenta um byte no lcd void show_byte(int8 r1){ int8 a,b; b=k+2; for(a=0;a<2;a++){env_lcd_d( b|(swap(r1)&0x0f));}//dezena e unidade } // mostra todos os dados do relogio e calendário no lcd void ver_relogio(){ int c; //envia hora/min/seg env_lcd_c(0x84); show_byte(time[2]); env_lcd_d(':'); show_byte(time[1]); env_lcd_d(':'); show_byte(time[0]); env_lcd_c(0xc2); //envia dia da semana switch (time[3]){ case 1: pos=0; break; case 2: pos=3; break; case 3: pos=6; break; case 4: pos=9; break; case 5: pos=12; break; case 6: pos=15; break; case 7: pos=18; break; } for(c=0;c<3;c++){ env_lcd_d(semana[pos+c]); } //envia calendário com dia/mes/ano env_lcd_d(' '); show_byte(time[4]); env_lcd_d('/'); show_byte(time[5]); env_lcd_d('/'); show_byte(time[6]); } //mostra nome do aparelho void show_blog(){ int8 k_; for(k_=0;k_<15;k_++){env_lcd_d(eep_[k_]+k);}// env_lcd_c(0xc0); for(k_=0;k_<16;k_++){env_lcd_d(eep_[k_+15]+k);} delay_ms(1500);//delay inicial //env_lcd_c(0x01);//limpa tela } //rotina que busca conforme 'vez' a posição da eeprom correspondente e mostra // no lcd o ajuste void m_can(void){ env_lcd_d('C'); env_lcd_d('A'); env_lcd_d('N'); env_lcd_d('>'); } void ver_temporizacao(void){ int8 a,b; env_lcd_c(0x01); //apaga tela do lcd env_lcd_c(0x80); m_can(); a=(vez&0xfe)-3; a=(a++)>>1; a++; a=a|0x30; env_lcd_d(a); env_lcd_d(' '); env_lcd_d('L'); env_lcd_d(' '); for(b=0;b<3;b++){ if(b)env_lcd_d(':'); show_byte(cal);} env_lcd_c(0xc6); env_lcd_d('D'); env_lcd_d(' '); for(b=3;b<6;b++){ if(b!=3)env_lcd_d(':'); show_byte(cal);} } void salvar_pegar(void){ int8 d,m,n; if(!fc){ if(vez>4){ n=vez; n--; n=n&0x01; n=n*3; for(d=0;d<3;d++){write_eeprom(d+((qcan-1)*3),cal[d+n]);}//salva anterior na eeprom } m=vez&0x01; if(!m){//se par carrega os dois valores for(d=0;d<6;d++){ cal[d]= read_eeprom(d+(qcan*3));}//carrega eeprom } fc=1; } } //incrementa e converte byte (hexa para decimal) int8 inc_reg(int8 reg1){ int8 a,b; if((vez<=3)&&(vez)) f=1; //se foi ajuste para DS1307 seta 'f' a=reg1; b=a; b=swap( &0x0f; a=a&0x0f; if(++a>9) {a=0; ++b;}//incrementa e testa return ( a|swap( );//retorna em decimal } void adj_canais(int8 t){ trisb=tris_in;//pinos como entrada if(!sw_seg) {val= inc_reg(cal[2+t]);if(val>0x59) cal[2+t]=0; else cal[2+t]=val;} if(!sw_min) {val= inc_reg(cal[1+t]);if(val>0x59) cal[1+t]=0; else cal[1+t]=val;} if(!sw_hora){val= inc_reg(cal[0+t]);if(val>0x23) cal[0+t]=0; else cal[0+t]=val;} } void spal1(){ int8 d; salvar_pegar(); env_lcd_c(0x88); for(d=0;d<9;d++){env_lcd_d(' ');} adj_canais(0); //0=ligar } void spal2(){ int8 d; salvar_pegar(); env_lcd_c(0xc8); for(d=0;d<9;d++){env_lcd_d(' ');} adj_canais(3); //0=ligar } //testa por acionamento nos botões de acionamento void testa_chaves(void){ int8 d; f=0; vez=0; trisb=tris_in;//pinos como entrada if(!sw_adj) vez++; delay_ms(5); while(!sw_adj); trisb=tris_out;//pinos como saida //se registrador'vez' for diferente de '0', vai ajustar relogio/calendario while(vez){ qcan=vez-4;// determina canal em modo de acerto da temporização if(vez==1){ //faz piscar env_lcd_c(0x84); for(d=0;d<9;d++){env_lcd_d(' ');} trisb=tris_in;//pinos como entrada //incrementa o registrador conforme chave apertada (relógio) if(!sw_seg) {val= inc_reg(time[0]);if(val>0x59) time[0]=0; else time[0]=val;} if(!sw_min) {val= inc_reg(time[1]);if(val>0x59) time[1]=0; else time[1]=val;} if(!sw_hora){val= inc_reg(time[2]);if(val>0x23) time[2]=0; else time[2]=val;} } if(vez==2){ //faz piscar env_lcd_c(0xc2); for(d=0;d<3;d++){env_lcd_d(' ');} trisb=tris_in;//pinos como entrada //se um dos 3 botões for pressionado, incrementa dia da semana if((!sw_seg)|(!sw_min)|(!sw_hora)) { val= inc_reg(time[3]); if(val>0x07) time[3]=1; else time[3]=val; } } if(vez==3){ //faz piscar env_lcd_c(0xc6); for(d=0;d<9;d++){env_lcd_d(' ');} trisb=tris_in;//pinos como entrada //incrementa o registrador conforme chave apertada (calendário) if(!sw_seg) {val= inc_reg(time[4]);if(val>0x31) time[4]=1; else time[4]=val;} if(!sw_min) {val= inc_reg(time[5]);if(val>0x12) time[5]=1; else time[5]=val;} if(!sw_hora){val= inc_reg(time[6]);if(val>0x99) time[6]=0; else time[6]=val;} } if(vez==4){ if(f) {ds_write8();f=0;} //acerta ajustes do Ds1307 antes de passar para eeprom spal1(); //salva ajuste anterior,pega novos, ajusta } if(vez==5){ spal2();} if(vez==6){ spal1();} if(vez==7){ spal2();} if(vez==8){ spal1();} if(vez==9){ spal2();} if(vez==10){spal1();} if(vez==11){spal2();} if(vez==12){spal1();} if(vez==13){spal2();} if(vez==14){spal1();} if(vez==15){spal2();} if(vez==16){ for(d=0;d<3;d++){write_eeprom(d+((qcan-1)*3),cal[d+3]);}//salva anterior na eeprom vez=0; } delay_ms(150);//tempo desligado trisb=tris_in;//pinos como entrada if(!sw_adj); if(!sw_adj){ if(++vez>16) vez=0; while(!sw_adj) delay_ms(10); fc=0; } trisb=tris_out;//pinos como saida if(vez<4){ env_lcd_c(0x01); ver_relogio();}// mostra o incremento realizado no LCD else //colocar modo de visualização de programação dos canais { if(vez<16) {ver_temporizacao();} else {env_lcd_c(0x01);} } delay_ms(150);// tempo ligado } trisb=tris_out;//pinos como saida } int8 pegamem(int8 a){ return (read_eeprom(a)); } int1 t_acionar(int8 pnt){ if(!vez){//compara somente após sair do modo de ajuste int32 h_inic,h_atual,h_fim; h_fim=make32(pegamem(pnt+3),pegamem(pnt+4),pegamem(pnt+5));//hms h_inic=make32(pegamem(pnt),pegamem(pnt+1),pegamem(pnt+2));//hms h_atual=make32(time[2],time[1],time[0]);//hms if(h_inic<=h_fim){ if((h_atual>=h_inic)&&(h_atual<h_fim)) return(1);else return(0); } else{ if((h_atual<=0x235959)&&(h_atual>=h_inic)){return (1);} else{ if(h_atual<h_fim){ return (1);} else {return (0);} } } }//if(!vez) }//void acionar void comparar(void){ canal1= t_acionar(0); canal2= t_acionar(6); canal3= t_acionar(12); canal4= t_acionar(18); canal5= t_acionar(24); canal6= t_acionar(30); } void wake_up(){//testa se ds 1307 está acordado cnt=0; ds_read8(); //pega dados do ds1307 while(time[0]&0x80) {//se ds1307 estiver desligado, religa e zera // time[0]&=0x7f; time[0]=0; time[1]=0; time[2]=0; time[3]=0; time[4]=1; time[5]=1;time[6]=0; ds_write8(); delay_ms(10); ds_read8(); //pega dados do ds1307 if(!++cnt){ env_lcd_d('E'); env_lcd_d('R'); env_lcd_d('R'); env_lcd_d('0'); env_lcd_d(' '); env_lcd_d('D'); env_lcd_d('S'); env_lcd_d(' '); env_lcd_d('I'); env_lcd_d('2'); env_lcd_d('C'); env_lcd_d(' '); env_lcd_d('C'); env_lcd_d('O'); env_lcd_d('M'); for(; ; } } env_lcd_c(0x01);//limpa tela } //============================================================================== // ROTINA MAIN //============================================================================== void main() { port_b_pullups(TRUE); setup_timer_1(T1_INTERNAL|T1_DIV_BY_2); setup_comparator(NC_NC_NC_NC); porta=0; portb=0; trisb=0; trisa=0; lcd_init();//inicializa o lcd show_blog();//mostra nome do aparelho delay_ms(1000); wake_up(); while(1){ while(!tmr1_if);//aguarda timer 1 estourar tmr1_if=0; ds_read8(); //pega dados do ds1307 delay_ms(10);// ver_relogio();//visualisa relogio e calendario no lcd testa_chaves();//testa se alguma chave foi acionada comparar(); }//while }//main
  3. Então pessoal, tenho um aquario em casa e eu queria muito acoplar um sistema eletrônico a ele que va controlar iluminaçao, temperatura e um sistema de alimentaçao. A pouco tempo achei uma monografia de um estudante na internet que fez um PERFEITO. Porém nao manjo muito de programaçao. POR FAVOR ME AJUDEM. _ Ele usou o compilador ccs; - Ele adicionou uma biblioteca referente ao LCD que eu nao consigo encontrar na internet( esse é o maior problema, pois os comandos relacionados ao lcd nao funcionam). Se vocês usarem outra biblioteca e mudarem os comandos referentes meu problema estaria resolvido; Abaixo vou postar a monografia e a programação completa no bloco de notas. ME AJUDEM, Agradeço desde já. display feito 16f.txt programação completa http://www.repositorio.uniceub.br/bitstream/235/3649/2/Monografia%20FILLIPE%20GALIZA%202_2012.pdf link da monografia

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!