FAÇA UM RELÓGIO CONTROLADOR DE 6 CANAIS (VERSÃO PARA DS1307) – COM PIC 16F628A E LCD (REF116)

Acionar dispositivos em determinados momentos programados pode ser muito útil em automação. Veja esta nova versão do controlador de 6 canais usando um RTC DS1307 (comunicação I2C)…

Para facilitar para alguns hobistas que estão tendo dificuldade de encontrar o ci DS1302, de protocolo SPI (3 fios), foi adaptado o código para usar o ci DS1307, de protocolo I2c de 2 fios. Com exceção de usar um fio a menos na ligação com o PIC, poucas coisas mudaram no esquema. Veja abaixo como ficou:

Na parte do arquivo ASM, todas as rotinas de SPI foram substituídas por rotinas I2C. O Programa ficou bem inchado com estas modificações, sendo então necessário a substituição de algumas linhas de código repetidas por chamadas de subrotina. Ainda assim, sobraram poucas linhas de código, sem usar, das 2047 existentes na flash do PIC16F628a.
Com respeito ao uso e aplicações, poderá ver os detalhes no artigo ‘FAÇA UM RELÓGIO CONTROLADOR DE 6 CANAIS – COM PIC 16F628A E LCD’, uma vez que só foi mudado o chip RTC de ds1302 para DS1307.
Obs.: Esta montagem é de caráter didático, sendo montada e testada apenas em placa de protoboard, sendo sujeita a bugs ainda não detectados. São fornecidos os arquivos ASM e HEX, que poderão ser modificados conforme as necessidades dos hobistas.

Segue o arquivo ASM:

RELOGIO_CONTROL_DS1307_ASM

Segue o arquivo Hex:

RELOGIO_CONTROL_DS1307_HEX

Em 27/11/14 foi feita revisão, conforme pasta abaixo:

relogio_controlador_v2

Também, em 30/11/14 foi feita esta versão usando compilador “C”, e atualizada em 03/03/2015, com vantagem de recuperar a situação programada, mesmo com falta de energia momentânea. Foi feita uma nova forma de mostrar a programação do calendário e canais, piscando os elementos que estão sob ajustes. Confira na pasta zipada abaixo:

RELOGIO_CONTROL_DS1307_V_4

O Sr. Edmilson Spigolan nos envia gentilmente uma versão com apenas um canal, usando o mesmo esquema, mas sem montar fisicamente os canais 2 a 6. Segue a pasta com o asm e hex:

relogio_controlador 1 canal

Em 09/09/2017 foi feita uma revisão neste relógio de 1 canal, eliminando um ‘bug’ que deixava a segunda linha um pouco instável na apresentação. Segue os arquivos desta nova versão de 1 canal:

RELOGIO_CONTROL_1C_E

Caso deseje a versão com o circuito integrado DS1302 clique aqui.

Em 27/07/2015 foi feita esta versão, com programação também do dia(s) da semana além das horas, minutos e segundos. Por exemplo: Como irrigação de jardim: acionando eletroválvula da água (destas de máquina de lavar roupas). Podemos programar para regar nas segundas, quartas, sextas, ligando no horário xx:xx:xx e desligando yy:yy:yy (a diferença será o tempo de rega). Segue a pasta com os arquivos desta montagem:

RELOGIO_CONTROL_SEM_6CAN

Manuais:

DS1307
PIC 16F628A
LCD
Esquemas curiosos

Curiosidades:

Como usar melhor o tempo?
Coleta da água da chuva — métodos antigos e modernos
O que é a Grande Bacia Artesiana?
O que revela a visão do invisível?
Os ciclos que sustentam a vida
Já que não pode guardá-lo, use-o bem
Dê mais vida à sua casa
Ondas assassinas: mitos e verdades
Já sorriu para um crocodilo?
Navegar em água e em terra
O esplendor da areia

Outros assuntos:
Lidar com sogros
Aprenda a perdoar
Lidar com dívidas
Como disciplinar seu filho adolescente
Por que eu me corto?
Desempenhem bem o papel de pais
Como fazer seu segundo casamento dar certo
O que acontece quando morremos?
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Adolescentes- O que fazer se estou sofrendo bullying?
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?

Até o próximo artigo!!!

86 comments on “FAÇA UM RELÓGIO CONTROLADOR DE 6 CANAIS (VERSÃO PARA DS1307) – COM PIC 16F628A E LCD (REF116)

  1. ola Claudio bom dia muito grato pela alteração do programa, poderia deixar o codigo fonte zipado para poder baixa-lo grato

    1. Olá Marcos!
      Não testei, mas tente compilar assim:

      /*******************************************************************************
      TEMPORIZADOR CHOC1 SEM CHAVE ON/OFF
      ACIONA SAÍDAS A CADA 3 HORAS POR 1 SEGUNDO (OU MAIS) PARA ATIVAR ENTRADA DE AR
      EM CHOCADEIRAS
      C/ PIC12F675
      AUTOR: CLAUDIO LÁRIOS
      DATA: 13/03/2015
      PINAGEM DO PIC 12F675:
      1-+5V
      2- XTAL (4MHZ)
      3- XTAL
      4- INTERRUPTOR ON/OFF AO GND, COM RESISTOR DE 10K AO VCC (PULL UP)
      5- LED AO GND VIA RESISTOR DE 470 OHMS E OUTRO RESISTOR DE 470 AO GND OU VCC
      (JUMPER DE ESCOLHA 29/19 DIAS)
      6- SAÍDA 1
      7- SAÍDA 2 (OPCIONAL)
      8- GND
      OBS. DEVERÁ SER PREVISTO UMA FONTE DE ALIMENTAÇÃO QUE ALIMENTE O CIRCUITO
      MESMO EM CASO DE FALTA DE ENERGIA ELÉTRICA NA REDE, POR SE TRATAR DE LONGOS
      PERIODOS.
      USO OPCIONAL: VIRAR OVOS
      USO DIDÁTICO
      USE COMPILADOR CCS C
      ESTE ARQUIVO É PARTE INTEGRANTE DO BLOG LARIOS.TECNOLOGIA.WS
      ******************************************************************************/
      #include
      #device adc=8
      #use delay(clock=4000000)
      #fuses NOWDT,HS, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
      #use fast_io(A)
      #zero_ram
      //BYTE
      #byte GPIO = 0×05
      #byte TRISIO = 0×85
      //BIT
      #bit s1 = 0×5.1// saída 1 pino 6
      #bit s2 = 0×5.0//saída 2 (opcional) pino 7
      #bit led = 0×5.2//saída para led indicador on/off (piscante) pino 5
      #bit tris_led =0×85.2
      //flag
      unsigned int1 f_29d,f_on,f_t,f_s2,f_s1;
      //variavéis globais
      unsigned int32 tempo=0;
      unsigned int32 cnt32=0;
      unsigned int16 tempac=0;
      unsigned int8 cts1=0,cts2=0;
      //definições de funcionamento
      #define ciclo_ac 3 //ciclo (em horas)
      #define v_ts1 1 //em segundos
      #define v_ts2 1 //em segundos
      #define PERIODO_CHOC1 29 //em dias
      #define PERIODO_CHOC2 19 //em dias
      /******************************************************************************
      ROTINA DE INTERRUPÇÃO DO TIMER 0 (CONTA 1 SEGUNDO)
      ******************************************************************************/
      #INT_TIMER0
      void INT_TIMER0_ISR(){
      //gera 1 segundos com metodo de acumulo de erro e pode ser usado
      // para cristais com valores quebrados das mais variadas frequencias
      // ajuste o timer para o prescaller igual abaixo no main
      #define presc 64 // valor do prescaller do timer usado (8 bits)
      #define fator (256*presc*4)
      #define f_xtal 4000000 //frequencia do cristal usado (mesmo do cabeçalho)
      cnt32+=fator;
      if(cnt32>=f_xtal){
      f_t=!f_t;//piscará led on/off
      cnt32-=f_xtal;//subtrai xtal da contagem
      tempo++;//incrementa contador de tempo máximo
      if(cts2){ if(–cts2==0){f_s2=0;} }//decrementa registradores de tempo da saída s2
      if(cts1){ if(–cts1==0){f_s1=0; f_s2=1;cts2=v_ts2;}}//idem, da saída s1
      if(++tempac>=(ciclo_ac*3600)){ //duração de cada ciclo
      tempac=0;//reinicia contagem
      f_s1=1;//saída s1 acionará
      cts1=v_ts1;//carga do tempo que ficará acionado esta saída
      }
      if(f_29d){ //testa se periodo desejado é 19 ou 29 dias
      if(tempo>=(PERIODO_CHOC1*24*3600)){//testa se ciclou por 29 dias e para
      f_on=0; //para a contagem
      }
      }
      else{
      if(tempo>=(PERIODO_CHOC2*24*3600)){//testa se ciclou por 19 dias e para
      f_on=0; //para a contagem
      }
      }
      }
      }
      /******************************************************************************
      ROTINA MAIN
      ******************************************************************************/
      void main() {
      SETUP_ADC_PORTS(NO_ANALOGS);//desabilita conversor analogico/digital
      setup_comparator(NC_NC_NC_NC);//desliga comparadores internos
      setup_counters(RTCC_INTERNAL,RTCC_DIV_64);//prescaller divide por 64
      setup_timer_1(T1_DISABLED);
      setup_vref(FALSE);//desliga voltagem de referencia
      GPIO=0;//idem
      TRISIO=0b111000;//sentido fixo das portas
      enable_interrupts(int_timer0);//liga interrupção do timer 0
      enable_interrupts(global);//mantém desabilitada a geral
      tris_led=1;
      if(led) {f_29d=1;} else {f_29d=0;} //le jump e acerta flag entre 29 ou 19 dias
      tris_led=0;
      f_t=0; f_s1=0;f_s2=0;cts2=0;cts1=0;
      tempo=0; tempac=0; cnt32=0; f_t=1; //reinicia contadores
      f_on=1;
      /******************************************************************************
      LOOP PRINCIPAL DE REPETIÇÃO
      ******************************************************************************/
      for(;;){

      if(f_on){//repassa valores para saidas de led,s1 e s2
      led=f_t;
      s1=f_s1;
      s2=f_s2;
      }
      else{ gpio=0;}
      }//for(;;)
      }//void main()
      /////////////////////////////////////////////////////////////////////////////////////////////

      Cláudio

          1. Olá Marcos!
            Eu não consigo achar um arquivo com este nome. Acredito que tenha apenas linkado ele a um comentário, mas não estou conseguindo achar. Eu também não me lembro bem do que se tratava. Se puder ajudar relembrando o assunto e a data da ocasião, talvez possa acha-lo.
            Cláudio

      1. Bom dia Claudio seria essa versão abaixo
        TEMPORIZADOR CHOC1 SEM CHAVE ON/OFF
        29/abril/2016 21:16 horas
        Claudio Larios 29 de abril de 2016 em 16:54
        Olá Marcos!
        Não testei, mas tente compilar assim:
        /*******************************************************************************
        TEMPORIZADOR CHOC1 SEM CHAVE ON/OFF
        ACIONA SAÍDAS A CADA 3 HORAS POR 1 SEGUNDO (OU MAIS) PARA ATIVAR ENTRADA DE AR
        EM CHOCADEIRAS
        C/ PIC12F675
        AUTOR: CLAUDIO LÁRIOS
        DATA: 13/03/2015
        PINAGEM DO PIC 12F675:
        1-+5V
        2- XTAL (4MHZ)
        3- XTAL
        4- INTERRUPTOR ON/OFF AO GND, COM RESISTOR DE 10K AO VCC (PULL UP)
        5- LED AO GND VIA RESISTOR DE 470 OHMS E OUTRO RESISTOR DE 470 AO GND OU VCC
        (JUMPER DE ESCOLHA 29/19 DIAS)
        6- SAÍDA 1
        7- SAÍDA 2 (OPCIONAL)
        8- GND
        OBS. DEVERÁ SER PREVISTO UMA FONTE DE ALIMENTAÇÃO QUE ALIMENTE O CIRCUITO
        MESMO EM CASO DE FALTA DE ENERGIA ELÉTRICA NA REDE, POR SE TRATAR DE LONGOS
        PERIODOS.
        USO OPCIONAL: VIRAR OVOS
        USO DIDÁTICO
        USE COMPILADOR CCS C
        ESTE ARQUIVO É PARTE INTEGRANTE DO BLOG LARIOS.TECNOLOGIA.WS
        ******************************************************************************/
        #include
        #device adc=8
        #use delay(clock=4000000)
        #fuses NOWDT,HS, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
        #use fast_io(A)
        #zero_ram
        //BYTE
        #byte GPIO = 0×05
        #byte TRISIO = 0×85
        //BIT
        #bit s1 = 0×5.1// saída 1 pino 6
        #bit s2 = 0×5.0//saída 2 (opcional) pino 7
        #bit led = 0×5.2//saída para led indicador on/off (piscante) pino 5
        #bit tris_led =0×85.2
        //flag
        unsigned int1 f_29d,f_on,f_t,f_s2,f_s1;
        //variavéis globais
        unsigned int32 tempo=0;
        unsigned int32 cnt32=0;
        unsigned int16 tempac=0;
        unsigned int8 cts1=0,cts2=0;
        //definições de funcionamento
        #define ciclo_ac 3 //ciclo (em horas)
        #define v_ts1 1 //em segundos
        #define v_ts2 1 //em segundos
        #define PERIODO_CHOC1 29 //em dias
        #define PERIODO_CHOC2 19 //em dias
        /******************************************************************************
        ROTINA DE INTERRUPÇÃO DO TIMER 0 (CONTA 1 SEGUNDO)
        ******************************************************************************/
        #INT_TIMER0
        void INT_TIMER0_ISR(){
        //gera 1 segundos com metodo de acumulo de erro e pode ser usado
        // para cristais com valores quebrados das mais variadas frequencias
        // ajuste o timer para o prescaller igual abaixo no main
        #define presc 64 // valor do prescaller do timer usado (8 bits)
        #define fator (256*presc*4)
        #define f_xtal 4000000 //frequencia do cristal usado (mesmo do cabeçalho)
        cnt32+=fator;
        if(cnt32>=f_xtal){
        f_t=!f_t;//piscará led on/off
        cnt32-=f_xtal;//subtrai xtal da contagem
        tempo++;//incrementa contador de tempo máximo
        if(cts2){ if(–cts2==0){f_s2=0;} }//decrementa registradores de tempo da saída s2
        if(cts1){ if(–cts1==0){f_s1=0; f_s2=1;cts2=v_ts2;}}//idem, da saída s1
        if(++tempac>=(ciclo_ac*3600)){ //duração de cada ciclo
        tempac=0;//reinicia contagem
        f_s1=1;//saída s1 acionará
        cts1=v_ts1;//carga do tempo que ficará acionado esta saída
        }
        if(f_29d){ //testa se periodo desejado é 19 ou 29 dias
        if(tempo>=(PERIODO_CHOC1*24*3600)){//testa se ciclou por 29 dias e para
        f_on=0; //para a contagem
        }
        }
        else{
        if(tempo>=(PERIODO_CHOC2*24*3600)){//testa se ciclou por 19 dias e para
        f_on=0; //para a contagem
        }
        }
        }
        }
        /******************************************************************************
        ROTINA MAIN
        ******************************************************************************/
        void main() {
        SETUP_ADC_PORTS(NO_ANALOGS);//desabilita conversor analogico/digital
        setup_comparator(NC_NC_NC_NC);//desliga comparadores internos
        setup_counters(RTCC_INTERNAL,RTCC_DIV_64);//prescaller divide por 64
        setup_timer_1(T1_DISABLED);
        setup_vref(FALSE);//desliga voltagem de referencia
        GPIO=0;//idem
        TRISIO=0b111000;//sentido fixo das portas
        enable_interrupts(int_timer0);//liga interrupção do timer 0
        enable_interrupts(global);//mantém desabilitada a geral
        tris_led=1;
        if(led) {f_29d=1;} else {f_29d=0;} //le jump e acerta flag entre 29 ou 19 dias
        tris_led=0;
        f_t=0; f_s1=0;f_s2=0;cts2=0;cts1=0;
        tempo=0; tempac=0; cnt32=0; f_t=1; //reinicia contadores
        f_on=1;
        /******************************************************************************
        LOOP PRINCIPAL DE REPETIÇÃO
        ******************************************************************************/
        for(;;){
        if(f_on){//repassa valores para saidas de led,s1 e s2
        led=f_t;
        s1=f_s1;
        s2=f_s2;
        }
        else{ gpio=0;}
        }//for(;;)
        }//void main()
        /////////////////////////////////////////////////////////////////////////////////////////////
        Cláudio

        1. Olá Marcos!
          Você já tentou compilar este código ou é algum problema? Não estou entendendo exatamente o que deseja, já que tem o código.
          Claudio

          1. Olá Marcos!
            Parece que ao postar no comentário, acaba apagando o “include 12f675”. Vou ver se acho ele nos arquivos do PC e postarei ele em forma de pasta zipada.
            Cláudio

  2. Olá Marcos!
    Eu estava pensando no temporizador que você falou, para acionar uma saída a cada 3 horas por 1 segundos. Fiz um programinha abaixo:
    /*******************************************************************************
    TEMPORIZADOR CHOC1
    ACIONA SAÍDAS A CADA 3 HORAS POR 1 SEGUNDO (OU MAIS) PARA ATIVAR ENTRADA DE AR
    EM CHOCADEIRAS
    C/ PIC12F675
    AUTOR: CLAUDIO LÁRIOS
    DATA: 13/03/2015
    PINAGEM DO PIC 12F675:
    1-+5V
    2- XTAL (4MHZ)
    3- XTAL
    4- INTERRUPTOR ON/OFF AO GND, COM RESISTOR DE 10K AO VCC (PULL UP)
    5- LED AO GND VIA RESISTOR DE 470 OHMS E OUTRO RESISTOR DE 470 AO GND OU VCC
    (JUMPER DE ESCOLHA 29/19 DIAS)
    6- SAÍDA 1
    7- SAÍDA 2 (OPCIONAL)
    8- GND
    OBS. DEVERÁ SER PREVISTO UMA FONTE DE ALIMENTAÇÃO QUE ALIMENTE O CIRCUITO
    MESMO EM CASO DE FALTA DE ENERGIA ELÉTRICA NA REDE, POR SE TRATAR DE LONGOS
    PERIODOS.
    USO OPCIONAL: VIRAR OVOS
    USO DIDÁTICO
    USE COMPILADOR CCS C
    ESTE ARQUIVO É PARTE INTEGRANTE DO BLOG LARIOS.TECNOLOGIA.WS
    ******************************************************************************/
    #include
    #device adc=8
    #use delay(clock=4000000)
    #fuses NOWDT,HS, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
    #use fast_io(A)
    #zero_ram
    //BYTE
    #byte GPIO = 0×05
    #byte TRISIO = 0×85
    //BIT
    #bit sw = 0×5.3 //interruptor on/off pino 4
    #bit s1 = 0×5.1// saída 1 pino 6
    #bit s2 = 0×5.0//saída 2 (opcional) pino 7
    #bit led = 0×5.2//saída para led indicador on/off (piscante) pino 5
    #bit tris_led =0×85.2
    //flag
    unsigned int1 f_29d,f_on,f_t,f_s2,f_s1;
    //variavéis globais
    unsigned int32 tempo=0;
    unsigned int32 cnt32=0;
    unsigned int16 tempac=0;
    unsigned int16 dly=0;
    unsigned int8 cts1=0,cts2=0;
    //definições de funcionamento
    #define v_debounce 10000 //valor para debouce da chave on/off
    #define ciclo_ac 3 //ciclo (em horas)
    #define v_ts1 1 //em segundos
    #define v_ts2 1 //em segundos
    #define PERIODO_CHOC1 29 //em dias
    #define PERIODO_CHOC2 19 //em dias
    /******************************************************************************
    ROTINA DE INTERRUPÇÃO DO TIMER 0 (CONTA 1 SEGUNDO)
    ******************************************************************************/
    #INT_TIMER0
    void INT_TIMER0_ISR(){
    //gera 1 segundos com metodo de acumulo de erro e pode ser usado
    // para cristais com valores quebrados das mais variadas frequencias
    // ajuste o timer para o prescaller igual abaixo no main
    #define presc 64 // valor do prescaller do timer usado (8 bits)
    #define fator (256*presc*4)
    #define f_xtal 4000000 //frequencia do cristal usado (mesmo do cabeçalho)
    cnt32+=fator;
    if(cnt32>=f_xtal){
    f_t=!f_t;//piscará led on/off
    cnt32-=f_xtal;//subtrai xtal da contagem
    tempo++;//incrementa contador de tempo máximo
    if(cts2){ if(–cts2==0){f_s2=0;} }//decrementa registradores de tempo da saída s2
    if(cts1){ if(–cts1==0){f_s1=0; f_s2=1;cts2=v_ts2;}}//idem, da saída s1
    if(++tempac>=(ciclo_ac*3600)){ //duração de cada ciclo
    tempac=0;//reinicia contagem
    f_s1=1;//saída s1 acionará
    cts1=v_ts1;//carga do tempo que ficará acionado esta saída
    }
    if(f_29d){ //testa se periodo desejado é 19 ou 29 dias
    if(tempo>=(PERIODO_CHOC1*24*3600)){//testa se ciclou por 29 dias e para
    f_on=0; //para a contagem
    }
    }
    else{
    if(tempo>=(PERIODO_CHOC2*24*3600)){//testa se ciclou por 19 dias e para
    f_on=0; //para a contagem
    }
    }
    }
    }
    /******************************************************************************
    ROTINA MAIN
    ******************************************************************************/
    void main() {
    SETUP_ADC_PORTS(NO_ANALOGS);//desabilita conversor analogico/digital
    setup_comparator(NC_NC_NC_NC);//desliga comparadores internos
    setup_counters(RTCC_INTERNAL,RTCC_DIV_64);//prescaller divide por 64
    setup_timer_1(T1_DISABLED);
    setup_vref(FALSE);//desliga voltagem de referencia
    GPIO=0;//idem
    TRISIO=0b111000;//sentido fixo das portas
    enable_interrupts(int_timer0);//liga interrupção do timer 0
    disable_interrupts(global);//mantém desabilitada a geral
    /******************************************************************************
    LOOP PRINCIPAL DE REPETIÇÃO
    ******************************************************************************/
    for(;;){
    if((!sw)&&(!dly)) {
    disable_interrupts(global);
    f_on=!f_on;//inverte
    tris_led=1;
    if(led) {f_29d=1;} else {f_29d=0;} //le jump e acerta flag entre 29 ou 19 dias
    tris_led=0;
    if(f_on){ tempo=0; tempac=0; cnt32=0; f_t=1; //reinicia contadores
    enable_interrupts(global);
    }
    else{
    f_t=0; f_s1=0;f_s2=0;cts2=0;cts1=0;
    }
    while(!sw) ;//aguarda soltar interruptor on/off
    dly=v_debounce;//recarga do valor de debounce
    // enable_interrupts(global);
    }
    if(dly)dly–;//decrementa contador de debounce se positivo
    if(f_on){//repassa valores para saidas de led,s1 e s2
    led=f_t;
    s1=f_s1;
    s2=f_s2;
    }
    else{ gpio=0;}
    }//for(;;)
    }//void main()
    /////////////////////////////////////////////////////////////////////////////////////////////
    Não cheguei a testar com 29 dias, pois é muito tempo. Fiz teste com valores menores e depois voltei este valor. Note que esta versão tem uma saída adicional, que aciona logo após a primeira, para acionar um motor cc para um lado e depois para o outro. Ou então aproveita somente uma saída, ligando um ventilador. Você que é o que entende de chocadeiras.
    Veja se funciona e dá um retorno, por favor.

    1. Olá Marcos!
      Aparentemente é funcional. Faça o teste prático para certificar que tudo corre bem. Na realidade eu não entendo de chocadeiras. Apenas vi alguns artigos na internet.
      Parabéns!
      Cláudio

Comments are closed.

Back To Top