3.10. GPIO ulaz¶
Čitanje sklopke (ili bilo kojeg digitalnog signala) s GPIO pina ponovno ide kroz machine.Pin, ovaj put konfiguriran kao ulaz. Sučelje je simetrično s izlazom: konfigurirajte način rada, a zatim ili prozivajte vrijednost pina u glavnoj petlji ili registrirajte rukovatelja prekida koji se aktivira kada se vrijednost promijeni.
3.10.1. Konfiguriranje ulaza¶
Proslijedite Pin.IN konstruktoru, te po želji pull otpornik:
from machine import Pin
button = Pin("P0", Pin.IN, Pin.PULL_UP)
To konfigurira P0 kao ulaz s omogućenim unutarnjim pull-up otpornikom MCU-a. Bez ičega spojenog na pin, pull-up ga drži visoko; zatvaranje sklopke od pina prema masi povlači ga nisko.
3.10.2. Čitanje vrijednosti¶
value() bez argumenata vraća trenutno stanje – 0 za nisko, 1 za visoko:
if button.value() == 0:
print("button pressed")
else:
print("button released")
U obrascu glavne petlje, prozivanje izgleda ovako:
while True:
if button.value() == 0:
do_action()
time.sleep_ms(50)
Stanka od 50 ms sprječava petlju da se izvodi pri punom CPU-u.
3.10.3. Ulaz vođen prekidima¶
Prozivanje radi, ali svaka iteracija glavne petlje troši vrijeme CPU-a. Za ulaze koji se rijetko mijenjaju – pritisak gumba jednom u minuti, signal alarma – irq() registrira rukovatelja koji se izvodi samo kada se pin promijeni.
Rukovatelj se izvodi u kontekstu prekida, što ograničava ono što može raditi:
Bez dodjele memorije. Stvaranje novih objekata – lista, nizova, iznimaka, oblikovanih nizova – može propasti unutar ISR-a jer je gomila zaključana. Unaprijed dodijelite sve međuspremnike koje rukovatelj treba na razini modula.
Bez dugotrajnog posla. Rukovatelj treba predati posao i vratiti se. Trošenje stvarnog vremena unutar ISR-a odgađa sve ostalo (druge prekide, glavnu petlju, USB promet).
Bez ispisivanja u uskom ISR-u.
print()dodjeljuje memoriju, blokira na UART-u i jedna je od najskupljih stvari koje rukovatelj može učiniti.
Standardni obrazac je da ISR zakaže stvarni posao putem micropython.schedule(), koji stavlja funkciju u red za izvođenje natrag u glavnom kontekstu na sljedećoj sigurnoj točki:
import micropython
def handle_press(pin):
print("button pressed")
def on_press(pin):
micropython.schedule(handle_press, pin)
button.irq(handler=on_press, trigger=Pin.IRQ_FALLING)
ISR je jedan redak: stavi povratni poziv u red i vrati se. handle_press zatim se izvodi u normalnom kontekstu, gdje su dodjela memorije, print() i spori U/I ponovno sigurni.
Argument trigger odabire koji rub aktivira:
Pin.IRQ_FALLING– 1 na 0.Pin.IRQ_RISING– 0 na 1.Pin.IRQ_FALLING|Pin.IRQ_RISING– oba ruba.