Jak zjistit, zda-li teplota stoupá, či klesá

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, ...)
Odpovědět
Scherby
Příspěvky: 1
Registrován: 21 úno 2018, 16:16

Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od Scherby » 21 úno 2018, 16:20

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.

Anty
Příspěvky: 6
Registrován: 21 úno 2018, 17:28

Re: Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od Anty » 21 úno 2018, 18:11

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í*/ }

jankop
Příspěvky: 1058
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od jankop » 21 úno 2018, 18:34

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

Uživatelský avatar
pavel1tu
Příspěvky: 2065
Registrován: 26 říj 2017, 08:28
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od pavel1tu » 21 úno 2018, 19:18

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 ....
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

martinius96
Příspěvky: 587
Registrován: 01 srp 2017, 19:29
Bydliště: Poprad
Kontaktovat uživatele:

Re: Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od martinius96 » 21 úno 2018, 19:28

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:
Obrázek
Po ukázaní myšou na danú tendenciu teploty:
Obrázek
Obrázek
Ten PHP script spúšťam cez AJAX, takže vidíš aj bez refreshu, keď príde nová teplota a tendencia sa zmení.

jankop
Příspěvky: 1058
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od jankop » 21 úno 2018, 20:14

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

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Kontaktovat uživatele:

Re: Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od petan » 21 úno 2018, 20:16

Mám tu taky takovej teploměr - zkoušel jsem displej, takže žádná do-mrtě chytrá meteostanice :D

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í.
Přílohy
WP_20180221_20_18_21_Pro.jpg
WP_20180221_20_18_39_Pro.jpg

jankop
Příspěvky: 1058
Registrován: 06 zář 2017, 20:04
Bydliště: Brno
Kontaktovat uživatele:

Re: Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od jankop » 21 úno 2018, 20:28

To je pěkný, každej trochu jinak :D

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Kontaktovat uživatele:

Re: Jak zjistit, zda-li teplota stoupá, či klesá

Příspěvek od petan » 21 úno 2018, 20:33

V podstatě jde o to, co člověk chce a jak to má bejt "živý" :D
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.

Odpovědět

Kdo je online

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