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
daton píše: ↑06 črc 2019, 21:59rozhodně 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é
rol1
až
rol3
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)