Pomoc se výkladem kodu

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

Re: Pomoc se výkladem kodu

Příspěvek od DavidO » 03 črc 2019, 11:28

Buď klidnej - naši studenti jsou velmi ikreativní a to, co umějí stvořit, mi pohodlně pro ukázky, jak se to nemá dělat, stačí :lol:

Ještě prosím odpověď na zbylé dvě otázky z mého posledního příspěvku:
2) kterou verzi podpory pro ESP32 a 3) kterou verzi Arduino IDE používáš?

A pro jistotu navíc doplňuji:
4) Odkud (nebo podle kterého návodu) jsi tu podporu pro ESP32 stáhnul?
5) Co máš uvedené ve File / Preferences / Additional Boards Manager URLs resp. česky Soubor / Vlastnosti / Správce dalších desek URL (teda kdo to překládal...)
6) Kterou konkrétní desku s ESP32 používáš?

Ptám se tak podrobně, protože v Arduinu opravdu často silně záleží na tom, jakou verzi čeho máš, s jednou to funguje nějak a s jinou jinak nebo vůbec ne a přitom to na první pohled vypadá stejně. Ta mašinérie prostě před uživatelem/programátorem spoustu věcí skrývá a v kombinaci s nevalnou úrovní různých knihoven a jejich vzájemnou nekompatibilitou to není jednoduché. Ale jestli nechceš, tak já se nebudu snažit ti poradit, ono mi vlastně není moc jasné, jestli o to stojíš nebo ne, když (z mého pohledu) z tebe potřebné informace musím takhle páčit a přitom to tebe podle tónu odpovědí možná i uráži.

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

Re: Pomoc se výkladem kodu

Příspěvek od daton » 06 črc 2019, 21:59

A je a k tomu závěru jsem se právě nechtěl dostat. Ne nic mne neuráží (teda pokud se to tyká software) :-) . Jen dle mých zkušeností to není tak hrozné. Zkoušel jsem mnoho IDE jak portable tak instalovaných a neřekl bych že v tom byl nějaký rozdíl tedy alespon ve funkčnosti, rozhodně tam byl rozdíl ve velikosti a taky citlivosti na jednotlivé knihovny ta je dost hrozná.
Pokud jde o ide používám stále verzi 1.8.2 portable ta se mi osvědčila.
Podporu pro ide používám z tohoto odkazu a popravdě ani jsem jiný nenašel je podpora z tohoto zdroje
https://dl.espressif.com/dl/package_esp32_index.json
a návod zde
https://circuitdigest.com/microcontroll ... rduino-ide
deska je tato
https://www.aliexpress.com/item/3299646 ... af6a76a5de
jo a stejně se to chová i s ESP8266 tu mám verzi devkit v.1 taky s verzí zdroje z espresiv do ide 1.8.2.

Ale zjistil jsem že to nějak souvisí i s prohlížečem protože po jeho opětovném načtení se zase pár kliknutí dá provést než se to začne zpomalovat a potom jsou již prodlevy nepřijatelné.
Takto se to chová stejně s ESP 32 i s ESP 8266.
Zajímavé je že pokud tam je internet přístupný tak to vše funguje stále a bez problémů. Pokud tam nechám načíst datum po 6 minutách (to je doba pro synchronizaci jen zatím pokusně určená) tak těch 6 minut bez internetu to jde pak se to začne zpomalovat a odezvy jsou delší a po několika kliknutích na softwarové spínače je to v koncích. Ale tady to pokulhává protože pokud připojím internet vše se rozběhne normálně, ale po opětném odpojení internetu se to začne zpomalovat hned a už to nečeká těch 6 minut na opětovnou aktualizaci času.
No pokud jsem na něco zapomněl tak mi to ještě připomeň. Zatím ahoj

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

Re: Pomoc se výkladem kodu

Příspěvek od daton » 07 črc 2019, 08:04

Jo ještě nastavení je zde
param.png
param.png (10.38 KiB) Zobrazeno 135 x

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

Re: Pomoc se výkladem kodu

Příspěvek od DavidO » 07 črc 2019, 22:16

daton píše:
06 črc 2019, 21:59
Ne nic mne neuráží (teda pokud se to tyká software)
Supr, to jsem rád. Já zas z druhé strany nemám potřebu urážet, takže jsme zajedno, paráda. Já si z lidí dělám srandu, ale jednak ne v souvislostí s tím, že někdo něco neumí, a taky to fakt nemyslím urážlivě.
daton píše:
06 črc 2019, 21:59
Zkoušel jsem mnoho IDE jak portable tak instalovaných a neřekl bych že v tom byl nějaký rozdíl tedy alespon ve funkčnosti,
Tak to máš nevšední kliku :D
daton píše:
06 črc 2019, 21:59
rozhodně tam byl rozdíl ve velikosti a taky citlivosti na jednotlivé knihovny ta je dost hrozná.
No a vidíš, to je přesně to, na co jsem narážel. Prostě když se něco zkouší jinde s jinými verzemi, tak to velmi často funguje jinak nebo vůbec.

Dík za upřesnění verzí, teď se s tím dá pracovat. Jen ještě drobnost, odpověď na otázku 2) - verzi podpory ESP32 najdeš v Manažéru Desek, já to teď zkoumám s 1.0.2, a k těm knihovnám ještě maličkost, ke knihovně DHT je potřeba ještě knihovna Adafruit Unified Sensor, tu jsem si stáhl 1.0.3. Nejspíš to bude buď to co máš, nebo kompatibilní, ale kdyby se to náhodou chovalo jinak, tak ať víme, na čem jsme.

Teď k tvému problému:
První co se dá udělat, je omezit získávání času, aby se nezkoušelo čekat 5 vteřin. Na řádce 382 doplň do volání funkce druhý parametr:
if(!getLocalTime(&timeinfo,1000)){Je to v milisekundách, takže si zjisti nebo vycucej z palce vhodný čas, který za normálních okolností už bude stačit běžné latenci internetu (když by to bylo moc krátké, tak se správný čas nikdy nedovíš, protože by se ještě před jeho zjištěním přestalo čekat, až přijde), a při odpojeném internetu naopak nebude nepřijatelně dlouhý, jako teď těch 5s. (tohle jsem vykoukal ze zdrojáku té knihovny, takže tady je ta potřeba vědět, co přesně za knihovnu používáš)

Dále bych čekání na aktivaci wifi dal do setup, aby tam v loop nestrašil ten test po celou zbylou dobu života, když to je potřeba jen jednou na začátku.

Ale i tak se mi ten test zdá divný: při úplně prvním spuštění loop je tik = 0 a ms něco asi malého ale určitě nenulového. Takže ms je určitě větší než tik, tik je 0, takže v testu není splněno tik > 1000, ale "ujme" se druhá část (za "or"), tj. tik <1000 a zároveň ms < 50000. Takže celkově je podmínka v tom ifu splněná a tedy se vykoná blok za ním - takže hned při prvním spuštění loop se celé to tělo provede. Tak to opravdu má být? (možná jsem ale jen neporozuměl logice okolo toho čekání na wifi)

Správné zacházení s časem je o trochu složitější; tak, jak to máš napsané, to nejspíš bude kulhat, protože tam máš přičítání jen jedné vteřiny, ale na některých místech máš několikrát delay, které v součtu jsou několik vteřin. (rozebírali jsme to jednou na Robodoupěti, ale myslím, žes tam nebyl). Ono se to ale nejspíš normálně sesynchronizuje podle internetu, takže to možná ani nebude vadit.

Zpracování jednotlivých automatických akcí by bylo lepší dělat asynchronně, protože kdyby ses s požadavkem zvenku trefil třeba do chvíle, kdy se zahájí sekvence řídící vybavování rolet, tak by to reagovalo až po jejím úplném ukončení a to může být za dlouho. (stejně tak to zjišťování času, ale to už by se musel program dost předělat)

Místo všech sekvencí typu if (pamrol2 == 1) {digitalWrite(12, HIGH);} else {digitalWrite (12,LOW);} bych si radši napsal něco lidsky čitelnějšího. Jednak bych si ty LEDky pojmenoval, abych si nemusel pamatovat, že LEDky jsou přeházené, když pro roletu 1 je 14, pro 2 12 a pro 3 13. Dále se tohle dá zobecnit např. na výkonnou funkci

Kód: Vybrat vše

void setLed(uint8_t led, uint8_t stav) {
digitalWrite(led, stav==1);
}
(tady je takovej céčkovej trik, je tam dvojité rovnítko)
a pak její používání, např. místo řádků 541-543 napsat

Kód: Vybrat vše

setLed(ROLETA1_LED, pamrol1);
setLed(ROLETA2_LED, pamrol2);
setLed(ROLETA3_LED, pamrol3);
pro což bych si ještě na začátku nadefinoval

Kód: Vybrat vše

const uint8_t ROLETA1_LED = 14;
const uint8_t ROLETA2_LED = 12;
const uint8_t ROLETA3_LED = 13;
a pak bych v setup a kdekoli jinde místo té 14 psal ROLETA1_LED. A tak bych na první pohled v programu viděl, co to znamená.

No ale taky bych se znalostí toho, co znamená digitalWrite, co znamená HIGH a LOW a že rol a pamrol jsou vždycky buď 0 anebo 1, mohl klidně napsat
digitalWrite(ROLETA1_LED, pamrol1);
digitalWrite(ROLETA2_LED, pamrol2);
digitalWrite(ROLETA3_LED, pamrol3);
a vyšlo by to nastejno, akorát by tomu někdo málo znalý C/C++ možná moc nerozuměl ;)


Proměnné rol1rol3 se používají jako pouze dvě různé logické hodnoty, klidně bych si pro ně nadefinoval konstanty DOLE a NAHORE s hodnotou 0 a 1 (nebo naopak? Vidíš, nemusel bych o tom přemýšlet, jaké číslo znamená dole a jaké nahoře). Navíc, v testech od řádku 489 dál není potřeba zkoumat, jestli jsou nahoře nebo dole, prostě to tam přiřaď, kdyby už měly správnou hodnotu, tak se jejím opětovným přiřazením vůbec nic nezmění, ale bude to o něco méně kódu a celé se to vykoná o něco rychleji. (Trochu otázne je, jestli by se to mělo deklarovat spíš jako typ bool místo int co máš teď, protože bool by sice byl logičtější pro takovéhle použití, ale zrovna na ESP32 je práce s int rychlejší a zabere míň místa v programu, než s kratšími typy jako je zrovna bool. Takže bych asi řekl - dokud máš paměti víc než dost, klidně tam sypej int, ono se nic moc špatnýho nestane. A až ti paměť dojde, tak to přepiš na méně žravé typy...)

No, to by tak asi stačilo, beztak už máš dost o čem přemejšlet, žejo ;)
(jo a jako obvykle, připouštím, že jsem se někde sekl)

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

Re: Pomoc se výkladem kodu

Příspěvek od daton » 09 črc 2019, 07:04

Ahoj Davide
moc děkuji za podnětné poznámky ke kodu i za to že jsi celý ten kod přelouskal (není tohoaž tak málo :-) . S tím čidlem nevím mě to funguje jen s knihovnou DHT. Ale zkusím si ji stáhnout.
Jinak v této podobě už to funguje druhý rok ale bylo to právě bez té synchronizae času.
Je fajn že si se mrknul i na to vybavování rolet oni tam ale nejsou LED diody na to by ana ESP ani nestačily výstupy ale jedná se o systém paměti. Rolety jsou vybavovány čtyřmi relé, kdy jedno zapíná sítové napětí a ostatní pak pracují s třemi roletami. Je to z toho důvodu aby se jednak nelepily a jednak aby bylo možné v době dojetí rolety za doraz tyto odpojit od napájení a ony nebyly stále vystavené (zapojené). Při změně stavu se tedy z "paměti" nejprve vystaví relé rolet jak bylo v předchozím cyklua pak se teprve připojí napětí (v tomto okamžiku se ještě nic neděje). No a teprve potom dojde ke změně stavu rolet a to postupně (zase kvůli lepení kontaktů rele).
No a když se vystaví a rolety jsou odpojeny koncákem v roletách se nejprve odpojí relé přivádějící napětí a pak spadnou i relé jenotlivých rolet.
je to komplikované ale funguje to dobře a relé se nelepí (při odpojováni vlivem indukčního chrakteru zátěže).
S tím generováním času jsem tam 50000 tisíc musel dát proto, že na start ESP je poněkud delší a než se to vše rozběhlo tak to dělalo všeliké patálie proto to bylo posunuto.
No v každé případě mám o čem přemýšlet díky.

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

Re: Pomoc se výkladem kodu

Příspěvek od DavidO » 10 črc 2019, 20:17

daton píše:
09 črc 2019, 07:04
S tím čidlem nevím mě to funguje jen s knihovnou DHT. Ale zkusím si ji stáhnout.
To bylo spíš "pro příští generace" - všechny novější senzorové knihovny od Adafruit to potřebujou jako prerekvizitu, takže jestli ti to funguje, ož to máš a není potřeba stahovat.
daton píše:
09 črc 2019, 07:04
Je fajn že si se mrknul i na to vybavování rolet oni tam ale nejsou LED diody na to by ana ESP ani nestačily výstupy ale jedná se o systém paměti. Rolety jsou vybavovány čtyřmi relé, kdy jedno zapíná sítové napětí a ostatní pak pracují s třemi roletami. Je to z toho důvodu aby se jednak nelepily a jednak aby bylo možné v době dojetí rolety za doraz tyto odpojit od napájení a ony nebyly stále vystavené (zapojené). Při změně stavu se tedy z "paměti" nejprve vystaví relé rolet jak bylo v předchozím cyklua pak se teprve připojí napětí (v tomto okamžiku se ještě nic neděje). No a teprve potom dojde ke změně stavu rolet a to postupně (zase kvůli lepení kontaktů rele).
No a když se vystaví a rolety jsou odpojeny koncákem v roletách se nejprve odpojí relé přivádějící napětí a pak spadnou i relé jenotlivých rolet.
je to komplikované ale funguje to dobře a relé se nelepí (při odpojováni vlivem indukčního chrakteru zátěže).
Aha, takže ne LED, ale RELE, jinak to sedí. Akorát to teda máš špatně popsané, protože na řádkách 408 a následujících je komentář, že to je Led :)
Pokud to máš pořád jako výstup (jakože máš), tak prostě drží tu předchozí hodnotu, cos tam nastavil posledně, ať už to byla 0 nebo 1. Takže není potřeba testovat, jestli se to od posledně změnilo nebo ne. Když tam znovu pošleš to samý, co tam bylo předtím, tak se nestane žádná změna, nic se neděje. Když tam pošleš opačnou hodnotu než byla minule, tak se to změní, jak jsi přesně chtěl. Takže není potřeba nic testovat a stačí to tam prostě natlouct, vůbec nezáleží na tom, co bylo někdy v minulosti. A taky je jedno, jestli je na to připojená LED, nebo relé, ten výstup mikrokontroleru prostě celou dobu drží, co sis tam vystavil naposled. (ale samozřejmě můžeš ten pin přepnout na vstup a když nebude zapnutý pullup, tak to bude volně plavat, ale to v téhle aplikaci nechceš, to je jen pro doplnění úplnosti diskuse o chování pinu kontroleru)
daton píše:
09 črc 2019, 07:04
S tím generováním času jsem tam 50000 tisíc musel dát proto, že na start ESP je poněkud delší a než se to vše rozběhlo tak to dělalo všeliké patálie proto to bylo posunuto.
A to mi právě přijde, že není v pořádku. Ale nevím, jak přesně to chceš, jestli hned po spuštění jednou něco udělat, nebo po spuštění těch 50s počkat nebo jak. Jen mi kód nějak nesedí s textem.
daton píše:
09 črc 2019, 07:04
No v každé případě mám o čem přemýšlet díky.
NZ.
Ještě výhledově zapřemýšlej o konečných automatech, případně o mechanismu, který zpracovává události na časové ose podle toho, kam si je dopředu naplánuješ. To by ti celý kód výrazně zpřehlednilo a zjednodušilo, a tím pádem i usnadnilo ladění a údržbu (či další vývoj), a navíc by tam nebyly ty delay, které zdržujou reakce na uživatelské nebo jiné podněty.

Odpovědět

Kdo je online

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