Como suavizar a leitura de sensores

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 = (5.0 * analogRead(0) * 100.0) / 1024.0;

c2 = (5.0 * analogRead(0) * 100.0) / 1024.0; ....E carrego toadas variáveis...... c30 = (5.0 * analogRead(0) * 100.0) / 1024.0; c31 = (5.0 * analogRead(0) * 100.0) / 1024.0; c32 = (5.0 * analogRead(0) * 100.0) / 1024.0;

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

float Leitura(int analogInPin)
  {
  float sensorValue = 0;      
  float outputValue = 0;   
  float ReadValue = 0;
  int ReadTimes = 0;
  for (int i =0; i < 10; i++)
    {
    ReadValue = analogRead(analogInPin);
    Serial.println(ReadValue);
    if (ReadValue > 0)
      {
      sensorValue = sensorValue + ReadValue;
      ReadTimes++;          
      delay(2);
      }
    }
  outputValue = sensorValue / ReadTimes;
  return outputValue;
  }

Procure por média móvel que você encontra:

http://en.wikipedia.org/wiki/Moving_average

float mediaMovel(float xis) {
    static float media = 0.0;
    static int indice = 1;

    if (indice == 0 || indice == 33) {
        indice = 1;
        media = 0.0;
    }

    media = media + (xis - media) / indice++;

    return media;
}

void setup() {
    
} 

void loop() {
    float sample = 5.0 * analogRead(0) * 100.0 / 1024.0;
    Serial.print(mediaMovel(sample));
}

Nossa, a média móvel eu não tinha conhecido ainda. Caiu como uma luva no meu termômetro com thermistor.

Primeiro eu tentei utilizar o filtro passa-faixa, mas não deu muito certo. Depois implementei um algoritmo com ponderação por tempo e sampling variável. Funcionou, mas ficou muito complexo.

A média móvel está me dando resultados similares com muito menos complexidade.

Agora o problema está mesmo em conseguir calibrar corretamente o thermistor na faixa 20-35ºC. Como só tenho um termômetro (e não muito confiável) para essa faixa, está difícil...

Obrigado por compartilhar!

Olá meu caros,

Para não criar outro tópico resolvi utilizar esse pois meu problema é similar.

Estou trabalhando com dois sensores, no arduino, de saída de 1 a 5V e precisava suavizar a saída deles. A questão é que não consigo fazer o arduino ler os dois sensores simultaneamente, apenas um. Alguém poderia me dar uma bola?

Segue o meu código funcionando para um sensor apenas:

const int numReadingsP = 10;

int readingsP[numReadingsP];      // the readings from the analog input
int indexP = 0;                  // the index of the current reading
int totalP = 0;                  // the running total
int averageP = 0;                // the average

int inputPinP = A0;


LiquidCrystal lcd(7, 6, 5, 4, 3, 2);


void setup()
{
  lcd.begin(16, 2);
  
  // initialize all the readings to 0: 
  for (int thisReading = 0; thisReading < numReadingsP; thisReading++)
    readingsP[thisReading] = 0; 

}

void loop() {
  // subtract the last reading:
  totalP= totalP - readingsP[indexP];  
  
  // read from the sensor:  
  readingsP[indexP] = analogRead(inputPinP); 
  
  // add the reading to the total:
  totalP= totalP + readingsP[indexP];  
  
  // advance to the next position in the array:  
  indexP = indexP + 1;                    

  // if we're at the end of the array...
  if (indexP >= numReadingsP)          
  
    // ...wrap around to the beginning: 
    indexP = 0;                           

  // calculate the average:
  averageP = totalP / numReadingsP;   
  
  
  float voltagemP = averageP * (5.0 / 1023.0);
  float milimetrosP = (voltagemP * 63.69) - 63.7;
  
  
  lcd.setCursor(0, 0);
  lcd.print("D.P: ");
  lcd.print(milimetrosP);
  lcd.print("mm/H2O           ");

  
  delay(300);        // delay in between reads for stability

Obrigado galera!!!

Já tentou usar o que foi sugerido no tópico?