Etiquetas: , ,

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

  • Computador
  • Arduino UNO
  • Cabo USB A Macho/B Macho
  • Sensor analógico

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:

  • O quadro leva tempo para ser preenchido, então há um atraso no estabelecimento da média. Leve isso em conta ao iniciar o microcontrolador.
  • A variação da medida será mais lenta, o que torna impossível detectar fenômenos “rápidos”. Considere bem o tipo de comportamento que pretende medir.
  • O quadro ocupa mais espaço na memória e requer mais tempo de gestão.
smooth-function-principle Implementar uma média móvel no Arduino

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.

arduino-monitor-smooth-result Implementar uma média móvel no Arduino

Aplicações

  • Filtragem de medições
  • Redução de ruído na medição de temperatura

Fontes

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