3.10. Input GPIO

Membaca sakelar (atau sinyal digital apa pun) dari pin GPIO dilakukan melalui machine.Pin lagi, kali ini dikonfigurasi sebagai input. Antarmukanya simetris dengan output: konfigurasikan mode, lalu polling nilai pin di loop utama atau daftarkan handler interupsi yang terpicu saat nilai berubah.

3.10.1. Mengonfigurasi input

Berikan Pin.IN ke konstruktor, dan opsional resistor pull:

from machine import Pin

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

Itu mengonfigurasi P0 sebagai input dengan resistor pull-up internal MCU yang diaktifkan. Dengan tidak ada yang terhubung ke pin, pull-up menahan pin tetap tinggi; menutup sakelar dari pin ke ground menariknya rendah.

3.10.2. Membaca nilai

value() tanpa argumen mengembalikan kondisi saat ini -- 0 untuk rendah, 1 untuk tinggi:

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

Pada pola loop utama, polling terlihat seperti ini:

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

Sleep 50 ms mencegah loop berjalan dengan CPU penuh.

3.10.3. Input berbasis interupsi

Polling bekerja, tetapi setiap iterasi loop utama menghabiskan waktu CPU. Untuk input yang jarang berubah -- penekanan tombol sekali semenit, sinyal alarm -- irq() mendaftarkan handler yang berjalan hanya saat pin berubah.

Handler berjalan dalam konteks interupsi, yang membatasi apa yang dapat dilakukannya:

  • Tidak ada alokasi memori. Membuat objek baru -- list, string, exception, string berformat -- dapat gagal di dalam ISR karena heap terkunci. Alokasikan buffer yang dibutuhkan handler terlebih dahulu di lingkup modul.

  • Tidak ada pekerjaan yang berjalan lama. Handler harus meneruskan dan kembali. Menghabiskan waktu nyata di dalam ISR menunda segalanya (interupsi lain, loop utama, lalu lintas USB).

  • Tidak ada pencetakan dalam ISR yang ketat. print() mengalokasikan, memblokir pada UART, dan merupakan salah satu hal paling mahal yang dapat dilakukan handler.

Pola standar adalah ISR untuk menjadwalkan pekerjaan nyata melalui micropython.schedule(), yang mengantrekan fungsi untuk dijalankan kembali di konteks utama pada titik aman berikutnya:

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 hanya satu baris: antrekan callback dan kembali. handle_press kemudian berjalan dalam konteks normal, di mana alokasi, print(), dan I/O lambat semuanya aman kembali.

Argumen trigger memilih tepi mana yang terpicu: