Stránka 1 z 1
Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 16:20
od Scherby
Ahoj všem,
Na webovém rozhraní mého arduino teploměru čtu naměřené hodnoty z databáze. Chtěl jsem přidat takovou tu šipičku ukazující nahoru, či dolů podle toho, jestli teplota stoupá, či klesá. Jenže nemůžu přijít na nějákou rozumnou funkci, jak zjisit stoupání/klesání hodnot

Napadá někoho něco ?
Teploměr posílá hodnotu zhruba každou minutu, takže by stačilo porovnávat dejme tomu posledních 10 hodnot.
Re: Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 18:11
od Anty
napadá mě provést to takto, s tím že do pole term si dostaneš naměřené hodnoty
vlastně jen sčítám rozdíly hodnot a přičítám k celkovému rozdůlu (int out)
Kód: Vybrat vše
int term[10]
term[0]= //aktuální hodnota
term[1]= //méně aktuální hodnota
...
term[9]= //nejméně aktuální hodnota
int out=0;
for(int i=1;i<10;i++) {out+=term[i] - term[i-1];}
if (out>0) { /*teplota stoupá*/ }
else if (out<0) { /*teplota stoupá*/ }
else { /*teplota je konstantní*/ }
Re: Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 18:34
od jankop
No já bych nehledal nějaké složité funkce jako je třeba směrnice přímky proložené naměřenými hodnotami teploty. Řeknu si: "Zajímá mě změna teploty za posledních deset minut větší jak 0.3 stupně. Vezmu teplotu před deseti minutami a současnou a porovnám je. Že to v průběhu těch deseti minut chvíli lezlo tam a chvíli zase tam? Kolísání mě nezajímá,to více méně eliminuje nastavený práh, zajímá mě skutečný trend.
Idea je v příloze, pochopitelně tam chybí to periodické čtení teploty, které musí vytvořit také "časovou základnu" pro trendování. Šlo by i sumovat rozdíly mezi jednotlivými vzorky a dělat z toho jakýsi dynamický trend, ale dle mého názoru čím složitější, tím menší výpovědní hodnota.
Kód: Vybrat vše
#define TRENDRAMP 0.3 // bude reagovat na zmenu vetsi nez 0.3 stupne
float OldSample;
unsigned char trend = 0;
void setup() {
// put your setup code here, to run once:
OldSample = 22.4; // nacteni teploty pri startu
}
void loop() {
// put your main code here, to run repeatedly:
}
/* tuto funkci volat treba po kazdych 10 merenich tj. 10 minutach
Vstupem je nove namerena hodnota a vystupem je trend
1 - sipka nahoru
0 - sipka vodorovne
-1 - sipka dolu */
int Trend(float NewSample) {
trend = 0;
float RawTrend = NewSample - OldSample;
if (abs(RawTrend) > TRENDRAMP) {
if (RawTrend > 0)trend = 1;
if (RawTrend < 0)trend = -1;
}
OldSample = NewSample;
return trend;
}
Re: Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 19:18
od pavel1tu
Já dělám na WWW průměr naměřených hodnot za určitou dobu (u mne 1h - u teploty venku to postačuje)
pak udělám porovnání 2 posledních hodnot a z toho generuji tendenci ....
Re: Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 19:28
od martinius96
Ja to robím takto na webe s PHP, kam mi Arduino posiela data.
Kód: Vybrat vše
<?php
include 'connect.php'; //pripojenie na db..
$teplota1 = mysqli_query($con,"SELECT teplota1 FROM mydb ORDER BY id DESC LIMIT 1") or die(mysqli_error($con));
while($line = mysqli_fetch_assoc($teplota1)){
$prvateplota = $line['teplota1']; //teplota (najnovsia)
}
$teplota1druha = mysqli_query($con,"SELECT teplota1 FROM mydb WHERE id=(SELECT MAX(id)-1 FROM mydb )") or die(mysqli_error($con));
while($line = mysqli_fetch_assoc($teplota1druha)){
$druhateplota =$line['teplota1']; //teplota (predposledna, teda najnovsia -1 podla id)
}
if($prvateplota<$druhateplota) {
$result = abs($prvateplota - $druhateplota);
$down = '<img src="http://www.stickpng.com/assets/images/58f8bd2e0ed2bdaf7c128309.png" alt="Down" title="Klesajúca tendencia o: '
. $result . '°C" height="32" width="32">';
echo $down; }
if($prvateplota>$druhateplota) {
$result = abs($prvateplota - $druhateplota);
$up = '<img src="https://cdn3.iconfinder.com/data/icons/musthave/256/Stock%20Index%20Up.png"alt="Up" title="Stúpajúca - tendencia o: '
. $result . '°C" height="32" width="32">';
echo $up;
}
if($prvateplota==$druhateplota) {
$tie = '<img src="http://www.iconsplace.com/icons/preview/orange/equal-sign-2-256.png" alt="Tie" title="Ustálená - Rozdiel 0°C" height="32" width="32">';
echo $tie; }
?>
Týmto štýlom to mám pre všetky premenné, ktoré skúmam, teda 2 teploty, barometer a vlhkomer.. Nemám to zapojené, tak som na ukažku nahral iba nejake teploty, tlaky, vlhkosti.. rozdiely su teda väčšie ako obyčajne.
Výsledok:

Po ukázaní myšou na danú tendenciu teploty:

Ten PHP script spúšťam cez AJAX, takže vidíš aj bez refreshu, keď príde nová teplota a tendencia sa zmení.
Re: Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 20:14
od jankop
No ta idea Antyho mi připadá velmi dobrá, její drobnou nevýhodou je relativně velká paměťová náročnost, ale zase je docela precizní.
Asi si ji přidám do svého barometru, který mám na trend už nachystaný. Představoval bych si to nějak takhle:
Kód: Vybrat vše
#define TRENDRAMP 0.3 // trend bude reagovat na zmenu vetsi nez 0.3 stupne/10 min
#define INDEX 9 // pocet hodnot pouzitych pro vypocet trendu
float OldSamples[INDEX + 1]; // pole pro uchovani poslednich deseti vzorku
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
/* tuto funkci volat po kazdem mereni,
trend je vyhodnocovan prubezne
Vstupem je nove namerena hodnota a vystupem je:
1 - sipka nahoru
0 - sipka vodorovne
-1 - sipka dolu */
int Trend(float NewSample) {
float RawTrend = 0;
char trend = 0;
// sumuje rozdil mezi predchozimi deseti vzorky a
// zaroven vzorky posouva v poli
for (int i = 0; i < INDEX; i++) {
RawTrend += OldSamples[i + 1] - OldSamples[i];
OldSamples[i] = OldSamples[i + 1];
}
// na uvolnene misto prida jeste posledni vzorek,/
OldSamples[INDEX] = NewSample;
RawTrend += OldSamples[INDEX] - OldSamples[INDEX - 1];
// vyhodnoti trend
if (abs(RawTrend) > TRENDRAMP) {
if (RawTrend > 0)trend = 1;
if (RawTrend < 0)trend = -1;
}
return trend;
}
Re: Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 20:16
od petan
Mám tu taky takovej teploměr - zkoušel jsem displej, takže žádná do-mrtě chytrá meteostanice
Tam načítám každých deset sekund. Ze šesti náměrů dělám minutový průměr. A z každých pěti minutových náměrů dělám pětiminutový průměr, který si ukládám za posledních 24 hodin. Z toho vykresluju graf - takže mi ho neovlivňují krátkodobé špičky, jakože někdo dejchne na čidlo atd...
Měl jsem tam funkci (teď to nepoužívám, protože to byl pro mě nezajímavý údaj), která mi ukazovala stoupání/klesání teplot. Vždy jsem porovnával poslední pětiminutový průměr s aktuálním pětiminutovým průměrem. Tím že je pětiminutový průměr složen celkem z 30 náměrů bylo zobrazování pěkně stabilní.
Re: Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 20:28
od jankop
To je pěkný, každej trochu jinak

Re: Jak zjistit, zda-li teplota stoupá, či klesá
Napsal: 21 úno 2018, 20:33
od petan
V podstatě jde o to, co člověk chce a jak to má bejt "živý"

Ono taky stačí jednoduše porovnávat předchozí náměr s aktuálním. Ale pak se do trendu dost promítá nepřesnost čidla - teplota sice muže dlouhodobě klesat, ale když ti čidlo lítá o desetinu stupně, tak ti pak šipka mrdlá ze strany na stranu.
Ten způsob, co jsi napsal výše je v pohodě. Chce to reagovat na nějakej průměr.