Como descartar valor de variável errado

Caros colegas,
Estou tendo um pequeno inconveniente em parte de um programa muito grande e complexo. Por essa razão estou colocando aqui apenas a parte critica. Espero que isso seja suficiente.
Trata-se do seguinte:
Preciso calcular uma frequência em torno de 12 a 50 ciclos por minuto. Estou usando millis conforme mostra o código;

void frequency(){
                     
int valor_D = 0;
unsigned long temp1=0;
unsigned long temp2=0;
unsigned long temp3=0;
unsigned long tempHL=0;
int tempT=0;
unsigned long tempLL=0;
int i =0;
unsigned char flagHIGH=0;




do{
    //noInterrupts();    
        int pino_digital = 15;  
        valor_D = -1*digitalRead(pino_digital);        
        delay(100);         
        //Serial.println (valor_D);

                   
  if(digitalRead(valor_D) == HIGH && flagHIGH == 0){ 
              
    temp1=millis(); 
    flagHIGH=1;
    tempLL = (temp1 - temp2);
    i++;     
    Serial.println("Tempo de nivel Alto:"); 
    Serial.println(tempLL/1000);//Tempo entre o nivel alto e baixo Serial.println(" Segundos"); 
    }
    

    
  if(digitalRead(valor_D) == LOW && flagHIGH == 1){ 
    
      temp2=millis(); 
      flagHIGH=0;         
      tempHL=(temp2-temp1);          
      tempT= (tempHL + tempLL)/1000;
      lgx= 60*(1.0/tempT); 
    
      Serial.println("Tempo de nivel Baixo:"); 
      Serial.println(tempHL/1000);//Tempo entre o nivel alto e baixo Serial.println(" Segundos"); } 
      Serial.println("Tempo Total");
      Serial.println(tempT); 

      Serial.println("Frequencia");
      Serial.println(lgx);

         
     } 
     }while(i < 3);
   
    }

Tudo funciona bem, exceto pelo fato de que o primeiro valor do tempo do nível alto bem como o primeiro valor de frequência é errado. Isso acontece porque temp1-temp2 = temp1 para a primeira leitura de nível alto. Para a segunda leitura de nível alto os valores ficam corretos.
Preciso de alguma forma descartar a leitura errada. Alguém pode me ajudar com isso?

Você já tentou "temp?=millis()" antes de entrar no loop "do{}"?

Estou procurando uma maneira de fazer com que temp1 e temp2 tenham valores reais (e bons) conforme o loop do{} é inserido. Qual é o valor incorreto que você vê quando o loop do{} é inserido pela primeira vez? E qual é um bom valor para temp1 e temp2 à medida que o loop do{} continua?

Esse bloco de programa e meio que básico para medir frequência. Ele funciona corretamente desde que vc despreze o primeiro Serial.print(tempLL), porque o primeiro cálculo de temp1 - temp2 = temp1 ou seja, a contagem de millis. Se esse bloco e usado sozinho diretamente no void loop não tem problema pois o resultado errado só vai aparecer uma vez antes o arduino seja desligado e ligado novamente. Mas no meu caso, dentro de um loop do/while ele aparece cada vez que o o loop e recomeçado. Pior ainda que é um resultado errado que vai aumentando conforme a contagem de millis aumenta e reaparecendo toda vez que o loop do/while recomeça. Nessas condições, para i contando até 3 eu tenho sempre um valor errado e dois corretos. O valor errado vai aumentando enquanto o sistema está ligado.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.