Contar pulsos e iniciar Temporizações


#1

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.
}
}


#2

Use interrupções. As ISRs serão tratadas pela função que você declarar.