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.
- Wert: 730 (initiale Messung im setup())
- Wert: ((730 * 90) + (840 * 10)) / 100 = 741 ~ 72%
- Wert: ((741 * 90) + (590 * 10)) / 100 = 726 ~ 71%
- Wert: ((726 * 90) + (710 * 10)) / 100 = 724 ~ 71%
Nun das Ganze nochmal mit 95/5
- Wert: 730 (initiale Messung im setup())
- Wert: ((730 * 95) + (840 * 5)) / 100 = 735 ~ 72%
- Wert: ((735 * 95) + (590 * 5)) / 100 = 728 ~ 71%
- 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.