Contar pulsos e iniciar temporizações.

Olá a todos.

Estou estudando Arduino, sou novo na aréa e tenho varias duvidas.

Estou tentando implementar um sistema de contagem de pulsos que ative vários temporizadores.

A questão da contagem de pulsos parece que esta resolvida, pois simulando no ISIS parece estar ok. porem os Temporizadores tenho varias duvidas, pois não pretendo usar a função delay do Arduino

Segue o código caso alguém quera me ajudar usando o TIMER0 OU TIMER1 ou outra solução viável.

Preciso de Temporizações AJUSTÁVEIS via potenciômetros:

10 segundos (LED1)

3 horas (LED2)

30 minutos (LED3)

10 segundos (LED4) - com delay de uns 3s antes de iniciar.

/*
* CONTADOR DE PULSOS
* LIGA-DESLIGA
* IMPLEMENTAR TEMPORIZADORES
* VERIFICAR REPIQUES NO LED1
* VERIFICAR ERRO NO PRIMEIRO PULSO, SIMULADO NO ISIS.
* SIMPLIFICAR O CÓDIGO 
* 
* 
* 
* LIGA LED1 AO 1º TOQUE DO "BOTÃO"
* DESLIGA TODOS OS LEDS AO 2º TOQUE DO "BOTAÃO"
* 
* 
* AO 1º "PULSO" LIGA LED2 = ENTRADA DIGITAL "0"
* 
* AO 2º PULSO LIGA LED3 = ENTRADA DIGITAL "2"
* AGUARDA 3 SEGUNDOS
* LIGA LED4
* 
* AO 3º "PULSO" DESLIGA TODOS OS LEDS = ENTRADA DIGITAL "2"
* AO PRESSIONAR "ZERAR" DESLIGA TODOS OS LEDS
* 
* 
* Hélio Rodrigues
* 27/12/2017
*/
#define BOTAO 0
#define PULSO 2
#define ZERAR 7

#define LED1 10
#define LED2 11
#define LED3 12
#define LED4 13

volatile unsigned int CONTADOR = 0;
unsigned long INICIA_CONTADOR = 0;

void setup()
{
pinMode(BOTAO,INPUT_PULLUP); //DEFINE PINO 0 COMO ENTRADA E COM RESISTOR INTERNO PULL-UP
pinMode(PULSO,INPUT_PULLUP); //DEFINE PINO 2 COMO ENTRADA E COM RESISTOR INTERNO PULL-UP
pinMode(ZERAR,INPUT_PULLUP); //DEFINE PINO 7 COMO ENTRADA E COM RESISTOR INTERNO PULL-UP

pinMode(LED1, OUTPUT);//DEFINE PINO 10 COMO SAIDA
pinMode(LED2, OUTPUT);//DEFINE PINO 11 COMO SAIDA
pinMode(LED3, OUTPUT);//DEFINE PINO 12 COMO SAIDA
pinMode(LED4, OUTPUT);//DEFINE PINO 13 COMO SAIDA

attachInterrupt(0, CONTA_PULSOS, FALLING); //INTERRUPÇÃO // INT0 PINO 2 // FUNÇÃO // BORDA 5V PARA 0V
}

void loop()
{
if (digitalRead (BOTAO) == LOW){ // SE "BOTÃO" FOR PRESSIONADO LIGA LED1
digitalWrite(LED1, HIGH); // NO 1º TOQUE 
}

if (digitalRead (ZERAR) == LOW){ 
digitalWrite(LED1, LOW);// SE PINO 7 FOR A LOW "ZERAR", APAGA TODOS OS LEDS 
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
}

if (digitalRead(LED1) == HIGH && digitalRead(BOTAO) == LOW){
digitalWrite(LED1, LOW); // SE LED1 ESTIVER ACESO E "BOTAO" FOR PRESSIONADO 
digitalWrite(LED2, LOW);// APAGA TODOS OS LEDS.
digitalWrite(LED3, LOW);// (2º TOQUE DO "BOTÃO")
digitalWrite(LED4, LOW);
}
}

void CONTA_PULSOS()
{
INICIA_CONTADOR = millis();
CONTADOR++;

if (CONTADOR == 2){ //NO 2º PULSO LIGA LED2 // NÃO CONSIGO COLOCAR NO 1º PULSO, DÁ ERRO
digitalWrite(LED2, HIGH);
}
if (CONTADOR == 3){ //NO 3º PULSO LIGA LED3
digitalWrite(LED3, HIGH);
}
if (CONTADOR == 4){ //NO 4º PULSO LIGA LED4.
digitalWrite(LED4, HIGH);
}
if (CONTADOR == 5){ //NO 5º PULSO DESLIGA TODOS OS LEDS, INCLUSIVE LED1.
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);

CONTADOR = 0; // ZERA CONTADOR DE PULSOS
INICIA_CONTADOR =0; //INICIA CONTADOR DE PULSOS COM VALOR 0.
}
}

PULSO.ino (2.57 KB)

E que tal se explicasses melhor o que queres? Não entendo as tuas temporizações. A função millis é certamente a melhor maneira de atingires o que pretendes. Outra coisa a ter em conta é que usar interrupções pode ser mais difícil do que fazer o código de forma normal.

bubulindo:
E que tal se explicasses melhor o que queres? Não entendo as tuas temporizações. A função millis é certamente a melhor maneira de atingires o que pretendes. Outra coisa a ter em conta é que usar interrupções pode ser mais difícil do que fazer o código de forma normal.

Olá amigo... Obrigado pela atenção.

Eu desenvolvi um sistema de partida via controle remoto para carro, acontece que meu sistema eu faço questão que seja usando o controle remoto do alarme que o carro que possui, independende do modelo do carro (pra não ter q ficar carregando 2 controles remotos o tempo todo.

Então se o alarme possui saída AUXILIAR fica fácil, é só pegar o pulso negativo e fazer o resto.

Porém alguns carros, principalmente os que possuem alarme original de fabrica não possuem a saída auxiliar, e em alguns casos, após ligar o ACC (PÓS CHAVE) o alarme não aceita mais comandos do controle remoto.

Então faço o seguinte:

1º Ao destravar o carro, um relê fica ativo por 3 segundos aguardando comando

2º Caso queira ligar o SOM do carro, aperto o botão do PORTA-MALAS, visto que este é comutado via relê por 3 segundos. Então o SOM LIGA. (PRIMEIRO PULSO). Este tempo é de até 3 horas, visto que algumas pessoas gostão de ouvir o som do carro por horas.
Meu sistema também possui um leitor de estado da bateria, e caso esta esteja fraca, o carro dá a partida automaticamente (SE O SOM TIVER LIGADO VIA CONTROLE REMOTO).

3º Caso queira dar a partida no carro, sem esperar a bateria ficar fraca, basta apertar novamente o botão do PORTA-MALAS (SEGUNDO PULSO), ai o ACC É ligado, aguarda uns 3 segundos para a injeção do combustível e dá a partida no carrro.

A partir daqui alguns modelos de alarmes não aceitam mais comandos vindos do porta malas, então ou espera terminar o tempo.

Então é isso.
Ao acionar o botão DESTRAVA, temporizador de 3 segundos (não precisa ser ajustável) para o relê.
Ao acionar o botão PORTA-MALAS, temporizador de até 3 horas ajustável, para o SOM.
Ao acionar novamente o botão do PORTA-MALAS, temporizador ajustável de até 30 minutos (LIGAR ACC)
Ainda no 2º PULSO, após ligar o ACC aguardar 3 ou 5 segundos e ligar o motor.

Em alarmes que aceitam comandos quando o ACC esta ligado, posso desligar todo o processo via botão TRAVA, ou DESTRAVA.

Por isso preciso dos temporizadores. Obrigado a quem puder ajudar, estou estudando e testando a função millis.

Meu sistema atual, totalmente analógico.


Nova imagem, melhor explicado.
Imagens do meu sistema totalmente analógico.

O post que colocaste anteriormente em vários sítios do fórum estava perto do que pretendes... eu respondi a esse post.

Por favor deixa de repetir posts... se ninguém respondeu é porque estivemos a desfrutar do Natal.