V prejšnjih člankih smo si ogledali prižiganje diode, krmiljenje motorja, izpis na znakovnem LCD zaslonu, pulzno širinsko modulacijo, še nekaj drugih reči in seveda zaznavanje tipke. V tem članku bomo omenili še dodatek k tipki, kako razlikovati med dolgim in kratkim pritiskom. Dotaknili se bomo tudi ideje več nitenja (ang. multithreading) nato pa nas že čaka spoznavanje protokola I2C in komunikacija s senzorjem temperature in vlage.
Dolg – kratek pritisk
Kar se tiče tipke, smo do sedaj obdelali že naslednje:
- enostavno preverjanje, ali je tipka pritisnjena ali ne (input(pin)),
- čakanje na nek rob signala (wait_for_edge),
- dodajanje zaznave dogodka (add_event_detect),
- klicanje prekinitve ob pritisku tipke (add_event_detect – callback).
Sedaj pa bomo v prekinitvi preverili še, ali je uporabnik tipko pritisnil le za kratek čas, ali je naredil dolg pritisk tipke. Zaznavanje smo si zamislili, kot kaže slika 1.
Ker zaznavanje tipke in klic prekinitvene metode že poznamo, se bomo tu osredotočili le na vsebino metode „press“. V njej krožimo po „while True“ zanki, dokler je tipka še pritisnjena. Ko je tipka izpuščena, oziroma, ko je pritisnjena dovolj dolgo, zanko zapustimo z ukazom „break“. Nato preverimo zaradi katerega pogoja je bila zanka prekinjena (dosežen maksimalen čas/izpuščena tipka) in glede na to izpišemo kaj smo zaznali. Če želimo čas dolgega pritiska podaljšati ali skrajšati, spremenimo le (obe) trenutni vrednosti 15 na več ali manj.
V praktični uporabi te metode dolgega in kratkega pritiska verjetno ne bomo le izpisovali, ampak bomo želeli izvesti zaporedje nekih ukazov. Kot že, bi vas še enkrat opozoril na kompleksnost prekinitev. Te naj bodo čim bolj enostavne in v njih postavljajte le „zastavice“ in spreminjajte vrednosti spremenljivk, saj boste v nasprotnem primeru prekinitev lahko ponovno klicali, preden se bo le ta dokončno izvedla od prejšnjega klica. Zamisel je dokaj enostavna, tako tudi metoda:
def press(pin):
buttonPressed = 0
while True:
#tipka pritisnjena
if(not GPIO.input(21)):
buttonPressed += 1
else:
break
if(buttonPressed > 15):
break
time.sleep(0.05)
if(buttonPressed > 15):
#long press
print(„Dolg pritik!“)
else:
#short press
print(„Kratek pritisk!“)
Progam z omenjeno metodo smo shranili v datoteko „ longPrenssBasic.py“, ki vam je na voljo v paketu „RPi in Python_5“ na naši spletni strani.
Nitenje
Kaj sploh je nitenje? Nitenje je razdelitev procesa (programa v izvajanju) na manjše dele – nitke, ki lahko tečejo sočasno. To nam omogočajo moderni operacijski sistemi. Proces je torej sestavljen iz ene ali več niti. Zdi se mi da nekateri pomišljate, da je nitenje nepotrebna navlaka, ker lahko enako enostavno dosežemo z več procesi. Delno je to res, ker pa si nitke delijo vire znotraj istega procesa (tudi vrednosti spremenljivk), lahko komunicirajo med seboj (brez vpletanja operacijskega sistema) hitreje kot procesi. Poglejmo si primer. Denimo, da v neki točki proces čaka na nek vir (pomnilnik, vhodno/izhodno enoto,…). V primeru nitenja se nitka, ki ta vir čaka, lahko začasno prekine in se izvaja druga nitka, ki je bila v stanju »pripravljena«. Tako se proces izvede hitreje kot v primerjavi procesa brez nitk (slika 2). Nekateri procesi so neprekinljivi – na primer tiskanje. Saj si vsi želimo, da sta dva dokumenta natisnjena eden za drugim, ne malo eden malo drugi, mar ni tako?
Raspberry Pi in Python za začetnike (5)
2014_SE222_29