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!!!
Claudio boa tarde teria como eliminar a chave e funcionar diretamente quando energizar o circuito deste novo projeto.
Olá Marcos!
Eu não entendi que chave você se refere. Qual o artigo?
Claudio
o artigo timer encubadora com pic 12f675 eliminar a chave liga desliga para quando energizar o circuito ele ja começa a funcionar.
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
esta aqui no post mesmo seria o TEMPORIZADOR CHOC1
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
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.
Claudio bom dia se eu precisar mexer no tempo de 1s e nos dias como faço por gentileza
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
Obrigado Claudio vou iniciar os testes e te falo como ficou abraço.
no aguardo quando possível da versão .obrigado
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
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.