Seguidor de linha com media

Então galera eu estou ainda começando com arduino, e eu achei diversos projetos e o que eu escolhi foi o de um seguidor de linha com 2 sensores de refletancia, que eu ja consegui faze-lo funcionar perfeitamente, porem ele não é muito preciso e as vezes perde a linha

Mas eu estava olhando uns videos no youtube e eu achei um minicurso aonde o cara explica como fazer um seguidor de linha que utiliza uma MEDIA dos valores para seguir a linha que eu consegui reproduzir e percebi um aumento bem grande da precisão

Mas não entendi direito porque a utilização desta media melhora o desempenho do robo

Queria saber se alguem poderia me explicar porque essa media acaba por dar uma maior precisão a ele?

Sem dares mais informação acerca de como implementaste o teu robot e o que é que entendes por média, é impossível de dizer seja o que for... :confused:

vou colocar o codigo pra ver se ajuda a entender

Porque sinceramente eu não consegui entender muito bem a logica n rsrsrs

int Port_PonteH_in1 = 9;
int Port_PonteH_in2 = 10;
int Port_PonteH_in3 = 5;
int Port_PonteH_in4 = 6;

int SensorDireita = A0;
int SensorEsquerda = A1;

int ValorSensorDireita = 0;
int ValorSensorEsquerda = 0;

unsigned long media_sensor_direita =0;
unsigned long media_sensor_esquerda =0;

int ref_sensor_direita = 0;
int ref_sensor_esquerda = 0;

int cont =0;

void setup() {

  pinMode(Port_PonteH_in1, OUTPUT);
  pinMode(Port_PonteH_in2, OUTPUT);
  pinMode(Port_PonteH_in3, OUTPUT);
  pinMode(Port_PonteH_in4, OUTPUT);

}

void loop() {

  unsigned long media_inicial_direita =0;
  unsigned long media_inicial_esquerda =0;

  for (int i=0; i <10; i++){
    media_inicial_direita = media_inicial_direita + analogRead(SensorDireita);    
    media_inicial_esquerda = media_inicial_esquerda + analogRead(SensorEsquerda);
  } //Valores iniciais para antes das 1000 leituras

  ref_sensor_direita = media_inicial_direita /10;
  ref_sensor_esquerda = media_inicial_esquerda /10;
  
  while(1){
  
  //Calculo da media
  
  ValorSensorDireita =analogRead(SensorDireita);
  ValorSensorEsquerda =analogRead(SensorEsquerda);

  if(cont < 1000){
    media_sensor_direita = media_sensor_direita + ValorSensorDireita;
    media_sensor_esquerda = media_sensor_esquerda + ValorSensorEsquerda; 
    cont = cont + 1;
  
  }
  else{

    cont = 0;

    ref_sensor_direita = media_sensor_direita / 1000;
    ref_sensor_esquerda = media_sensor_esquerda / 1000;

    media_sensor_direita =0;
    media_sensor_esquerda =0;
  }

  if(ValorSensorDireita > (ref_sensor_direita +100)){
    if(ValorSensorEsquerda > (ref_sensor_esquerda +100)){
      movimentar(1); // 2 Sensores na Linha preta
    }
    else{
      movimentar(3); // Somente Direito na Linha preta
    }  
   }
   else {
    if(ValorSensorEsquerda > (ref_sensor_esquerda + 100)){
     // movimentar(4); //Somente Esquerdo na Linha Preta
    }
    else{
      movimentar(1); //Todos fora da Linha preta   
        }
       }
      }
     }


void controle_motor(int a, int b, int c, int d){
  analogWrite(Port_PonteH_in1, a);
  analogWrite(Port_PonteH_in2, b);
  analogWrite(Port_PonteH_in3, c);
  analogWrite(Port_PonteH_in4, d);  
}


void movimentar(int code){
  
   switch (code) {
    case 1: //Frente
      controle_motor(0,100,110,0);
      break;
      
    case 2: //Tras
      controle_motor(100,0,0,100);
      break;
    
    case 3: //Horario
      controle_motor(100,0,100,0);
      break;
    
    case 4: //Anti-Horario
      controle_motor(0,100,0,100);
      break;
    
    default: //Stop
      controle_motor(0,0,0,0);
      break;
      
      }  
    }