Gastank mit Schwimmer

Ungfähr so:

    #include <LiquidCrystal.h>
    #include <LcdBarGraph.h>
     
    byte lcdNumCols = 16; // -- Anzahl der vollen Balken im LCD
    byte sensorPin = 1; // -- Analogeingang
 
    long data = 0;

    LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // -- Aufbau der LCD Verbindung
    LcdBarGraph lbg(&lcd, lcdNumCols);  // -- Aufbau der Balken
     
/////////////////////////////////////////////////////////////////////////////////////////////////    
    
    void setup(){

      analogReference (INTERNAL);   //  Interne Spannung 1,1 V DC am AREF Ausgang
      lcd.begin(2, lcdNumCols);   // -- Initialisierung des LCD
      lcd.clear();
      delay(1000);

      //einmal initialen Wert setzen, damit nicht bei "0" angefangen wird
      data = analogRead(sensorPin);
    }
     
     

//////////////////////////////////////////////////////////////////////////////////////////////////     
    void loop()
    {
      data = ((data * 90 ) + ( analogRead(sensorPin) * 10)) / 100;
      
      lbg.drawValue( data, 1024);   // -- Setzt den Wert vom Analogen Eingang
      delay(300);
         
      int potiVal = ((data/4) * 100)/251;                // Potiwert in Prozent umrechnen
 lcd.setCursor(0,1);                                // 0 = Zeile  ;  1 = Spalte
 lcd.print("Tankinhalt");
 lcd.setCursor(14,1);
 lcd.print("%");
 lcd.setCursor(11,1); 
 lcd.print(potiVal);
  if( potiVal < 100 )                               // Ist potiVal kleiner als 100 setze ein leerzeichen
  lcd.print( " " );
  if( potiVal < 10 )                                // Ist potiVal kleiner als 10 setze ein leerzeichen
  lcd.print( " " );

 delay(300);
    }

Ich habe zwei Dinge geändert. Zum Einen wird das Wert nur einmal je loop() eingelesen und dann immer nur der gelesene Wert verarbeitet. Das sollte man grundsätzlich so machen, damit man an allen Stellen mit dem gleichen Wert rechnet. Vor allem aber, wenn die gemessenen Werte stark schwanken. Als Zweites habe ich die Formel von volvodani eingebaut, allerdings etwas mehr zusammengefasst, um Variablen zu sparen.
Der Trick dieser Formel ist, das Du den neuen Wert nicht ausschliesslich aus dem gemessenen Wert nimmst, sondern den vorherigen Messwert auch mit verwendest.
Das macht die Formel:

data = ((data * 90 ) + ( analogRead(sensorPin) * 10)) / 100;

Ein Beispiel.

Angenommen "data" hat den Wert von 730 und mittels analogRead() werden aktuell 840 gemessen und im nächsten Durchlauf wieder nur 590 und dann wieder 710, dann hättest Du die stark schwankende Anzeige die Du jetzt hast.
Setzen wir nun mal die Wert in die Formel ein.

  1. Wert: 730 (initiale Messung im setup())
  2. Wert: ((730 * 90) + (840 * 10)) / 100 = 741 ~ 72%
  3. Wert: ((741 * 90) + (590 * 10)) / 100 = 726 ~ 71%
  4. Wert: ((726 * 90) + (710 * 10)) / 100 = 724 ~ 71%

Nun das Ganze nochmal mit 95/5

  1. Wert: 730 (initiale Messung im setup())
  2. Wert: ((730 * 95) + (840 * 5)) / 100 = 735 ~ 72%
  3. Wert: ((735 * 95) + (590 * 5)) / 100 = 728 ~ 71%
  4. Wert: ((728 * 95) + (710 * 5)) / 100 = 727 ~ 71%

Man sieht, die Werte schwanken noch weniger. Das Ganze klappt natürlich nur, wenn der eigentliche Messwert ohne Fehler sich nur sehr langsam ändert. Ich hoffe jetzt ist es etwas klarer.
Mario.