Ako na lepšie analógové a binárne hodiny v tint2
V článku v nedávnej minulosti sme si ukázali, ako pridať analógové hodiny do panela tint2. Trochu ich vylepšíme a skončíme pri binárnych hodinách.
Úvod
V máji tohto roku som opisoval, ako si možno spraviť a pridať analógové hodiny do ľahkého panela tint2. Teraz som ich trochu vylepšil a nakoniec úplne zavrhol a skončil pri binárnych hodinách.
Krátko o vibecodingu
Ešte stále programujem „starým spôsobom“. Niežeby som bol za každú cenu „staromilec“. Navyše moje programovanie, ktoré prináša aj finančný efekt, sa obmedzuje na programovanie PLC a tam píšem kód pekne ručne. Väčšina kódu sa za tie roky opakuje, nestojí to priveľa námahy (z hľadiska učenia sa nových princípov) a riadi to stroje a linky, ktoré v prípade zlého chodu môžu spôsobiť finančné či nebodaj horšie straty. Tam sa zrejme vyhovárať na chybu AI nemožno.
Domáce veci (si) robím tiež ručne. S LLM si pomáham, ak neovládam detaily jazyka alebo mi nie je jasná dokumentácia a potrebujem niečo podrobnejšie vysvetliť. Robím tak najmä preto, že sa nechcem vzdať radosti z programovania. O efektivitu (programovania, nie programu 😀) mi zväčša nejde.
Trochu ma mrzí jedna vec: vibecoding devalvuje prácu a námahu programátorov. Znie to ako oxymoron. Ale myslím to v zmysle, že sa už nepozeráme na ich prácu rovnakými očami. Dioptrie ani miera podliatia krvou v tom nehrajú rolu.
Vysvetlím: Niekto naprogramuje „vlastnou hlavou“ niečo zaujímavé. Nemusí to byť veľké, ani prevratné. Stačí, že do toho vloží svoj um a čas. A reakcia okolia môže byť skeptická: „To si (ti) isto naprogramovala AI“. A takto sa dostaneme do stavu, keď rokmi budovaná zručnosť sa stane skôr príťažou.
Mirec ma upozornil na zaujímavý článok pojednávajúci o tom, že myslenie sa stane už len koníčkom. Práve takto dopadne aj to „staromódne“ programovanie.
Vylepšené analógové hodiny
No vylepšené… skôr mi prišlo na škodu, že v ciferníku je zbytočne veľa miesta. Tak som sa rozhodl vyplniť jeho hornú časť fázami mesiaca a spodnú piktogramom aktuálneho počasia.
A pri niektorých algoritmoch som si pomohol LLM, práve v miere, ktorú považujem za zmysluplnú.
Napríklad ako zistiť výpočtom fázu mesiaca.
No nevedel by som ako na to, musel by som to hľadať.
Riešenie:
known_new_moon = 947182440 synodic_month = 29.530588853 now = int(time.time()) days_since_new_moon = (now - known_new_moon) / 86400.0 moon_age = math.fmod(days_since_new_moon, synodic_month) phase_index = int((moon_age / synodic_month) * 8 + 0.5) % 8 moon_symbols = ["🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘",] moon_phase = moon_symbols[phase_index]
Čo je to synodický mesiac a ako sa prišlo na tie čísla, to neviem.
Súčasne chcem vydolovať ikonu z programu ansiweather, ktorý som spomínal minule.
ansiweather = os.path.expanduser("~/.prog/ansiweather/ansiweather") result = subprocess.run( [ ansiweather, "-l", "Poprad", "-a", "false", "-i", "false", "-w", "false", "-s", "true", ], capture_output=True, text=True, check=True ) # LLM: match = re.search( r"°C\s+([^ ]+)\s+-\s+Humidity", result.stdout ) if not match: raise RuntimeError("Could not extract weather icon") weather_icon = match.group(1).replace("\ufe0f", "") print("OpenWeather was contacted")
Regulárny výraz mi spravila AI, v kóde je označený poznámkou. Regulárne výrazy ma vždy extrémne trápili, pretože ich robím zriedkavo až minimálne. Predtým som používal regexp builder v Emacse, ktorý to uľahčoval. Teraz je to uľahčené o to viac.
Samozrejme, nemožno dotazovať OpenWeather každú minútu, to by sme dostali blok. Preto to robím iba raz za hodinu a ikonu medzitým dookola načítavam z cache. Robím to amatérsky, v jednom dočasnom súbore je časová značka, voči ktorej porovnávam, kedy sa spustí ansiweather, v druhom je znak oného piktogramu.
Pridanie vykreslenia piktogramov do pôvodného kódu bolo primitívne. Akurát je dôležité poradie, aby ručičky hodín boli vykreslené nad obrázkami.
Ak nechceme použiť ansiweather, tak môžeme kontaktovať OpenWeather pomocou curl. Treba k tomu API kľúč, ktorý si požičiame z ansiweather alebo pohľadáme na githube, alebo sa zaregistrujeme. Či je to zadarmo, to som nezisťoval.
Napríklad takto:
curl -s 'https://api.openweathermap.org/data/2.5/weather?q=Poprad,SK&appid=85a4e3c55b73909f42c6a23ec35b7147&units=metric&lang=sk' | \ jq -r '"\(.weather[0].description)"'
Iste, ten API kľúč je už prevarený, ale funguje. Vráti to napríklad:
jasná obloha
Následne by sme si museli tieto reťazce nahradzovať symbolmi. Takže použitie ansiweather-u je dozaista jednoduchšie.
Binárne hodiny
Binárne hodiny zobrazujú čas pomocou núl a jednotiek namiesto bežných číslic. Veď prečo nie. Každá pozícia predstavuje mocninu dvojky.
Najčastejšie sa stretneme s dvoma spôsobmi zápisu:
- Čistý binárny zápis — tu sa celé hodiny, minúty a prípadne sekundy sa zapisujú ako binárne čísla. Napríklad
13:25:49je1101 : 11001 : 110001. To je otravné, lebo tie číslice sú pridlhé. - BCD (binárne kódované desiatkové číslice), v ktorom sa každá desiatková číslica zakóduje osobitne do štyroch bitov. Napríklad
13:25je0001 0011 : 0010 0101. Toto je krajšie, zobrazíme to nad sebou.
Nebolo to ťažké, princípom je maskovanie bitov zisteného čísla, aby sme dostali informáciu, ktorý bit je 0 a ktorý 1.
Príklad napovie:
Máme premennú bity = [8, 4, 2, 1].
A zistenú číslicu času (cas = datetime.now().strftime("%H%M")):
for x, cislica in zip(stredy_stlpcov, cas): cislo = int(cislica)
V prvej verzii programu som zisťoval, že či vykresliť krúžok farbou „zapnutou“ alebo „vypnutou“.
if cislo & bit: farba = farba_zapnute else: farba = farba_vypnute
Napríklad, ak cislo = 7 (číslica) a bit = 4:
cislo = 7d → 0111b bit = 4d → 0100b
Bitový AND:
0111 & 0100 ------ 0100 → výsledok je 4
Keďže výsledok 7 & 4 nie je nula, podmienka platí a vyberie sa farba_zapnute pre pozíciu 4, t.j. pre tretí krúžok odspodu.
Analogicky máme aj pozíciu 2 a 1 (zapnuté) a 8 (vypnuté).
Majstri 🐍 by asi podmienky zhustili do jedného riadku:
farba = farba_zapnute if cislo & bit else farba_vypnute.
(Céčkari poznajú ternárne operátory: farba = (cislo & bit) ? farba_zapnute : farba_vypnute;.)
No a tu prichádza AI. Lebo obyčajné krúžky sa mi nepáčili, chcel som, aby to vyzeralo ako LED dióda. Neznalý možností knižnice pillow som si nechal poradiť a zistil, že existuje aj nejaké rozostrenie, ktoré spraví LED viac realistickou, plus AI navrhol aj odlesk púzdra. No krása.
Záver
A to je všetko. Pomohli sme si s AI a stále to ostala zábava. Hoci je to taká maličkosť alebo somarinka.
Sazmorejme, človek po krátkom čase číta hodiny rýchlo a prirodzene, už len z polohy svietiacich bodov, nič v hlave nesčítava. Podobne ako pri analógových hodinách, kde sa riadi pozíciou ručičiek a čísla nevníma.
A vtipná príhoda na záver
Vyrastal som pod prísnym dozorom kosáka a kladiva. Keď som bol prvák na ZŠ, musel som byť pochopiteľne iskra a chodiť na príslušné schôdzky. Hodiny sme mali doma len v kuchyni, ručičkové.
Aby som mal istotu, že prídem na čas na schôdzu (nebodaj by mi ušlo niečo mimoriadne dôležité 😀), tak mi o trochu staršia sestra nakreslila na papier hodiny a polohu ručičiek, kedy mám vyraziť z domu (to boli časy, keď sme všade chodili pešo alebo MHD, bez ohľadu na vek a počasie), aby som prišiel na čas.
Akurát, že jej detské vnímanie symetrie narazilo na realitu 😀. Nakreslila mi síce hodiny, ale začala písať číslice od 1 do 12 v nesprávne rozvrhnutých uhloch, takže jednotka bola síce na správnom mieste, ale dvanástka končila na pozícii normálnej deviatky.
Nevadí, ja som sa riadil iba polohou nakreslených ručičiek a čísla ma nezaujímali. Či toto stálo za pádom komunizmu, nevedno 😀.
Prílohy
- aclock_weather-icon.py (3.8 kB)
- binclock_led.py (2.0 kB)

Pre pridávanie komentárov sa musíte prihlásiť.