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
Tags:
é... 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.
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);
}
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.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por