Pomoc se výkladem kodu

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

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

DavidO píše: 23 lis 2018, 10:05Ve for cyklu v podmínce vždycky piš ==.
Tedy samozřejmě pokud chceš testovat rovnost. Samozřejmě testovat nerovnosti (>, <, >=, <=) nebo ne-rovnost (!=) můžeš taky. Ale rozhodně v podmínce nepiš jen jedno rovnítko samotné. To je přiřazení, ne porovnání.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Pokud jsi to Davide psal pro mne pak moc dík a pokud ne pak taky dík už je mi to jasnější :)
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

A pro koho asi, pro pgerlu? :lol:
Jsem rád, že ti to je jasnější.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Zdravím všechny
mám problém s vysvětlením funkce kodu u knihovny NTPClient. Možná je tento příkaz rozšířený i mimo tuto knihovnu ale nepodařilo se mi zatím zjistit jak je strukturováno číslo na které je k tomu následujícímu příkazu přiřazeno jako hodnota datumu a času v jednom. Jde mi o to že potřebuji z tohoto čísla vyselektovat jednotlivé hodnoty. Máte někdo nějakou radu jak to udělat?
Jde o příkaz
formattedTime

přičemž v některých kodech se normálne zadává jako
display.println(formattedTime);

což je výpis na displej ale já bych potřeboval vyselektovat sekundy a hodiny do proměnných vzlášt.
Našel jsem tyto vysvětlivky ale moc tomu nerozumím jak to v arduinu použit abych to vyselektoval.

https://github.com/sstaub/NTP

Prosím byl by někdo ochoten mi napsat nebo i vysvětlit jak to funguje a jak to rozselektovat? Moc dík
PS
ještě jsem našel tento kod ale při vložení do příkladu to skončí vždy chybou právě na těch výrazech dne roku atd

Kód: Vybrat vše

///Serial.println(formattedTime("%d. %B %Y")); // dd. Mmm yyyy
//  Serial.println(formattedTime("%A %T")); // Www hh:mm:ss
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

Protože nevidíme ten kód, tak těžko radit. Co je ale jasné, je to, že formattedTime není příkaz, ale proměnná, kterou necháš tím Serial.printlm vypsat. Kde se vzala ta proměnná? Někde se do ní něco muselo přiřadit, tak hledej kde, zjisti jakého je ta proměnná typu, najdi si knihovnu, kde je definovaná a v její dokumentaci nebo zdrojáku to je napsané.

Nicméně, obvykle je čas uchovávaný jako počet časových jednotek od nějakého konkrétního času a v NTP protokolu to není jinak. Jestli ta knihovna je tohle, tak ta čas bere ze serveru pomocí toho NTP protokolu, který čas posílá jako počet vteřin od 1.1.1900. Knihovna si to převede na "Epoch Time" jaký se používá třeba v linuxu, to je počet vteřin od 1.1.1970. Metoda getFormattedTime() její třídy NTPClient pak vrátí řetězec odpovídající aktuálnímu času (resp. času, který si myslí, že je aktuální) a to jako hodiny:minuty:vteřiny. Jestli chceš jen něco z toho a jako číslo, tak se podívej do dokumentace k té knihovně a najdeš tam metody na hodiny, minuty, vteřiny a den v týdnu. Ostatní jako datum nebo rok by sis musel spočítat sám z čísla, co ti vrátí metoda getEpochTime(), a to bude právě ten počet vteřin od 1.1.1970.
Jestli ta ukázka kódu co ti skončí chybou (kterou jsi nám neřekl) je odsud, tak to je druhá možnost, ale jiná, než ta předchozí a tys sis to smíchal dohromady (a jestli to je ono, tak jsi to opsal navíc necelé). Autor té ukázky si napsal vlastní knihovnu, její hlavní částí je třída NTP, jejíž konkrétní instanci v ukázce pojmenoval ntp a to taky musíš "oslovit", když od toho něco chceš. Takže například Serial.println(ntp.formattedTime("%A %T")); a ne Serial.println(formattedTime("%A %T")); (a předtím samozřejmě musíš tu proměnnou ntp vytvořit a patřičně nastavit a aktualizovat, viz ten příklad na githubu).

Nebo můžeš jako třetí možnost využít knihovnu Arduino Time, která má funkcí vracejících jednotlivé složky času víc, než co je v NTPClient.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Hmm popsal jsi problém hezky, lépe než já ale nějak nevidím řešení. Jo že to je nějak zakódovaný čas jsem pochopil i to že je ho třeba rozkódovat. A ano prošel jsem si všechny ty příklady co jsi zde uvedl už před tím a neuvedl jsem je to je správný poznatek protože jsem předpokládal že kdo bude o FormattedTime() něco vědět asi už s tím dělal a vše co ted potřebuji zjistit už dávno zjistil.
Právě u tvé odpovědi je zřejmé že jsem měl pravdu protože toho o tom víš hodně :-) což je potěšující. Méně potěšující už je že stále nevím jak touto metodou přiřadit jednotlivé hodnoty do proměnných. Nejvíce se mi zamlouvá použití knihovny NTPClient jak jsem psal ve svém předchozím příspěvku a u tebe je to první možnost. Do dokumentace jsem se díval ale nějak tomu nerozumím. Proto jsem to psal zda by mi to někdo mohl vysvětlit.
Druhá možnost byla knihovna pojmenovaní stejně ale upravená autorem jak jsi odhalil také a popravdě když jsem zjistil že není steejněp pojmenovaná knihovna jako stejně pojmenovaná knohovna (pro matematiky 1 se nerovná 1) tak jsem od toho šel pryč ale trochu mi vrtalo hlavou jestli některé příkazy nejsou stejné a proto jsem to uvedl.
Třetí metod kterou popisuješ asi nepůjde použít protože to hodlám nasadit na ESP a to má některé další navazující knihovny trochu upravené a nemuselo by to fungovat když tam není autorem napsáno že to odzkoušel i pro tyto desky.

Prosím tedy zkus mi jednoduše napsat jak tou metodou FormattedTime() transformuji hodiny do proměnné x minuty do y a sekundy do z,
---nebo aspon naznač --- ale dost konkrétně :-)
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Pomoc se výkladem kodu

Příspěvek od DavidO »

Řešení je podívat se dovnitř do té knihovny, kterou chceš použít.
Konkrétní naznačení: NTPClient.h řádky 68-71, jak to "dekódujou" je v NTPClient.cpp, řádky 110-121.

Zakódovaný to není. Je to prostě počet vteřin od někdy, konkrétně od 1.1.1970, tak si to vyděl a je to.

To 1 se nerovná 1 je mimo, první knihovna se jmenuje NTPClient a druhá se jmenuje NTP. Jmenujou se různě, i když obě mají v názvu NTP, ale to není divu, když obě pracují s NTP protokolem. To leda že ta druhá je víc prasácká, protože pojmenovat knihovnu implementující nějakou nadstavbu nad malinkou částí možností protokolu NTP jménem toho protokolu je poněkud ehm zavádějící.
Co se týče knihovny Time, tak ta je standardní součástí Arduina už roky. Že se jí bojíš, no to by ses takhle teda měl bát úplně všech knihoven, i těch, které někdo napsal, že mu fungovaly na ESP, protože to ještě neznamená, že to bude fungovat dohromady s jinou knihovnou, kterou taky někdo na ESP zkusil. Tak to bohužel na Arduinu je.
Zrovna Time je myslím jedna z knihoven, které jsou docela udržované, je psaná docela hezky a rozhodně má víc funkčnosti (a lepší) než ty dvě první.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
MartinL
Příspěvky: 252
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: Pomoc se výkladem kodu

Příspěvek od MartinL »

Vzhledem k tomu, že občas zjišťovat, co daná knihovna dělá, dá dost práce. Jsem zastáncem jednoduchých řešení = nepoužívej knihovnu, ale napiš si to sám.

time = ntpClient.getEpochTime();
sekundy = time % 60;
minuty = (time / 60) % 60;
hodiny = (time / 3600) % 24;
Naposledy upravil(a) MartinL dne 29 lis 2018, 16:49, celkem upraveno 1 x.
MartinL
Příspěvky: 252
Registrován: 24 úno 2013, 14:13
Kontaktovat uživatele:

Re: Pomoc se výkladem kodu

Příspěvek od MartinL »

Resp. teď koukám do Davidova odkazu, že je to zcela triviální, neboť tam jsou na to přímo metody:

sekundy = ntpClient.getSeconds();
minuty = ntpClient.getMinutes();
hodiny = ntpClient.getHours();
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Pomoc se výkladem kodu

Příspěvek od daton »

Moc díky Martine ten první způsob bez knihovny je ten nejlepší co může být, to je přesně to co jsem potřeboval vědět. Ještě jednou dík
PS těch knihoven už tam mám bez tak dost
Odpovědět