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:
Segue o arquivo Hex:
Em 27/11/14 foi feita revisão, conforme pasta abaixo:
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:
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:
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:
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:
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!!!
Grato Claudio agora vou aos testes obrigado
ola Claudio bom dia muito grato pela alteração do programa, poderia deixar o codigo fonte zipado para poder baixa-lo grato
Claudio daria para retirar a chave on off do pino 4 e fazer funcionar assim que energizar o circuito obrigado
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
como baixo essa versão
Olá Marcos!
Escolha a versão e clique para baixar a pasta zipada com os arquivos.
Cláudio
preciso Claudio da versão acima do TEMPORIZADOR CHOC1 SEM CHAVE ON/OFF grato
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
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
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
não consigo baixar o codigo esse codigo usa o 12f675
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
Olá Marcos!
Veja se são esses os arquivos que necessita clicando aqui.
Olá Marcos!
Veja se são estes os arquivos que deseja, clicando aqui ou o link http://picsource.com.br/wp-content/photos/2013/10/CHOC1.zip.
Cláudio
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.
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