Ir ao conteúdo
  • Cadastre-se

Duduzinho07

Membro Júnior
  • Posts

    5
  • Cadastrado em

  • Última visita

posts postados por Duduzinho07

  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.

    post-758740-0-83026100-1430953566_thumb.

    post-758740-0-60642600-1430953594_thumb.

  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( B)
    #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 B){
    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( B)&0x0f;
    a=a&0x0f;
    if(++a>9) {a=0; ++b;}//incrementa e testa
    return ( a|swap( B));//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!