Akkor még egyszer.
Kódmegosztáshoz javaslom valamelyik kódmegosztó oldalra feltenni a forrást (copy + paste) és csak a linket mellékelni. Pl. codeshare.
Rengeteg logikai és szintaktikai bukfenc van a kódodban, sorolom.
int forgo () ; // globalis valtozo , hanyszor fordult korbe a teljes forciklus
Nem. Ez egy függvénydeklaráció. Helyesen:
int forgo = 0;
A zárójeles megoldás a függvény paramétereit tartalmazza, ez esetben ez egy int típusú változót visszaadó függvény deklarációja. Az IDE biztos szólt miatta.
A deklaráció során egyből definiáltad is a változót kezdő értékre. Ezt javasolt minden változómegadásnál megtenni!
A for ciklus anomáliájára önállóan rájöttél, ez kafa.
void megresz() függvényben rossz az átlagolás logikája. Mint régen matekból: (1) összeadjuk az értékeket (2) az összeget elosztjuk az egyedi értékek darabszámával. Vagyis a for ciklus körbemegy az elvárt számú alkalommal, majd a szamgongyolve változó értékét elosztod az iterálások számával (ami 9 lesz, ha a for ciklus indexét ciklus < 10 limittel adod meg).
Itt van több további bukfenc is. Egyrészt kellően nagy szam valtozó esetén vagy kellően nagy számú iterációnál simán előfordulhat, hogy a szamgongyolve valtozó értéke túlfut a maximumán, ami 32737. Ennek elkerülésére az a mód, hogy az int típusú változó helyett jóval nagyobbat választunk, mondjuk egy long-ot vagy unsigned long-ot (előbbi 2, utóbbi 4 milliárdig nyerő, cserébe többet foglal a memóriából) -- a kettő között azért van átjárás.
A függvényen belül újra definiáltad a szam és a forgo változókat, ez elég rossz ötlet. Simán szedd ki előlük az int utasítást.
Serial.println (" ") ; felesleges, elég a Serial.println();
A delay(2000); most még jó, de elég gyorsan el kellene felejteni.
Később: előző mérés + új mérés / aktuális ciklus = átlag ez így teljesen rossz, ez nem átlag és így nem is lehet átlagot számolni, mert az utolsó mérés súlya mindig exponenciálisan nagyobb lesz, mint az összes korábbi mérésé.
Az atlag is lehet nyugodtan int. Felesleges a tizedesekkel bajlódni (pontosítani persze lehet, de kérdés, hogy érdemes-e ezen a szinten).
A felvetésed, hogy a szamgongyolve változó miért nem nullázódik egy kicsit hosszabb leírást szorgalmaz.
Nyitásra az, hogy függvényeket (procedúrákat) használsz, dícséretes, viszont egy nagyon fontos dolgot figyelmen kívül hagysz, ez pedig a változók hatóköre. A program elején deklarálod a szamgongyolve változót int típusúként (illetve valójában nem, mert egy függvényt deklarálsz csak, csodálom, hogy nem kajabál az IDE, hogy rossz az egész). Ez globális változó lesz (lenne). Ezt követően mind a nullazo() mind a megresz() függvényben újra deklarálod őket (a változó neve elé kiteszed a változó típusát jelző int utasítást). Ezt beágyazott változókezelésnek hívják, és bár logikailag/szintaktikailag működik, programozástechnikailag a taposóakna megfelelője, ezért kerülendő.
A dolog úgy javítható egyszerűen, hogy a fentieket is követve csak és kizárólag a program elején (vagy a változó első előfordulásakor) használod a változódeklarálást jelző utasítást (gyakorlatilag a változó típusának jelölését).
Végül. Az egész program logikája sok ponton hibás. A függvények egymás után futtatásával (különösen az összehasonlito() fügvény esetén) biztosan nem az elvárt eredményt fogod kapni (ez a nevesített ugyanis minden futtatásakor PONTOSAN ugyanazt az eredményt fogja adni, és nem csak azért, mert a vizsgálat hibás -- == helyett = van --, hanem azért is, mert mindig ugyanazzal a szam változó-értékkel fog elindulni.