filtro en código para arduino

hola amigos necesito que por favor me ayuden a implementar un filtro para señal analógica, estoy trabajando en un simulador de conducción pero la señal analógica de los potenciometros llegan con un ruido quiero ver si algún filtro logra estabilizar la señal

#include "UnoJoy.h"

void setup(){
  setupPins();
  setupUnoJoy();
}

void loop(){
  // Always be getting fresh data
  dataForController_t controllerData = getControllerData();
  setControllerData(controllerData);
}

void setupPins(void){
  // Set all the digital pins as inputs
  // with the pull-up enabled, except for the 
  // two serial line pins
  for (int i = 2; i <= 12; i++){
    pinMode(i, INPUT);
    digitalWrite(i, HIGH);
  }
  pinMode(A4, INPUT);
  digitalWrite(A4, HIGH);
  pinMode(A5, INPUT);
  digitalWrite(A5, HIGH); 
}

dataForController_t getControllerData(void){
  
  // Set up a place for our controller data
  //  Use the getBlankDataForController() function, since
  //  just declaring a fresh dataForController_t tends
  //  to get you one filled with junk from other, random
  //  values that were in those memory locations before
  dataForController_t controllerData = getBlankDataForController();
  // Since our buttons are all held high and
  //  pulled low when pressed, we use the "!"
  //  operator to invert the readings from the pins
  controllerData.triangleOn = !digitalRead(2);
  controllerData.circleOn = !digitalRead(3);
  controllerData.squareOn = !digitalRead(4);
  controllerData.crossOn = !digitalRead(5);
  controllerData.dpadUpOn = !digitalRead(6);
  controllerData.dpadDownOn = !digitalRead(7);
  controllerData.dpadLeftOn = !digitalRead(8);
  controllerData.dpadRightOn = !digitalRead(9);
  controllerData.l1On = !digitalRead(10);
  controllerData.r1On = !digitalRead(11);
  controllerData.r1On = !digitalRead(12);
  controllerData.startOn = !digitalRead(A4);
  controllerData.homeOn = !digitalRead(A5);
  
  // Set the analog sticks
  //  Since analogRead(pin) returns a 20 bit value,
  //  we need to perform a bit shift operation to
  //  lose the 1 least significant bits y estabilizar la lectura sin numeros repetitivos celimo and get an
  //  8 bit number that we can use  
  controllerData.leftStickX = analogRead(A0) >> 2;
  controllerData.leftStickY = analogRead(A1) >> 2;
  controllerData.rightStickX = analogRead(A2) >> 2;
  controllerData.rightStickY = analogRead(A3) >> 2;
   
   // And return the data
   return controllerData;
}

Moderador: Código editado con etiquetas

codigo.txt (2.21 KB)

Bienvenido @rafaelrosero al foro Arduino.

Caes en la misma situación que la gran mayoría de los recién llegados.
Copias y pegas un código, das una explicación superficial y pretendes que resolvamos tu problema que ni tu sabes explicar debidamente.

A ver poniendo la mejor buena voluntad, que esperas filtrar? Porque no dices nada en tus 3 líneas de explicación.

necesito que por favor me ayuden a implementar un filtro para señal analógica

Entonces ahora yo o cualquiera debemos ir a tu código que ni siquiera posteaste usando etiquetas y detectar cual es la variable donde esta conectado el/los potenciómetros.

Esfuérzate un poco por favor!!

Supongo se trata de estas líneas.

  controllerData.leftStickX = analogRead(A0) >> 2;
  controllerData.leftStickY = analogRead(A1) >> 2;
  controllerData.rightStickX = analogRead(A2) >> 2;
  controllerData.rightStickY = analogRead(A3) >> 2;

Pero hay una afirmación falsa y es que los datos tienen 20 bits. eso en Arduino no es cierto de modo que yo probaría asi

  controllerData.leftStickX = analogRead(A0);
  controllerData.leftStickY = analogRead(A1);
  controllerData.rightStickX = analogRead(A2);
  controllerData.rightStickY = analogRead(A3);

Y si no es suficiente entonces tendras que promediar pero dependerá de la velocidad de respuesta, la cantidad de muestras que puedas considerar.

podrias hacer algo asi con N muestras, coloca luego el valor que sea apropiado en tu Arduino