Acredito que todos aqui ja tiveram o famoso problema de ter leituras oscilantes  em sensores.

A solução para isso é fazer varias amostragens e depois fazer a media. Eu faço isso da pior maneira possível ( meu código fica kilometrico e sei que da pra encurtar isso)

Eu faço assim:

int resul1 = 0;
int c1;
int c2;
..... e declaro variável por variável (todas 32 ) 
int c31;
int c32;



c1 = float(thermocouple.measure(TEMPC));
c2 = float(thermocouple.measure(TEMPC));
....E carrego toadas variáveis......
c30 = float(thermocouple.measure(TEMPC));
c31 = float(thermocouple.measure(TEMPC));
c32 = float(thermocouple.measure(TEMPC));


resul1 = ((c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 + c9 + c10 + c11 + c12 + c13 + c14 + c15 + c16 + c17 + c18 + c19 + c20 + c21 + c22 + c23 + c24 + c25 + c26 + c27 + c28 + c29 + c30 + c31 + c32 ) / 32);

Serial.print(resul1);

Como eu mudo isso?

Sei que é coisa simples.....

Qualquer ajuda é bem vinda

Exibições: 7373

Responder esta

Respostas a este tópico

é... Ideal é usar laço de repetição.

Tenta trabalhar com vetores para armazenar essas variáveis "temporárias" e utiliza um FOR pra calcular essa média.

http://arduino.cc/en/Reference/For

Um exemplo mais didático o possível.

Leitura de um LM35, convertendo pra graus célsius e tirando uma média.

#define SAMPLES 500 //Número de amostras de temperaturas
#define sensortemp 0 //Pino analógico em que estará conectado o sensor LM35  

int tempvector[SAMPLES]; //Vetor que armazenará as temperaturas
double tempSensor = 0.0; //Variável auxiliar
int  valAnalog = 0; // Variável para aramazenar a leitura do sensor LM35

E no Loop:

for (int i=0; i <= SAMPLES; i++) // Incrementa i ate i = SAMPLES    

  {        
       valAnalog = analogRead(sensortemp); // Leitura do pino analogico correspondente ao sensor e guarda em valAnalog    
       tempvector[i] =( 5.0 * valAnalog * 100.0)/1024.0; //Armazena as temperaturas num vetor de tamanho = SAMPLES       
        tempSensor = tempSensor +tempvector[i]; // Soma as temperaturas e armazena em tempSensor   
    }     
       tempSensor = tempSensor/SAMPLES;  // Calcula a média das temperaturas e as armazena em 'tempSensor'

Detalhe... aqui sao 500 amostras (pra alterara a quantidade só mexer lá no #Define). Imagine isso tudo escrito no braço? Laços de repetição é um assunto que vale a pena estudar.

Kra num consegui...

tenho que estudar muito mesmo...

a noite vou tentar d novo com mais tempo

posta o teu código e os erros que estão apresentando.

to mandando o print

Loops (FOR) e If's são a salvação da pátria em programação, Fabiano. São quase que como o alicerce de qualquer sketch. Estude e entenda bem e terá muito do teu caminho jé feito para o futuro. Minha sugestão é, em primeiro lugar comprar um dos bons livros básicos e baratos para entender melhor o arduíno e a linguagem C, e, em segundo, "brincar" de programar. Sim, é isso mesmo, procure um exemplo simples de FOR ou IF e altere-o para ver o efeito. Repita isso dezenas, centenas de vezes, até entender como funcionam. É assim que se aprende. A 32 anos atrás, quando comecei, ainda com um TK-80, utilizando BASIC, minha primeira -obra- foi fazer um texto correr pela tela da minha TV deslocando-se da direita para a esquerda. Foi emocionante, nunca mais esqueci.... Isto usava basicamente um loop FOR. Com o arduino seria um pouco diferente pois não temos a TV, mas podemos ver o resultado direcionando a saida para a porta serial para ver o resultado. Não queime etapas, uma boa base é fundamental. Abraço.

Para simplificar a lógica e reduzir o tamanho do sketch entendo que seria até dispensável criar um vetor para cada leitura. Bastaria ler/calcular a temperatura e somar numa variável, e, após, o término do loop simplesmente dividi-la pelo numero de SAMPLES.

Fabiano,

Abaixo um exemplo que resolve o que vc quer.

A rotina tem dois mecanismos para estabilizar as leituras:

- Calcula a média de "samples" leituras (sem usar vetor, não precisa).

- Só atualiza o valor se a diferença entre ele e a última leitura for maior do que "diff". Se for menor, retorna a última leitura.

Vc então vai alterando os valores de samples e diff até que vc tenha a estabilidade desejada. Se estiver variando muito, aumente samples e diff. Se estiver "agarrando" (demorando a dar leituras) é que os dois estão grandes.

int lastRead = 0;

#define diff 8
#define samples 50
#define sensor 0

int currentRead;
long reads = 0;

for (int i=0;i<samples;i++)
{
   reads+=analogRead(sensor);
}
currentRead=reads/samples; 


if (abs(currentRead - lastRead) > diff)
{
   lastRead=currentRead;
}
Serial.println(lastRead);

aqui esta dando erro o codigo....

É que era só uma dica. Aí segue o bicho completo e compilando:

int lastRead = 0;
#define diff 8
#define samples 50
#define sensor 0
int currentRead;
long reads = 0;

void setup()
{

   Serial.begin(9600);
}

void loop()
{
    for (int i=0;i<samples;i++)
    {
        reads+=analogRead(sensor);
    }
    currentRead=reads/samples;

    if (abs(currentRead - lastRead) > diff)
    {
        lastRead=currentRead;
    }
    Serial.println(lastRead);
}

Agora não deu erro pra compilar.

mais a cada vez que é feita uma nova leitura ela é somada a anterior...

Tentei depois do Serial.println(lastRead); colocar um lastRead = 0; mais num deu certo...

Bom... se é só tirar a média, nós precisariamos de no mínimo 3+1 "variáveis":
1- quantidade de medidas
2- soma temporaria
3- valor final;
a quarta é de controle para o loop.

Tente algo semelhante a isto:

int qnt = 5;  //aqui ele faz 5 contagens
int soma = 0;
int valor = 0;

void setup(){

...

}

void loop(){

  //precisamos limpar as variaveis antigas, senao vai ficar somando

  soma = 0;
  valor = 0;

  for(int i =0; i<qnt; i++){

     soma += analogRead(sensor);

  }

  valor = soma/qnt;

  Serial.println(valor);

}

Precisas zerar as variaveis ao final do processo, caso contrario continuará somando.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço