Jak zjistit, že je hodnota stabilní

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Jak zjistit, že je hodnota stabilní

Příspěvek od AstroMiK » 06 kvě 2019, 19:19

Řeším teď takový zajímavý problém.

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);
    
  }



HrAd
Příspěvky: 35
Registrován: 12 říj 2017, 22:45
Reputation: 0

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od HrAd » 06 kvě 2019, 20:59

Nestačilo by vzorkovat pouze 1 minutu vybrat min./max. uložit hodnoty a pak srovnavat těch 10 vzorků? Rázem je toho 10x méně ;)

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od AstroMiK » 06 kvě 2019, 21:21

Nad tím jsem taky ze začátku uvažoval, ale kdyby k nestabilitě došlo třeba na začátku jednoho toho minutového bloku,
tak si zbytečně prodloužím dobu testování o skoro celou minutu.

Nakonec to ale v tomhle případě hodím na silnější hardwér, kde s velikostí RAM není problém.

Jen mě zajímalo, jestli někoho nenapadne nějaké geniálně jednoduché řešení.

HrAd
Příspěvky: 35
Registrován: 12 říj 2017, 22:45
Reputation: 0

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od HrAd » 06 kvě 2019, 21:33

No ale nic předse nebrání před ukožením každou sekundovou hodnotu otestovat na těch deset vzorků a když je to mimo, udělat akci...

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od ohruska » 06 kvě 2019, 22:11

Zdravím.
Není mě jasné co přesně chceš měřit. Ale pro měření třeba napětí, kde se vyskytují náhodné špičky, třeba rušení, se používá kalmanův filtr.
Pro měření směru větru měřím 9x,první 3 hodnoty zapíšu do pole, z toho odstraním největší a nejmenší, výsledek dám do dalšího pole jako první hodnotu. Měření opakuji 3x, abych měl zase 3 hodnoty. Případně se dá pokračovat zase násobkem 3. Pokud by se dal brát průměr z hodnot, tak třeba z 5-ti měření se odstraní nejvyšší s nejnižší a prostřední tři se průměrují.
Ota

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od AstroMiK » 06 kvě 2019, 22:52

HrAd:
Tohle nějak nechápu.

Přikládám obrázek.

Ta původní metoda s ukládáním 600 hodnot je zobrazena modře. 10 minut po poslení nestabilitě hlásím, že je stav stabilní.
Podle obrázku je to tedy někdy na začátku 11. minuty.

Při té tvojí metodě (zeleně) sice zjistím, že je v rámci 1. minutového bloku nějaká nestabilita, tak celý blok vyhodím a začnu měřit znova. Takže stabilní hodnotu poznám až na konci 11. minuty

Když nad tím teď ještě uvažuji, tak já vlastně dokud neznám maximální hodnotu z těch celých 10 minut, tak ani nevím, jestli
se s některou nestabilitou nevejdu pod ty 3%.
stabilita.gif
stabilita.gif (7.65 KiB) Zobrazeno 3962 x

---
Ota:

V tomhle případě mi nejde o průměrování naměřených hodnot, ale jen zjišťování, že se už alespoň 10 minut hodnota nějak výrazně nehýbe.

Jedná se o něco jako "plotýnku", na které se testuje chování různých čidel při různých teplotách. Podle předpisu ale musí být teplota při testech stabilní.
Už mě otravovalo půl hodiny sledovat teploměr, jestli už se ustálil, tak vymýšlím něco, co ukáže, že TEĎ už se může začít testovat.
cidlo.jpg

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od kiRRow » 07 kvě 2019, 07:20

Jestli jsem to pochopil správně, tak v podstatě je třeba udělat za sebou 600 úspěšných měření. Úspěšné měření je takové, kde se měřená hodnota nevychýlí o více jak 3%.

Každé měření porovnám s poslední hodnotou v paměti, pokud jsem v oněch 3% toleranci připočtu si k úspěšnému měření + 1, pokud ne vynuluji čítač úspěšných měření a do paměti s poslední hodnotou uložím novou hodnotu.

Pokud je počet úspěšných měření >600, tak je hodnota stabilní.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od AstroMiK » 07 kvě 2019, 08:13

To je zajímavý přístup.
Zkusím to ještě promyslet.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od AstroMiK » 07 kvě 2019, 08:50

... tak ne.
Dostávám se do podobné situace jako v dřívějším příspěvku.

Příklad:
Hodnota ze začátku strmě roste, takže se v podstatě v každém kroku nuluje to počítadlo úspěchů - to je OK.
Pak se hodnota začíná srovnávat, ale pořád se po několika minutách může stát, že rozdíl aktuální hodnoty od hodnoty při posledním vynulování je víc
než 3%. Takže znova nuluju počítadlo úspěchů a musím čekat dalších minimálně 600 sekund. I když by ve skutečnosti stačilo čekat třeba jen pár sekund.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Jak zjistit, že je hodnota stabilní

Příspěvek od kiRRow » 07 kvě 2019, 09:36

Pak je nutno podmínku pro nulování počítadla úspěšných měření rozšířit.

Například počítáním neúspěšných měření. Pokud je měření neúspěšné připočteme 1, pokud je úspěšné (a samozřejmě > 0) odečteme 1 ... k vynulování čítače úspěšných měření dojde, pokud čítač neúspěšných měření dosáhne určité hodnoty.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů