3.10. Vstup GPIO

Čtení spínače (nebo jakéhokoli digitálního signálu) z pinu GPIO probíhá opět přes machine.Pin, tentokrát nakonfigurovaný jako vstup. Rozhraní je symetrické s výstupem: nakonfigurujte režim a poté buď v hlavní smyčce čtěte hodnotu pinu (polling), nebo zaregistrujte obsluhu přerušení, která se spustí při změně hodnoty.

3.10.1. Konfigurace vstupu

Předejte konstruktoru Pin.IN a volitelně pull rezistor:

from machine import Pin

button = Pin("P0", Pin.IN, Pin.PULL_UP)

Tím se P0 nakonfiguruje jako vstup s povoleným interním pull-up rezistorem MCU. Když k pinu není nic připojeno, pull-up jej drží vysoko; sepnutí spínače z pinu k zemi jej stáhne nízko.

3.10.2. Čtení hodnoty

value() bez argumentů vrací aktuální stav – 0 pro nízkou, 1 pro vysokou:

if button.value() == 0:
    print("button pressed")
else:
    print("button released")

Ve vzoru s hlavní smyčkou vypadá polling takto:

while True:
    if button.value() == 0:
        do_action()
    time.sleep_ms(50)

Spánek 50 ms zabraňuje tomu, aby smyčka běžela na plný výkon CPU.

3.10.3. Vstup řízený přerušením

Polling funguje, ale každá iterace hlavní smyčky stojí čas CPU. Pro vstupy, které se mění zřídka – stisk tlačítka jednou za minutu, signál alarmu – irq() zaregistruje obsluhu, která běží pouze při změně pinu.

Obsluha běží v kontextu přerušení, což omezuje, co může dělat:

  • Žádná alokace paměti. Vytváření nových objektů – seznamů, řetězců, výjimek, formátovaných řetězců – může uvnitř ISR selhat, protože halda je uzamčena. Veškeré buffery, které obsluha potřebuje, předem alokujte na úrovni modulu.

  • Žádná dlouhotrvající práce. Obsluha by měla práci předat dál a vrátit se. Strávit reálný čas uvnitř ISR zpozdí vše ostatní (jiná přerušení, hlavní smyčku, provoz USB).

  • Žádný tisk v těsné ISR. print() alokuje, blokuje na UART a patří k nejnákladnějším věcem, které obsluha může udělat.

Standardním vzorem je, aby ISR naplánovala skutečnou práci pomocí micropython.schedule(), která zařadí funkci do fronty ke spuštění zpět v hlavním kontextu v příštím bezpečném bodě:

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 má jeden řádek: zařaďte callback do fronty a vraťte se. handle_press pak běží v normálním kontextu, kde jsou alokace, print() a pomalé I/O opět bezpečné.

Argument trigger vybírá, která hrana se spustí: