"execultando bloco de comando por quantidade de pulso

É, por algum motivo o interrupt não está funcionando... mas como não conheço bem como ele funciona, vou atualizar meu primeiro código:

// Pino que será conectado o contador - supondo que é o 2
#define CONTADOR_PIN 2

// Tempo para contar os pulsos - 1 s = 1000 ms
#define TEMPO_CONTAGEM 1000

// Contador dos pulsos
int contador;

// Estado anterior da entrada
byte ultimoEstado;

// Tempo inicial da contagem dos pulsos
long tempoPrimeiroPulso;

// Variavel para iniciar a contar os pulsos
bool contarPulsos;

void setup()
{
  // Define pino do contador como input, e ativa do pull-up (deve funcionar dessa forma, mas nao tenho certeza)
  pinMode (CONTADOR_PIN, INPUT_PULLUP);
  
  contador = 0;
  
  contarPulsos = false;
  
  ultimoEstado = HIGH;
  
  // Inicia o Serial para debug
  Serial.begin(115200);
  
}

void loop()
{
  
  // Ler estado da entrada
  byte estado = digitalRead(CONTADOR_PIN);
  
  // Verifica se foi mudado o estado da entrada e se ele é LOW
  if ((estado == LOW) && (estado != ultimoEstado))
  {
    // Verifica se a contagem ainda não foi iniciada
    if (contarPulsos == false)
    {
      tempoPrimeiroPulso = millis(); // Atualiza valor do tempo inicial
      contador = 1;                       // Inicia o contador
      contarPulsos = true;              // Inicia a contagem de pulsos
    }
    else // Se já iniciou a contagem...
    {
      contador++;                     // ... adiciona 1 ao contador
    }
  }
  
  // Atualiza ultimo estado
  ultimoEstado = estado;

  // Verifica se estava sendo feita a contagem e se o tempo já passou
  if ((contarPulsos == true) && (millis() >= (tempoPrimeiroPulso + TEMPO_CONTAGEM)))
  {
    // Para a contagem
    contarPulsos = false;
    
    // Realiza ação de acordo com a quantidade de pulsos. Por enquanto, só um print do valor para verificar o código
    Serial.println(contador);
    
  }
  
}
[\code]

Esse código deve contar direitinho. Depois diz o que deu.

Amigo LegendBR este ultimo code seu funcionou perfeitamente as contagens foram testadas muitas vezes e todas repetiram o mesmo resultado, as notas de 2 reais imprimiram no serial monitor o numero 2 assim como todas as outras; de 5 imprime 5, 10 10,20 20,50 50,sem falhar nenhuma vez.Esta perfeito... Como sei que este forum tem intuito de aprendizagem vou estudar bem o seu code, antes de passar para a outra fase que e executar os blocos de comando de acordo com os pulsos gerados. Obrigado a todos os amigos que generosamente se prontificaram a me ajudar,assim que me sentir bem entendido do funcionamento desse code retornarei com mais duvidas. Mais um vez muito obrigado!!!!

Amigos ate entendo sobre funções de sistema binário e lógica booleana, mais a sintaxe de programação estou achando muito complicado. Mais não sou de desistir...
Amigos tem como me explicar em linguagem simples as seguinte linhas;

if ((contarPulsos == true) && (millis() >= (tempoPrimeiroPulso + TEMPO_CONTAGEM)))

byte estado = digitalRead(CONTADOR_PIN)

e não consegui entender o que função long faz neste code.

vagner:
if ((contarPulsos == true) && (millis() >= (tempoPrimeiroPulso + TEMPO_CONTAGEM)))

Se ((estiver contando os pulsol) e (o tempo atual for maior ou igual ao tempo do primeiro pulso mais o limite de tempo para contagem)).

long não é função, é um tipo de dado, como int, byte, char, etc. É utilizado para pegar o tempo milissegundos.

LegendBR long e utilizado para gerar, pegar ou medir o tempo? Se for pra pegar e aumentou ainda mais minhas duvidas...

Lago... Como ja disse que sou iniciante não vou ter vergonha em perguntar....
Entendi que esta linha (if ((contarPulsos == true) && (millis() >= (tempoPrimeiroPulso + TEMPO_CONTAGEM))) esta impondo condição. E que se estas condições forem verdadeira ai o code vai passar para a outra linha que e contar os pulsos. Certo?

Amigo HugoPT o seu code não imprime nada nada no serial monitor poderia dar mais uma olhada pra ver o que esta acontecendo. Meus agradecimentos a você amigo HugoPT e LegendBR. Conto com Vocês.

Pois ele nao imprime nada porque me esqueci de iniciar a porta Serie.
Aqui esta corregido

#define Pino_Entrada_Pulsos 2
#define tempoMaximoDaAnaliseMoedeiro 3000 //3 segundos 

volatile unsigned int contador = 0;
unsigned long startCounting = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(Pino_Entrada_Pulsos, INPUT);
  digitalWrite(Pino_Entrada_Pulsos, 1); //Activa o internal pull-up
  attachInterrupt(0, contaImpulsos, FALLING);
}

void loop()
{
   if(((millis() - startCounting) >= tempoMaximoDaAnaliseMoedeiro) && (startCounting != 0))
   {
    //Significa que o tempo de leitura do moedeiro expirou e podemos recolher o contador
    Serial.println(contador);
    contador = 0;
    startCounting =0;
  }
}

void contaImpulsos()
{
  startCounting = millis();
  contador++;
  
}

vagner:
Lago... Como ja disse que sou iniciante não vou ter vergonha em perguntar....
Entendi que esta linha (if ((contarPulsos == true) && (millis() >= (tempoPrimeiroPulso + TEMPO_CONTAGEM))) esta impondo condição. E que se estas condições forem verdadeira ai o code vai passar para a outra linha que e contar os pulsos. Certo?

O && é o AND, ou seja, as duas condicionais devem ser verdadeiras. Depois do if não tem o ponto e vírgula, pois se atender as condições ele executa o bloco que começa no { e termina no }.

Uma boa referência da linguagem:

Cara, pelo jeito você não entende NADA de programação mesmo, em nenhum linguagem, não é? Tenta pegar um tutorial de programação em C, acho que é melhor do que você já partir direto para o Arduino. É melhor aprender logo sobre tipos, variáveis, estruturas de repetição, condicionais, etc. Depois você parte para o Arduino ;).

Postei outro dia um curso online de C++. O arduino é bem parecido.

Ola amigos!! Estou de volta... Olha o ultimo code que o amigo LegendBR me passou fez a contagem perfeitamente mais como sou novato achei um pouco complicado pra mim, andei dando uma olhada e estudando um pouquinho e consegui montar este code;

int contage = 0;
boolean pulso=0;
boolean pulsoI=0;
void setup()
{
Serial.begin(9600);
pulso=HIGH;
pinMode(3,INPUT_PULLUP);
pinMode(5,INPUT_PULLUP);
pinMode(12,OUTPUT);
Serial.begin(9600);
}

void loop()
{
Serial.println(contage);

if(digitalRead(3)==HIGH){if(pulso==HIGH){contage = contage ++;}pulso=LOW;}
else{pulso=HIGH;}

if(digitalRead(5)==HIGH){if(pulsoI==HIGH){contage = contage - 1;}pulsoI=LOW;}
else{pulsoI=HIGH;}

if (contage == 1){digitalWrite(12, LOW);}
if (contage > 1){digitalWrite(12, HIGH);}
if (contage > 51){(contage=1);}
if (contage < 1){(contage=1);}
}

Este faz a contagem dos pulsos do noteiro e e quando pulso um chave esta faz um contagem regressiva, que dependendo acende e apaga um led. Mais o que eu queria mesmo era que fizesse um servo motor desses de parabólica rodar continuamente e que tambem para-se de rodar,pois ate consigo fazer ele começar a rodar quando a contagem fica >1 mais ai quando volto para 1 o que deveria fazer ele parar o servo motor, ele continua... ai e so resetando para ele parar. conto mais uma vez com a ajuda de vcs. Desde já muito obrigado!!!

Oi Vagner tudo bom.
Estou quebrando a cabeça tentando entender como funciona o bl700.
Gostaria se vc poder esplicar como vc fez para ligar a fiação dele, o esquema de cores.
Não estou conseguindo integra-lo com arduino de jeito nenhum..
Vlw..

Bem amigo Samucao!!! O esquema e o seguinte; Os fios amarelo e verde eu não costumo ligar pois ele são inibidores ( e melhor deixar desligado ), o fio vermelho é claro e o positivo 12V e o laranja vai no negativo, o azul e a saída de pulso... Agora o fio roxo e que e o determinante na saída de pulso, ou seja se vc liga-lo a uma fonte de 12V os pulsos na saída (fio azul) serão pulso de 12V, se ligar a uma fonte de 5V serão de 5V e por fim se ligar ao terra (GND) o pulso será compatível a qual fonte foi ligado o fio roxo. Espero ter ajudado amigo... Mais só por fins de curiosidade. Qual e o seu projeto?

vagner:

  if(digitalRead(3)==HIGH){if(pulso==HIGH){contage = contage ++;}pulso=LOW;}

else{pulso=HIGH;}

Dá-me um bom motivo para estruturares o teu código assim.

Esse código não tem nada para controlar um servo. Já pensaste que o servo pode apenas rodar num sentido e não no sentido da viagem menor?

Que vês no serial monitor? Os numeros parecem-te correctos? Ou é raro ficares com a contagem em 1?

vagner:
Os fios amarelo e verde eu não costumo ligar pois ele são inibidores ( e melhor deixar desligado )

Errado. É melhor deixá-los ligados a um potencial que não os iniba. Deixá-los no ar pode provocar que o motor pare de vez em quando e não saibas porquê...

Amigo Vagner,

Muito obrigado pela dica. Já estava a um bom tempo quebrando a cabeça.
Meu projeto é para maquina de musica.
Muito Obrigado!
Continuarei por aqui aproveitando as dicas e se possível ajudando..Abraço

Amigo Samucao que bom tem lhe ajudado!!! Também trabalho com maquina de musicas e estava querendo fazer do arduino uma interfase, simulando um teclado. Talvez possamos trabalhar junto para melhoramento das nossas maquinas. O que vc acha?

Amigo Bubulino realmente neste code ainda não havia feito nenhuma referencia ao servo motor o que foi revolvido substituindo por um analogWrite(6,0); e analogWrite(6,10); nas linhas ;
if (contage == 1){digitalWrite(12, LOW);}
if (contage > 1){digitalWrite(12, HIGH);}
este programa esta me servindo muito bem. acho que semana que vem minha maquina de vending estará pronta e portarei fotos da maquina que tão generosamente vcs me ajudarão a fazer.
Agora a respeito da dica que o amigo Samucao pediu erra a de um BL700 que e um aceitador de notas (dim dim) e não de um servo.
Amigo Bubulino obrigado pelo interesse!! E peço poder contar sempre com sua ajuda pois sou novato em arduino. Fiquem com Deus!!!

Ola amigos,

Estou precisando de uma ajuda para programar um codigo, irei tentar explicar.
Quando passo uma nota de 2 reais é gerado dois pulsos de 55 ou 56 ms que é capturado pelo meu contador, nota de 5 é gerado cinco pulsos com os mesmos tempos 55 56, sei lá acho que pode variar um pouco. Então considerei para não ter falha que um pulso de 40 ms é um real e joguei para valor. O problema é como zerar o valor apenas ao finalizar a contagem? Pensei em iniciar uma contagem de tempo a partir do primeiro pulso, porque o intervalo entre eles são minimos acho que 2 segundos bastaria. Mas não sei como fazer, agradeço ajudas. Obrigado!!

Segue codigo:

#define CONTADOR_PIN 13
int contador;
int valor;
void setup()
{
// Define pino do contador como input, e ativa do pull-up (deve funcionar dessa forma, mas nao tenho certeza)
pinMode (CONTADOR_PIN, INPUT_PULLUP);

// Inicia o Serial para debug
Serial.begin(115200);

}

void loop()
{
contador = 0;
while (digitalRead(CONTADOR_PIN) == HIGH)
{
contador ++;
if (contador == 40){
valor ++;
Serial.print("Valor - ");
Serial.println(valor);
}
}

}

Estás a assumir que

#define CONTADOR_PIN 13  //má ideia usar este pino... 
unsigned char contador=0;
unsigned long tempo = 0; 
unsigned char flag = 0; 

void setup()
{
  // Define pino do contador como input, e ativa do pull-up (deve funcionar dessa forma, mas nao tenho certeza)
  pinMode (CONTADOR_PIN, INPUT_PULLUP);
  
  // Inicia o Serial para debug
  Serial.begin(115200);
  
}

void loop()
{
  contador = 0;

  if (digitalRead(CONTADOR_PIN) == LOW && flag == 0)  {   //tens o pull up activado, aqui tens de ver se foi para low... 
    contador ++; //incrementa numero de pulsos.
    flag = 1;  
   }
  if (digitalRead(CONTADOR_PIN) == HIGH) { //acabou-se o pulso...
     tempo = millis(); //começa a contar no final do pulso...
     flag = 0; 
  }

  if (millis() - tempo >= 100) { //aqui poderás ter de ajustar este valor... mas deve dar. 
    //acabou a sequência... 
    Serial.print("Valor = ");
    Serial.println(contador);  //vê se está correcto...
    contador = 0;   //pronto para outra. 
  }
  
}

Não testei nem compilei, mas deve ser isto que pretendes... ou algo parecido.
Estou a assumir que o duty cycle dos pulsos é 50% (ou seja, está o mesmo tempo em cima como em baixo).

Se a largura dos pulsos não varia mas sim o número de pulsos é escusado temporizar se eles estão ou não dentro desse intervalo e apenas ver se passados 55 ou 56 ou lá o que é ms aparece outro pulso ou não. Se não aparecer, então é porque terminou a sequência e podes considerar o valor correcto.