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. Claudio boa tarde teria como eliminar a chave e funcionar diretamente quando energizar o circuito deste novo projeto.

      1. o artigo timer encubadora com pic 12f675 eliminar a chave liga desliga para quando energizar o circuito ele ja começa a funcionar.

        1. Olá Marcos!
          Poderia, por favor, pegar o título completo do artigo, pois eu não me lembro de um artigo sobre ‘encubadora’.
          Cláudio

          1. Olá Marcos!
            Desculpe, mas ainda não sei qual artigo se refere. Você poderia pegar o link ou o nome do artigo completo, por favor?
            Claudio

  2. Boa noite Claudio ,montei o circuito e para não ficar esperando 3 horas para dar o pulso no motor ,como faço para colocar tempos bem menores para teste.

    1. Olá Marcos!
      Para alterar o tempo acionado altere no #define v_ts1 1 //em segundos e
      #define v_ts2 1 //em segundos.
      Para o ciclo de 3 horas poderá altera-lo para 1 h ou outro valor também usando o #define ciclo_ac 3 //ciclo (em horas).
      Para valores menores, altere na direto na rotina:

      if(++tempac>=(ciclo_ac*3600)){ //duração de cada ciclo—————> mude para if(++tempac>=400){// para 400 segundos, por exemplo.
      tempac=0;//reinicia contagem
      f_s1=1;//saída s1 acionará
      cts1=v_ts1;//carga do tempo que ficará acionado esta saída
      }

      Para tempo de 1 dia a 29 poderá alterar no ” #define PERIODO_CHOC1 29 //em dias”.
      Para tempos menores terá que alterar direto na rotina, conforme abaixo:

      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 ——————–> troque por: if(tempo>=60){ //para tempo de 60 segundos
      f_on=0; //para a contagem
      }
      }
      else{
      if(tempo>=(PERIODO_CHOC2*24*3600)){//testa se ciclou por 19 dias e para ——————–> troque por: if(tempo>=160){ //para tempo de 160 segundos
      f_on=0; //para a contagem
      }

      Claudio

    1. 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 = 0x05
      #byte TRISIO = 0x85

      //BIT

      #bit sw = 0x5.3 //interruptor on/off pino 4
      #bit s1 = 0x5.1// saída 1 pino 6
      #bit s2 = 0x5.0//saída 2 (opcional) pino 7
      #bit led = 0x5.2//saída para led indicador on/off (piscante) pino 5
      #bit tris_led =0x85.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.

      clique aqui para obter pasta zipada com o arquivo.
      Cláudio

  3. Claudio como ainda estou fazendo testes a primeira coisa que precisaria e´desse circuito que mencionei ai depois irei fazer outros testes .se em um pic menor melhor ainda.

Comments are closed.

Back To Top