Capturar el dato que mas se repite

Compañeros tengo una consulta, estoy recibiendo datos continuos de peso de una balanza a un arduino, el problema esta en como haría para que al poner un peso en la balanza, arduino me imprima solo el dato que mas se repite, que vendría hacer el peso verdadero ya que es el que mas se repite y luego ya no imprima mas hasta que vuelva a cero y se ponga el otro peso y así consecutivamente, ya que son varios pesos y todos entran con movimiento( osea tiran el peso es por eso que quiero que se imprima el dato de peso que mas se repite).

De momento hice algo similar con ayuda de un compañero del foro, pero este código al momento de poner un peso que esta dentro de un determinado rango, espera dos segundos e imprime el peso, luego no imprime mas hasta que se saque el peso y se ponga otro peso y así consecutivamente. Adjunto el codigo

char inChar;
String inString="";
float Peso;

float PesoMinimo = 4.0;
float PesoMaximo = 6.0;

unsigned long start;
boolean verificar = true;
byte estado = 0;

void setup()   {  
   
  Serial.begin(9600);  // Abrimos la comunicación serial
  delay(100);  
  }

void loop()  {   

LeerBalanza();  

  switch (estado) {
     
       case 0:
                if (Peso > 0 )  // Si peso es positivo sigo
                    estado = 1; 
                    else {
                      estado = 0;
                      verificar = true; //hasta que el peso no sea cero nuevamente, no sigo 
                      }
                   break;
    
       case 1: 
                if (Peso >= PesoMinimo && Peso <= PesoMaximo && verificar == true) {      // Hay lectura de pesada
                    Serial.print("Peso 1 = ");  //imprimo el primer peso
                    Serial.println(Peso);
                    estado = 2;  // Primer paso okay
                    start = millis()+2000UL; // para luego comparar los 2000 mseg
                }
                else{
                  estado = 0;
                 
                }
                break;
      
       case 2: 
                   
                if (millis() > start) { // pasaron 2 seg verificar valor
                    if (Peso >= PesoMinimo && Peso <= PesoMaximo) {      // Hay lectura de pesada
                        Serial.print("Peso 2 = "); //imprimo el primer peso
                        Serial.println(Peso);
                        estado = 3; 
                    }
                    else {
                        Serial.print("Este peso esta fuera del rango: "); //Si el peso ya no se encuentra dentro del rango envia un mensaje de aviso
                        Serial.println(Peso);
                       estado = 0;
                        
                    }
                }
                break;
      
        case 3:               
                estado = 0;
                verificar = false; //hasta que el peso no sea cero nuevamente, no sigo
                break;
  }
}

void LeerBalanza(){
  
    if (Serial.available()) {
        inChar = Serial.read();
        if (isDigit(inChar) || inChar == '.' || inChar == '-') {
           inString += inChar;
        }
        if (inChar == '\n') { 
            Peso = inString.toFloat();   
            inString = "";  // borramos el String para un nueva entrada         
        }    
        }  
        }

:confused: Dudas de software en el foro de hardware...

Tendrías que promediar, pero quizás te sirva guardar el peso más grande en una variable que es lo que aparentemente deseas y más simple. Cuando llegue a 0 el peso dicha variable podrá volver a tomar valores y siempre guardas el que sea mayor.

Compañero cuando el peso ingresa es arrojado con fuerza y luego ya se estabiliza, si pongo el peso mas grande entonces me estaría tomando ese peso( el que es arrojad0 con fuerza).

Tu arrojas un peso y luego buscas el valor mas repetido, eso sin entrar en estadísticas es como te dice Arduinito.
Simplemente deja pasar la perturbación que representa arrojar el peso y luego el promedio de los valores en 2 seg o el tiempo que tu quieras dara tu valor mas probable.
Incluso un promedio movil (algo que prometo dar a Arduinito) es lo mismo ya que imagina que tomas el promedio de valores y siempre descartas el primer valor de la pila y sumas el nuevo.

Podrias de este modo tomar muestras de N valores y comparar la Mn contra la Mn-1 y si la diferencia esta en determinado valor la consideras estable. Se entiende?

Compañeros e modificado el codigo de arriba y lo he acomodado para mi caso, aun no lo he probado, porque no estoy donde esta la balanza, pero quisiera que me ayudaran para ver si tiene algun error.
Con este codigo voy sumando datos y cuando la balanza me marca 0.0 entonces recien promedio, ah tambien e puesto un rango entre los pesos que debe promediar para evitar que sume pesos que no son, ya que el promedio de peso va entre 20 y 30kilos, espero su orientacion y algunas ideas para mejorar

 char inChar;
String inString="";
float Peso;

float PesoMinimo = 20.0;
float PesoMaximo = 30.0;

float Promedio;
float PesoTotal;

int contaSerial=0;

unsigned long start;
byte estado = 0;

void setup()   {  
   
  Serial.begin(9600);  // Abrimos la comunicación serial
  delay(100);  
  }

void loop()  {   

LeerBalanza();  

  switch (estado) {
     
       case 0:
                if (Peso > 0.0 )  // Si el peso es positivo sigo
                    estado = 1; 
                    
                    else {
                      estado = 0;
                      promediarPeso();
                         }
                    break;
    
       case 1: 
                if (Peso >= PesoMinimo && Peso <= PesoMaximo && contaSerial < 50) {      // Hay lectura de pesada

                    contaSerial++;
                    Serial.print("Peso = ");  //imprimo el primer peso
                    Serial.println(Peso); 
                    PesoTotal= PesoTotal + Peso;  //Sumo el peso
                                   
                    }
               
                 else{
                  estado = 0; 
                    }  
                   break;
  }
}

void LeerBalanza(){
  
    if (Serial.available()) {
        inChar = Serial.read();
        if (isDigit(inChar) || inChar == '.' || inChar == '-') {
           inString += inChar;
        }
        if (inChar == '\n') { 
            Peso = inString.toFloat();   
            inString = "";  // borramos el String para un nueva entrada         
        }    
        }  
        }

 
 void promediarPeso(){

       if( contaSerial > 0){
          Promedio = PesoTotal / contaSerial;
          Serial.println("El Promedio es:");
          Serial.println(Promedio);

          contaSerial = 0;
          PesoTotal = 0;
        }
 }