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í: