Každou sekundu probíhá nějaké měření, jehož výsledkem je dvojbajtová hodnota.
Pro jednoduchost si to představte jako:
unsigned int hodnota = analogRead(A0);
(ve skutečnosti tu hodnotu získávám ze sériové linky)
A já potřebuju zjistit, jestli je ta hodnota stabilní.
Stabilita znamená, že se za posledních 10 minut žádné z těch sekundových měření nevychýlilo z 3% pásma.
Asi nejjednodušší by bylo ukládat každé měření do cyklického pole o velikosti 600 prvků (to je 1200 bajtů) a každou sekundu si všech
těch 600 záznamů v celém poli projít, najít v něm minimum a maximum a pak rozhodnout, jestli to je v té 3% toleranci.
Jenže to vyžaduje hodně paměti a docela dost neustálého procházení toho cyklického pole.
Máte nějaký nápad, jak to zjednodušit?
Tady je funkční, ale paměťově náročný příklad:
Kód: Vybrat vše
unsigned int pole_hodnot[600];
unsigned int ukazatel = 0;
void setup (void)
{
pinMode(A0,INPUT);
Serial.begin(9600);
pole_hodnot[599] = 65535; // aby se nezahlasila stabilita hned pri prvni nulove hodnote
}
void loop (void)
{
pole_hodnot[ukazatel] = analogRead(A0);
ukazatel ++;
if (ukazatel == 600) ukazatel = 0;
unsigned int minimum = 65535;
unsigned int maximum = 0;
for (unsigned int i = 0; i< 600 ; i++)
{
if (pole_hodnot[i] > maximum) maximum = pole_hodnot[i];
if (pole_hodnot[i] < minimum) minimum = pole_hodnot[i];
}
float procenta = (float)(maximum - minimum) / (float)maximum ;
// Serial.println(maximum);
// Serial.println(minimum);
// Serial.println(procenta);
if (procenta <= 0.03) Serial.println ("Stabilni");
else Serial.println ("Nestabilni");
delay(1000);
}