Stránka 1 z 2

Data z DTH22

Napsal: 22 čer 2020, 07:26
od daton
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.

Re: Data z DTH22

Napsal: 22 čer 2020, 19:01
od gilhad
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"

Re: Data z DTH22

Napsal: 22 čer 2020, 19:11
od Pirx
- 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.

Re: Data z DTH22

Napsal: 22 čer 2020, 22:01
od daton
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?

Re: Data z DTH22

Napsal: 23 čer 2020, 00:28
od aladin
já všechno řeším přes výpis hodnot na terminál - je tam vidět, jaká hodnota je v proměnných.

Re: Data z DTH22

Napsal: 23 čer 2020, 07:23
od daton
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. :)

Re: Data z DTH22

Napsal: 06 črc 2020, 07:26
od Le-Ze
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);
}

Re: Data z DTH22

Napsal: 06 črc 2020, 10:23
od DavidO
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); 
}

Re: Data z DTH22

Napsal: 06 črc 2020, 10:57
od DavidO
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.

Re: Data z DTH22

Napsal: 09 črc 2020, 08:09
od daton
Koukám že se to tu rozjelo, tak se přidám s dalšími pokusy co jsem zatím dělal.
Jednak jak zde bylo zmíněno, jsem se zaměřil nejprve na to, proč to vlatně ted více jak měsíc nejde a před tím to téměř rok chodilo. První co jsem udělal, že jsem vyměnil čidlo, ale ne jen ze stejné várky, ale sehnal jsem i jiné kusy, výsledek stále stejný (nan.).
Tak že jsem začal měřit zakopaný kabel, ale izolační odpory jsou OK teoreticky by mohla kabel ovlivnit vlhkost okolní země, která právě před více jak měsícem začala razantně stoupat a stále se drží. Je to sice takové přitažené za vlasy, protože kabel je stíněný ale nic jiného mne už nenapadá.
K tomuto závěru jsem došel po tom co jsem vyměnil i přijímač tedy ESP8266 za jiný kus a zase nic.

Tedy jsem se podíval na signály osciloskopem a dobré je, že signál je čistý bez rušení. Horní části jednotlivých pulsů jsou zašpičatělé a protože to bude asi v rozhodovací oblasti, pak to zřejmě vadí při správném vyhodnocení signálu.

Proto jsem si říkal že to zkusím napájet 5V a dám tam převodníík 5/3,3V no výsledek byl stejný, ani převodník si s tím neporadil prostě stále byl signál stažen na uroveň 2,8V, pokud jsem datovou linku rozpojil bylo tam 5V ale při připojení čidla (dálkového ) to spadlo na 2,8 a není mi uplně jasné proč. Stejné čidlo ale na 0,5m dratů fungovalo bez problémů.
Tím jsem vyčerpal všechny jednoduché hrdwarové možnosti a další - do které se mi moc nechce je sestavení speciálního nejspíš dvoutranzistorového zesilovače, který by bral půlsy dole, kde jsou relativně v pořádku a zesiloval je do úrovně TTL.

Dale jsem to začal zkoumat z hlediska programu. No s tím bych asi potřeboval poradit, ale k tomu se dostanu. Zjistil jsem že skutečně knihovny v průběhu času měnily doby, při kterých čekaly na pulsy a to značně potom ovlivnilo rozpoznávání hodnot dodávaných čidlem. Adafruit udajně v nových knihovnách DHT v. 1.3.7 a výše už to umí, ale mě se to moc neprojevilo. Vyzkoušel jsem celou řadu jeho verzí ale zlepšení je minimální.
Potom jsem ale narazil na článek
https://github.com/beegee-tokyo/DHTesp

jehhož knihovna prý se umí s tímto vyrovnat. Zkusi jsem ji nainstalovat a skutečně tato knohovna umí z těch poškozených pulsu vytahnout data a s celkem velkou úspěšností. Problém zatím je, že jsem to zkoušel z jeho příkladu, kde je jen jedno čidlo a nějak se mi nedaří rozšířit to na dvě a více čidel. Nejsem si jist zda to ta knihovna umí. V každém případě je to pokrok, ale jen malý a pro mne zatím nepoužitelný. Pokud by jste věděli jak rozšířit jeho příklad na více čidel hodte mi rosím lano :-) Děkuji

PS Le-Ze ja měl taky problémy se zasekáváním čidla tak jsem využil fet tranzistor ze stareho akumulátoru noteboku který tam měl P-FETY a přes něj napájím to čidlo. Jednou za den se mi provádí jiná činnost vždy na minutu a tak jsem využil tento výstup k restartu čidla a se zasekáváním byl konec.