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: