Hallo,
Dank der vielen Erklärungen und tollen Exceltabelle
bin ich mir sicher das jetzt verstanden zu haben. Manchmal drängelt sich zwar noch die geistige Vorstellung eines notwendigen Schieberegisters ins Hirn, dann muß ich Eure Erklärungen wieder lesen und der Nebel verzieht sich wieder. 
Der Filterfaktor entspricht Tau, auf die Kondensatorladekurve bezogen, und nach mindestens 5x Tau erhalte ich Mittelwerte die praktisch meinen Meßwert entsprechen, solange der sich nicht ändert. Diese Erklärung laut meinem Verständnis sollte stimmen. 
Vielleicht gehe ich an mein "Meßproblem" auch etwas falsch ran. Mag sein. Ich lese ja mittels MAX6675 Temperaturen ein. Diese schwanken jedoch hin und wieder in 0.25°C Sprüngen. Raumtemp. laut Fühler nicht konstant, sondern zwischen 23.25 und 24.00 schwankend. Jetzt dachte ich spontan, als ich diesen Thread hier las, ich könnte es mit der Methode schön mitteln und erhalte konstante Werte. Aber selbst mit Filterfaktor 20 schwankt die 1. Kommastelle doch für mich zu oft. Wenn ich nur mit einer Kommastelle anzeigen lasse. Ich brauche also noch eine Art Hysterese.
Jetzt denke ich mir, ich komme besser, wenn ich die Viertel-Kommawerte (0.25, 0.50, 0.75) separat auswerte und nur auf halbe °C anzeigen lasse. Das sollte stabil werden.
Die gleitende Mittelwertbildung kann ich ja dennoch verwenden um eine leichte Trägheit reinzubekommen. Dann muß ich nicht wie sonst gemacht wird sturr 10x aufaddieren und teilen für einen einzigen Mittelwert, sondern bekomme bei jeden Durchgang einen neuen Mittelwert. Nach der "Wartezeit" von 5x Filterfaktor.
Habe das obige vorhin in Code umgesetzt. Filterfaktor mir Poti veränderbar.
// Arduino Mega 2560
// Deklaration der Funktionen, übernimmt die Arduino IDE selbst
// unsigned int read_MAX6675();
// Arduino Mega 2560
// Port-Pins definieren
int MAX_CS = 24; // Arduino Pin, SPI ChipSelect, 1. MAX6675
int MAX_SO = 26; // Arduino Pin, SPI Datenleitung
int MAX_CLK = 28; // Arduino Pin, SPI Clockleitung
// Deklaration Datentypen und Variablen
int Poti = 0; // Eingang A0
int Filterfaktor = 1;
float Teiler = 2.0;
unsigned int value = 0;
unsigned int Temp = 0;
float Mittelwert = 0;
float actual = 0;
void setup() {
Serial.begin(9600);
pinMode(MAX_CS, OUTPUT);
pinMode(MAX_SO, INPUT);
pinMode(MAX_CLK, OUTPUT);
digitalWrite(MAX_CS, HIGH); // Ruhezustand
digitalWrite(MAX_CLK, LOW); // Ruhezustand
}
void loop() {
delay(1000);
Filterfaktor = analogRead(Poti)/8; // lese analog Pin A0 ein und Begrenzung auf 128
if(Filterfaktor == 0) Filterfaktor = 1; // wenn A0 = 0, dann setze es auf 1 (Mindestwert)
Teiler = Filterfaktor + 1; // Teiler immer eins größer wie Filterfaktor
Temp = read_MAX6675();
actual = Temp / 4.0;
Serial.print(Filterfaktor);
Serial.print(" ");
Serial.print(actual,2); // aktueller Meßwert von A0
Serial.print(" ");
Mittelwert = (Temp/4.0 + Mittelwert * Filterfaktor) / Teiler;
Serial.println(Mittelwert,1); // gleitender Mittelwert
}
// -----------------------------------------------------------------------------------------------------
// Der MAX6675 wird ausgelesen und der 12-Bit-Wert zurückgegeben ********
unsigned int read_MAX6675 ()
{
int i;
unsigned int data;
data = 0;
digitalWrite(MAX_CS, LOW); // CS=Low
for(i=0;i<16;i++)
{
delayMicroseconds(1); // warte 100us
digitalWrite(MAX_CLK,HIGH); // SCK=High
delayMicroseconds(1); // warte 100us
// data = ((data<<1) | MAX_SO); // schiebe nach links und lies SO
data = ((data<<1) | digitalRead(MAX_SO)); // schiebe nach links und lies SO
digitalWrite(MAX_CLK, LOW); // SCK=Low
}
delayMicroseconds(1);
digitalWrite(MAX_CS, HIGH); // CS=High
delayMicroseconds(1); // warte 100us
return (data>>3); // gib 12-Bit Wert zurück
}