Gleitender Mittelwert wird regelmäßig negativ

Hallo folgendes Stück Code für einen gleitenden Mittelwert am DHT22:

if(chk == DHTLIB_OK)
    {
        temp = (int)DHT.temperature * 100;
        hum = (int)DHT.humidity * 100;
        volt = readVcc();
        Mvolt = (Mvolt * (filterfaktor - 1) + volt) / filterfaktor;
        Mtemp = (Mtemp * (filterfaktor - 1) + temp) / filterfaktor;
        Mhum = (Mhum * (filterfaktor - 1) + hum) / filterfaktor;
    }

Filterfaktor=10 alle Variablen sonst sind int´s. Für Temperatur klappt es, für Luftfeuchte und Spannung nicht. Ich seh nicht warum.

Den ganzen Sketch gibt es hier: https://codebender.cc/sketch:83780

Hier meine Ausgabe (nach Anhauchen): Man sieht das die aktuellen Messwerte passen aber irgendwie immer über 3000 das Ergebnis der Berechnung negativ wird...

T=aktueller Temperatur,MT=Mittelwert H=Luftfeuchte,MH=Mittelwert

N:1 T:2500 MT:2140 H:9900 MH:-3123 V:5185 MV:2810
N:1 T:2400 MT:2166 H:9900 MH:-1820 V:5091 MV:3038
N:1 T:2300 MT:2179 H:9900 MH:-648 V:5138 MV:3248
N:1 T:2300 MT:2191 H:9900 MH:406 V:5138 MV:-3116
N:1 T:2200 MT:2191 H:9900 MH:1355 V:5138 MV:-2290
N:1 T:2200 MT:2191 H:9800 MH:2199 V:5161 MV:-1544
N:1 T:2100 MT:2181 H:8900 MH:2869 V:5138 MV:-875
N:1 T:2100 MT:2172 H:8300 MH:-3141 V:5115 MV:-276
N:1 T:2100 MT:2164 H:7700 MH:-2056 V:5115 MV:263
N:1 T:2100 MT:2157 H:7400 MH:-1110 V:5138 MV:750
N:1 T:2100 MT:2151 H:7100 MH:-289 V:5115 MV:1186
N:1 T:2100 MT:2145 H:6900 MH:429 V:5138 MV:1581
N:1 T:2100 MT:2140 H:6600 MH:1046 V:5115 MV:1934
N:1 T:2100 MT:2136 H:6400 MH:1581 V:5138 MV:2254
N:1 T:2100 MT:2132 H:6200 MH:2042 V:5138 MV:2542
N:1 T:2100 MT:2128 H:6100 MH:2447 V:5138 MV:2801
N:1 T:2100 MT:2125 H:6000 MH:2802 V:5161 MV:3037
N:1 T:2100 MT:2122 H:6000 MH:3121 V:5138 MV:3247
N:1 T:2100 MT:2119 H:6000 MH:-3144 V:5115 MV:-3119
N:1 T:2100 MT:2117 H:5900 MH:-2239 V:5115 MV:-2295

Integer-Überlauf bei der Multiplikation?

So ist besser:

Mvolt = ((long)Mvolt * (filterfaktor - 1) + volt) / filterfaktor;

hi,

int geht bis 32767. wenn nach einer division durch 10 3200 überbleibt, wirst wohl drüberkommen. nimm mal long oder unsigned int.

gruß stefan

Danke!

Ich hab zwar schnell hier geschaut: http://arduino.cc/en/pmwiki.php?n=Reference/Int

Aber versehentlich beim Wert für den Due geschaut.. blöd...

int temp = (int)DHT.temperature * 100;

wird negativ wenn DHT.temperature >= 33.0 genauso bei .humidity

Auch sonst Unsinn, diese Zeilen. Warum rechnest du in abgerundeten 100 er Schritten?

Natürlich ist Integer-Arithmetik schneller und kleiner, aber man muss schon wissen was man macht.