Site icon AranaCorp

Implementar uma média móvel no Arduino

Um sensor analógico envia um nível de tensão, normalmente entre 0 e 5V, representando um valor físico. Esta tensão pode estar sujeita a ruídos de medição (interferência eletrônica ou eletromagnética, precisão de medição, etc.). Em algumas aplicações, pode ser necessário um valor bem estável para fazer certos cálculos ou para detectar eventos de interesse. Um método simples a implementar é o da média móvel, que permite modificar o valor lido de acordo com o histórico da medição.

Material

Princípio de funcionamento

O princípio da média móvel é registrar uma certa quantidade de medidas num quadro e tirar a média destes valores a cada leitura. Há alguns inconvenientes:

Esquema

Uma entrada analógica é ligada preferencialmente a um pino analógico do microcontrolador. Não há qualquer ligação adicional para que a média móvel possa funcionar; a solução é puramente algorítmica. Para resultados mais controlados, é possível colocar filtros eletrônicos no seu circuito de medição.

Código

Criaremos uma função para ler a entrada analógica e se encarregar do quadro e do cálculo da média. Neste código, colocámos um delay() no loop, de modo a que a visualização no monitor serial seja mais demorada. Certifique-se de remover o delay() para resultados mais consistentes.

//Parameters
const int aisPin  = A0;
const int numReadings  = 10;
int readings [numReadings];
int readIndex  = 0;
long total  = 0;

//Variables
int aisVal  = 0;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init AnalogSmooth
  pinMode(aisPin, INPUT);
}

void loop() {
  readAnalogSmooth();
  Serial.print(F("ais avg : ")); Serial.println(smooth());
  delay(200);
}

void readAnalogSmooth( ) { /* function readAnalogSmooth */
  ////Test routine for AnalogSmooth
  aisVal = analogRead(aisPin);
  Serial.print(F("ais val ")); Serial.println(aisVal);
}

long smooth() { /* function smooth */
  ////Perform average on sensor readings
  long average;
  // subtract the last reading:
  total = total - readings[readIndex];
  // read the sensor:
  readings[readIndex] = analogRead(aisPin);
  // add value to total:
  total = total + readings[readIndex];
  // handle index
  readIndex = readIndex + 1;
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  // calculate the average:
  average = total / numReadings;

  return average;
}



Resultado

No monitor serial, vemos o valor bruto oscilar entre 306 e 308, enquanto a média móvel permanece estável em 305.

Aplicações

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Exit mobile version