Blikání dvojtečky u hodin v Pythonu

Karlitos

Blikání dvojtečky u hodin v Pythonu
« kdy: 17. 12. 2014, 21:11:08 »
Zdravim,

stavim si takovy hudebni budik s R-Pi a 4-mistnym segmentovym displayem. Koupil jsem si na to model od Adafruit ktery se ovlada prez I2C a jede to krasne. Takze sem zacal delat v Pythonu nejakou tridu do ktere bych to ovladani pekne zabalil a narazil jsem na to, ze vlasnte nevim jak blika dvojtecka u digitalnich hodin. Obvykle se tim udavaji sekundy, ale ja nevim jestli ta dvojtecka blika:

* sudou sekundu sviti / lichou nesviti

a nebo treba tak ze prvni 0.5 sekundy sviti a 0.5 sekundy nesviti. To yb ale pak blikala s frekvenci 2Hz ???

Mohl bych to resit tak ze proste udelam nejakou uplne pitomou metodu ktera bude tu dvojtecku stridave rozsvecet a zhaset s tim ze na konci bude nejaky time. sleep(1)

Jenze pak to samozrejme nebude synchroni s hodinami. A vubec, jak casto mam ty hodiny aktualizovat ? Udelal sem nekonecnoun smycku a nakonci dal zase delay time.sleep(0.1) a koukam ze mi jen tento blby process zere 30% CPU na R-Pi

Jak to tady ted sepisuju tak mi dochazi ze resim asi kravovinu. Implementuju BUDIK a ne STOPKY  ;) takze na nejakou synchronizaci s hodinami bych se mel asi vykaslat. A udelat update s frekvenci 1Hz kde si prez datetime.datetime.now() vytahnu aktualni cas.

Nebo mi poradi nekdo nejake chytrejsi reseni ? Za pripadne konstruktivni rady budu moc rad, legraci a rypani si prosim odpusste, diky !
« Poslední změna: 18. 12. 2014, 12:27:22 od Petr Krčmář »


Proč to neokoukáš od nějakých funkčních digitálek? :)

jonnie

neprogramuji, jen mám před sebou několik displejů s hodinami a každý bliká jinak.
1) dvojtečka svítí trvale
2) dvojtečka se na cca 1/4 sekundy rozsvítí společně se změnou času a pak 3/4 sekundy nesvítí
3) dvojtečka 1/2 sekundy svítí, 1/2 sekundy nesvítí.

Já bych to blikání vyřešil takhle:

nová sekunda - zobrazí se dvojtečka
NS + 450 ms - dvojtečka zmizí
NS + 550 ms - opakuj od začátku

pet

Udelal sem nekonecnoun smycku a nakonci dal zase delay time.sleep(0.1) a koukam ze mi jen tento blby process zere 30% CPU na R-Pi
Nekonečná smyčka, to je správně ;-).
Na začátku nastavit aktuální čas, to je taky správně.
Zároveň rozsvítit dvojtečku a pak time.sleep( 0.450 ) - přibližně.
Pak zhasnout dvojtečku, zjistit kolik zbývá do konce sekundy a udělat tak dlouhý time.sleep.


JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Hm, nejde na RPi zaridit preruseni od nejakeho HW casovace nebo casovace v jadru? Nejake nekonecne smycky v Pythonu, z toho se asi spousta programatoru z prukopnickych dob obraci v hrobe.

Karlitos

Diky vsem za odpovedi. Nemam po ruce nejaky radiobudik nebo digitalky a na radiobudiku co ma moje maminka ani zadna dvojtecka neni.

Zkusil jsem ted ruzne mody blikani a nejlepe vypada frekvence 1Hz, kdy dvojtecka sviti kazdou sudou skeundu. Coz se krasne resi s modulo 2 == 0. Kdyz jsem zkusil frekvenci 2Hz tak me to rychel blikani slo na nervy.

Jinak by me moc-moc zajimalo to co psal JardaP. Uz jsem upustil od toho ze budu mit blikani dvojtecky synchroni s vnitrnim casem, delam budik a ne stopky. Ale take by se mi vic libilo kdybych nemusel aktivne kazdou sekundu zjistovat cas ale vyuzil nejaky hardwarovy timer. Zkusim se na to podivat.

Pavouk106

  • *****
  • 2 395
    • Zobrazit profil
    • Můj blog
    • E-mail
Digitálky, co mám teď na ruce, blikají zjevně 0,5s zapnuto, 0,5s vypnuto. Nicméně asi záleží na vlastní spokojenosti, takže to stejně udělej jak uznáš za vhodný ;-)

pet

Zkusil jsem ted ruzne mody blikani a nejlepe vypada frekvence 1Hz, kdy dvojtecka sviti kazdou sudou skeundu. Coz se krasne resi s modulo 2 == 0. Kdyz jsem zkusil frekvenci 2Hz tak me to rychel blikani slo na nervy.
Máš v tom hokej ;-)
1 s svícení a 1 s tmy = 2 s celý cyklus = ½ Hz
½ s svícení a ½ s tmy = 1 s celý cyklus = 1 Hz
;-B

aaa

Hm, nejde na RPi zaridit preruseni od nejakeho HW casovace nebo casovace v jadru? Nejake nekonecne smycky v Pythonu, z toho se asi spousta programatoru z prukopnickych dob obraci v hrobe.

https://docs.python.org/2/library/signal.html

Re:Blikání dvojtečky u hodin v Pythonu
« Odpověď #10 kdy: 18. 12. 2014, 14:38:37 »
A vubec, jak casto mam ty hodiny aktualizovat ? Udelal sem nekonecnoun smycku a nakonci dal zase delay time.sleep(0.1) a koukam ze mi jen tento blby process zere 30% CPU na R-Pi
Aktivní čekání na čas je zbytečné. Moje Turrisem řízené hodiny to řeší načtením času po každém kroku a následně sleepem do konce sekundy:
https://github.com/oskar456/turrisclock/blob/master/turrisclock.py#L55

Zatížení CPU je téměř nepozorovatelné a nikde se neakumuluje chyba. Myslím, že nemá cenu hnát se za víc low-level řešením, pokud chceš hodiny ovládat z linuxového systému. Pokud bys to programoval pro embedded kontrolér, tam by samozřejmě dávalo smysl použít nějaký vestavěný časovač a překreslení displeje spouštět přerušením.

Kolemjdoucí

Re:Blikání dvojtečky u hodin v Pythonu
« Odpověď #11 kdy: 18. 12. 2014, 14:53:24 »
Hm, nejde na RPi zaridit preruseni od nejakeho HW casovace nebo casovace v jadru? Nejake nekonecne smycky v Pythonu, z toho se asi spousta programatoru z prukopnickych dob obraci v hrobe.

Nekonečná smyčka je regulérní programovací technika, až do vynálezu multitaskingu se používala denně.
Problém může nastat s teplotou nebo spotřebou elektřiny, pak je použití přerušení prakticky povinné.

A vubec, jak casto mam ty hodiny aktualizovat ?

Stejně rychle nebo rychleji než jsou změny na displeji. Začít můžeš na hodnotě 3x-5x za sekundu.

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Blikání dvojtečky u hodin v Pythonu
« Odpověď #12 kdy: 18. 12. 2014, 15:25:01 »
Hm, nejde na RPi zaridit preruseni od nejakeho HW casovace nebo casovace v jadru? Nejake nekonecne smycky v Pythonu, z toho se asi spousta programatoru z prukopnickych dob obraci v hrobe.

Nekonečná smyčka je regulérní programovací technika, až do vynálezu multitaskingu se používala denně.
Problém může nastat s teplotou nebo spotřebou elektřiny, pak je použití přerušení prakticky povinné.

Tak to sice je, ale kdyz uz, tak snad radsi ne v Pythonu. Kdyz to nazene CPU na takove otacky, ze se tim budikem pak da pritapet, tak je nekde neco asi spatne. To by snad bylo mene narocne i jako shell skript, pokud se z nej lze nejak dostat na HW, aby bylo mozno preklapet segmenty displaye. Zatim jsem si nevsiml, ze by mi sleep v bashi vyhnal CPU na 30 %.

Re:Blikání dvojtečky u hodin v Pythonu
« Odpověď #13 kdy: 18. 12. 2014, 15:31:56 »
Těch 30% CPU zcela jistě negeneruje zmíněný pythoní time.sleep(0.1). Jeho zásluhou je naopak pravděpodobně to, že to žere jen 30 % a nikoli 100 % CPU.

Karlitos

Re:Blikání dvojtečky u hodin v Pythonu
« Odpověď #14 kdy: 18. 12. 2014, 15:32:31 »
Máš v tom hokej ;-)
1 s svícení a 1 s tmy = 2 s celý cyklus = ½ Hz
½ s svícení a ½ s tmy = 1 s celý cyklus = 1 Hz
;-B

Mam a proto se tu tak blbe ptam :-) Kazdopadne s tim modulo 2 == 0 to pro me vypada nejlepe.

Aktivní čekání na čas je zbytečné. Moje Turrisem řízené hodiny to řeší načtením času po každém kroku a následně sleepem do konce sekundy:
https://github.com/oskar456/turrisclock/blob/master/turrisclock.py#L55

Zatížení CPU je téměř nepozorovatelné a nikde se neakumuluje chyba. Myslím, že nemá cenu hnát se za víc low-level řešením, pokud chceš hodiny ovládat z linuxového systému. Pokud bys to programoval pro embedded kontrolér, tam by samozřejmě dávalo smysl použít nějaký vestavěný časovač a překreslení displeje spouštět přerušením.

Diky za tip, podivam se na ten tvuj kod. Jenom jsem nepochopil jak jsi myslel to "načtením času po každém kroku a následně sleepem do konce sekundy"

Tedy neco jako
Kód: [Vybrat]
while True:
    update_time()
    sleep(1)

S tim vyhnanim vykonu: to jsem pozoroval kdyz jsem nastavil sleep na desetinu sekundy, takze desetkrat do sekundy se musely prepsat 4 cislice na LCD (ano i to by slo optimalizovat, ale bude s tim dost kodovani) pak zjistit jestli nahodou neni uz budicek ...

Dal jsem jsete vcera dotaz na StackOverflow a uz mi bylo neco doporucene, jdu to studovat