Go Down

Topic: "execultando bloco de comando por quantidade de pulso (Read 6518 times) previous topic - next topic

bubulindo

Estou mesmo sem tempo para verificar isto, mas se o teu sinal vindo dos botões for limpo, ou seja, sem bounce. Podes configurar o Timer1 para ler os pulsos do pino 5 do Arduino e contar os segundos com o timer0 (millis).
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

vagner

Caros amigos me desculpa a demora para responder e que meu trabalho me toma muito tempo,mais vamos lá...Amigo fabiohbm007 usei o seu code e veja os resultados; eu passei uma nota de dois reais por 4 vezes consecutivas o gerou 8 pulsos com os seguintes resultados:
OFF 4294967247
OFF 4294967246
OFF 4294967247               
OFF 4294967246       Bom eu ate entendo o porque de vcs quererem medir o tempo dos pulsos mais ate
OFF 4294967247       agora não consegui entender que tipo de dados vai gerar pra chamar o bloco de     
OFF 4294967247       programa. Há só como mais referencias,estes noteiro aceita notas de 2,5,10,20,50
OFF 4294967247       reais portanto qualquer pulso que passar de 1 logicamente será 2 e qualquer pulso 
OFF 4294967245       que ficar entre 3 e 5 poderá ser considerado como 5 e assim por diante 6 a 10=10
                             11 a 20=20, 21 a 50 = 50 .                       

vagner

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.

LegendBR

Code: [Select]
Tenta esse para ver no que dá:

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

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

void setup()
{
  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++;
  Serial.print("Contando, no tempo ");
  Serial.println(millis());
}


Mas cara, acho que já deu para você ter uma ideia de como as coisas funcionam. Tenta mexer no código você agora, e mostrar aqui o resultado, afinal não vai dar para nós fazermos todo o código, não é? ;)

vagner

Amigo LegendBR esse ultimo code não imprime no serial monitor... Amigo eu já estou entendendo bastante coisas, graças a vocês pois só tem duas semanas que estou tentando aprender programar em arduino prometo me empenhar mais. Amigo LegendBR eu andei mexendo naquele primeiro code que vc fez pra mim, aumentei o tempo para 5 segundos e mudei o pino de entrada para o pino 5 e coloquei um resistor de 220R entre o pino 5 e os 5 volts. Os resultados melhorarão bastante, veja:
9042       
9043    Os resultados 904x foram obtido com notas de 2 reais, cada resultado por vez que passei a nota
9043    Os resultados 2260x foram obtidos com notas de 5 reais. Daria para fazer a leitura somente dos
9041    dois primeiros dígitos descartando os demais para fazer o que intenciono?
9043
22605
22607
22605
22607
22607

LegendBR

#20
Jul 26, 2013, 01:24 pm Last Edit: Jul 28, 2013, 04:56 am by LegendBR Reason: 1
É, 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:

Code: [Select]

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

vagner

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!!!!

vagner

    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


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

LegendBR

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

vagner

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

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?

HugoPT

Quote
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
Code: [Select]
#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++;
 
}

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

Lago


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:
https://raw.github.com/jeroendoggen/Arduino-cheat-sheet/master/examples/Arduino-Cheat-Sheet_v0.1.png

LegendBR

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 ;).

Go Up