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.
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
- Filtragem de medições
- Redução de ruído na medição de temperatura
Fontes
- Filtragem em eletrônica
- https://www.aranacorp.com/fr/donnez-des-sens-a-votre-robot/
- https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
What function do you use to map the value?