É, 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.
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 }.
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 ;).
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;
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?
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ê...
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!!!
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);
}
}
#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.