Data z DTH22

Odpovědět
daton
Příspěvky: 557
Registrován: 16 bře 2013, 16:12

Data z DTH22

Příspěvek od daton » 22 čer 2020, 07:26

Zdravím
mám jen teoretický dotaz, zatím jsem to nezkoušel ale přemýšlím o tom. Jedná se o sběr dat z DTH22. Mám ho na dlouhém vedení a signál někdy vypadne a pak je tam hodnota která se mi na displeji nezobrazí. Potřeboval bych napsat něco jako

if ((ta > (-25)) and (ta <60)) then {tc=ta;}
jak vám asi došlo ta je hodnota teploty z čidla a tc zobrazovaná. Jde mi o to jestli program pochopí, že chci aby tam byla hodnota, kterou to sebralo když zařízení mělo světlou chvilku a vypustilo hodnoty nebo nic když mělo horší chvíle.

Nebo to takto ošetřit nelze.

Uživatelský avatar
gilhad
Příspěvky: 201
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: Data z DTH22

Příspěvek od gilhad » 22 čer 2020, 19:01

kdyz to udelas takhle, tak pokud je stav cidla OK, tak se ulozi (a asi i zobrazi) ta nova hodnota. Pokud neni, tak se hodnota neupdatuje a zustane tam ta stara.

Pokud bys chtel ukazat, ze hodnota neprisla, musis tam dat do else, ze tc= "neco, co znamena, ze se nenacetlo nic"

Pirx
Příspěvky: 155
Registrován: 24 úno 2013, 16:29
Kontaktovat uživatele:

Re: Data z DTH22

Příspěvek od Pirx » 22 čer 2020, 19:11

- Neni zrejma platforma, ale v C by to bylo nejak takto:

Kód: Vybrat vše

if (ta > -25) && (ta < 60) tc=ta;
kdy ta a tc je nejaka znamenkova promenna.

ALE, pokud bude hodnota ta dlouhodobe mimo zadany interal, dojde k tomu, ze tc nebude aktualizovana a displej bude zobrazovat velmi starou hodnotu, coz je problem.

Pokud chces maskovat kratkodobe vypadky, ale reagovat na opravdovy prusvih, napsal bych to nejak takto:

Kód: Vybrat vše

#define MaxChyb 10
unsigned char PocetChyb = 0; // Max 255 chyb

// ....

if (ta > -25) && (ta < 60) {
  PocetChyb = 0; // Hodnota OK, nulujeme pocitadlo chyb
  tc=ta;
}
else if (PocetChyb < MaxChyb) {
  PocetChyb++; // Chyba -> zvysit pocet chyb, zachovat predchozi tc
 }
 else {
   tc=NejakaHodnotaJakoChybaProZobrazeni; // Uz je toho moc, zobraz nejakou indikaci, ze se pokazilo spojeni
 }
Samozrejme to jde jakkoliv jinak, ale idea je snad zrejma.

Pirx.
Solder fumes makes you stronger!

daton
Příspěvky: 557
Registrován: 16 bře 2013, 16:12

Re: Data z DTH22

Příspěvek od daton » 22 čer 2020, 22:01

Ahoj
Jo přesně tak jsem to myslel ale problém nevidím s tim ze tam bude starší hodnota problém co vidím já je v tom jestli bude ta podmínka fungovat. Netuším totiž jakou hodnotu generuje to čidlo či spíše negeneruje. Jde o to že netuším zda je ta hodnota číselná nebo nějaký znak co možná ani není v naší abecede a teď si s tim bude muset poradit tato podmínka myslíte že to zvládne?

aladin
Příspěvky: 241
Registrován: 12 kvě 2013, 06:43

Re: Data z DTH22

Příspěvek od aladin » 23 čer 2020, 00:28

já všechno řeším přes výpis hodnot na terminál - je tam vidět, jaká hodnota je v proměnných.
fischertip.cz, Stavebnice.com, MerkurRobot.cz, KlubTechniku.cz

daton
Příspěvky: 557
Registrován: 16 bře 2013, 16:12

Re: Data z DTH22

Příspěvek od daton » 23 čer 2020, 07:23

Jo jo to musím taky udělat. Jak bude chvilka tak to vyzkouším a potom napíši co tam bylo ajestli se to tímto způsobem vyřešilo. Díky za příspěvky. :)

Le-Ze
Příspěvky: 78
Registrován: 31 kvě 2017, 15:37

Re: Data z DTH22

Příspěvek od Le-Ze » 06 črc 2020, 07:26

signál někdy vypadne
Jak vypadne?
Mám 12 kousku na až 10 metrových UTP a nic nepada.
DTH22 se občas sekne a pak misto teploty posila NAN.
Po seknutí se mi ještě nestal, že by samo naskočilo.
Čidla napajím, přes pin a pokud mi z nějakeho přijde NAN, restartují je.
if (h_loz != "NAN")
{
Serial.println("loznice|" + t_loz + "|" + h_loz);
delay(50);
}
else
{
Serial.println("rebootpin53-l");
digitalWrite(53, LOW);
delay(1000);
digitalWrite(53, HIGH);
}

DavidO
Příspěvky: 878
Registrován: 01 kvě 2013, 21:27

Re: Data z DTH22

Příspěvek od DavidO » 06 črc 2020, 10:23

daton píše:
22 čer 2020, 22:01
Netuším totiž jakou hodnotu generuje to čidlo či spíše negeneruje. Jde o to že netuším zda je ta hodnota číselná nebo nějaký znak co možná ani není v naší abecede a teď si s tim bude muset poradit tato podmínka myslíte že to zvládne?
Určitě; důvěřuj podmínkám, to jsou holky pracantky a zvládnou toho fakt hodně ;)

Záleží na tom, jak to z toho čidla čteš. V datasheetu se píše, že to posílá 4 byty dat + kontrolní součet, ale jestli to čteš pomocí nějaké knihovny, tak se musíš podívat přesně na tu knihovnu co máš (pro Arduino jich je víc jak 10 různých), co a jak ti vrací a jak poznat, že data jsou blbě. Při přímém čtení bez knihovny rovnou ze senzoru bys to poznal buď tak, že s tebou čidlo vůbec nemluví, nebo že ten kontrolní součet nesouhlasí. Knihovny to budou dělat taky tak nějak, ale jak to dají najevo navenek, nejde říct obecně, to záleží na té které implementaci. Nicméně čekal bych, že když se knihovny zeptáš na hodnotu teploty nebo vlhkosti, tak ti za prvé nevrátí žádný "znak", ale číslo a to typu float, který buď je ta hodnota co chceš vědět, nebo NAN ("Not a number", symbolické označení, že to není rozumné číslo) a to v C++ (a tedy Arduinu, jestli to je pro něj) otestuješ nejlíp funkcí isnan:

Kód: Vybrat vše

if( isnan(hodnota) ) 
{
  Serial.println("Sorry vole error"); 
} 
else 
{
  Serial.print("Hodnota je: ");
  Serial.println(hodnota); 
}

DavidO
Příspěvky: 878
Registrován: 01 kvě 2013, 21:27

Re: Data z DTH22

Příspěvek od DavidO » 06 črc 2020, 10:57

Pár pedantických poznámek, doufám, že je učiteli, který má o prázdninách zjevný učící absťák, prominete:
Le-Ze píše:
06 črc 2020, 07:26
signál někdy vypadne
Jak vypadne?
Mám 12 kousku na až 10 metrových UTP a nic nepada.
DTH22 se občas sekne a pak misto teploty posila NAN.
No to se mi zdá přesně sedí na označení "vypadne" :D
Asi to čteš přes nějakou knihovnu a jak jsem se tak do jedné náhodně stažené podíval, je to přesně tak - buď data dlouho nejdou, anebo nesouhlasí ten kontrolní součet a funkce proto vrátí NAN.
Le-Ze píše:
06 črc 2020, 07:26
Po seknutí se mi ještě nestal, že by samo naskočilo.
Čidla napajím, přes pin a pokud mi z nějakeho přijde NAN, restartují je.
Jo. Vypnout a zapnout je asi jediné, co se s tím dá udělat, takže OK.

Akorát teda napájet čidlo rovnou z pinu je obecně trochu vošajslich, ale při zvážení, že tohle konkrétní čidlo bere podle DS max 1.5 mA (při měření, jinak ve stand-by 50 uA), se to pro takové to domácí žvýkání dá. Pro jistotu bych tam ale dal do série odpor, aby se neodpálil ten MCU při zkratu někde na drátě nebo u čidla (např. zateče ti tam voda nebo bude tak vlhko, že se zkratuje napájení čidla, takže to napájecí HIGH z pinu půjde rovnou do země).
Le-Ze píše:
06 črc 2020, 07:26

Kód: Vybrat vše

if (h_loz != "NAN")
{
          Serial.println("loznice|" + t_loz + "|" + h_loz);
          delay(50);
}  
else
{   
          Serial.println("rebootpin53-l");
          digitalWrite(53, LOW);
          delay(1000);
          digitalWrite(53, HIGH); 
}
Test if (h_loz != "NAN") se mi zdá trochu vachrlatej, ale nevím, jakého typu proměnná h_loz je. Možná takového, že se dá porovnat s konstantním řetězcem, ale i tak se mi to nějak nelíbí, radši bych použil funkci, co na to je přímo určená, i když připouštím, že to ve tvém programu může dávat lepší smysl takhle - nevím, nevidím zbytek kódu, tak těžko říct, jen hádám a od oka se mi to nějak nelíbí :mrgreen:

Nemáš tam doufám podobnou sekvenci i pro h_obyvak, h_bar, h_sklep, h_kuchyn, h_mrkev, h_tulipan a tak dál, který se lišej jen slovním označením a místo 53 něco jiného, že?

Kusy kódu bal do [code] místo [quote] (ikonka s šikmou p.... vedle ikonky s uvozovkama), v téhle odpovědi jsem to tak udělal, kód se tak dá líp naformátovat i kopírovat.

Odpovědět

Kdo je online

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