Pages: 1 [2] 3   Go Down
Author Topic: "execultando bloco de comando por quantidade de pulso  (Read 4048 times)
0 Members and 1 Guest are viewing this topic.
'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3099
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Aracaju, SE, Brasil
Offline Offline
Sr. Member
****
Karma: 4
Posts: 323
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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 é? smiley-wink
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Aracaju, SE, Brasil
Offline Offline
Sr. Member
****
Karma: 4
Posts: 323
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

É, 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:
// 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.
« Last Edit: July 27, 2013, 09:56:56 pm by LegendBR » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Brasília - DF - Brazil
Offline Offline
Full Member
***
Karma: 3
Posts: 226
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Aracaju, SE, Brasil
Offline Offline
Sr. Member
****
Karma: 4
Posts: 323
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1412
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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++;
 
}
Logged

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


Brasília - DF - Brazil
Offline Offline
Full Member
***
Karma: 3
Posts: 226
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Aracaju, SE, Brasil
Offline Offline
Sr. Member
****
Karma: 4
Posts: 323
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink.
Logged

Pages: 1 [2] 3   Go Up
Jump to: