3.10. GPIO girişi#

Bir GPIO pininden bir anahtarı (veya herhangi bir dijital sinyali) okumak, bu kez giriş olarak yapılandırılmış machine.Pin üzerinden yine gerçekleşir. Arayüz, çıkışla simetriktir: modu yapılandırın, ardından ana döngüde ya pinin değerini yoklayın ya da değer değiştiğinde tetiklenen bir kesme işleyicisi kaydedin.

3.10.1. Bir girişi yapılandırma#

Yapıcıya Pin.IN ve isteğe bağlı olarak bir çekme direnci geçirin:

from machine import Pin

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

Bu, P0‘ı MCU’nun dahili çekme (pull-up) direnci etkinleştirilmiş bir giriş olarak yapılandırır. Pine hiçbir şey bağlı değilken, çekme onu yüksek tutar; pinden toprağa bir anahtar kapatmak onu düşük seviyeye çeker.

3.10.2. Değeri okuma#

Argümansız value(), mevcut durumu döndürür – düşük için 0, yüksek için 1:

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

Ana döngü deseninde, yoklama şuna benzer:

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

50 ms’lik uyku, döngünün CPU’yu tam kapasitede çalıştırmasını önler.

3.10.3. Kesme tabanlı giriş#

Yoklama işe yarar, ancak ana döngünün her yinelemesi CPU zamanına mal olur. Nadiren değişen girişler için – dakikada bir düğme basışı, bir alarm sinyali – irq(), yalnızca pin değiştiğinde çalışan bir işleyici kaydeder.

İşleyici, ne yapabileceğini kısıtlayan kesme bağlamında çalışır:

  • Bellek tahsisi yok. Yeni nesneler oluşturmak – listeler, dizeler, istisnalar, biçimlendirilmiş dizeler – yığın kilitli olduğu için bir ISR içinde başarısız olabilir. İşleyicinin ihtiyaç duyduğu arabellekleri modül kapsamında önceden tahsis edin.

  • Uzun süren iş yok. İşleyici devretmeli ve geri dönmelidir. Bir ISR içinde gerçek zaman harcamak, diğer her şeyi geciktirir (diğer kesmeler, ana döngü, USB trafiği).

  • Sıkı bir ISR içinde yazdırma yok. print() tahsisat yapar, UART üzerinde bloklar ve bir işleyicinin yapabileceği en pahalı şeylerden biridir.

Standart desen, ISR’nin gerçek işi micropython.schedule() aracılığıyla zamanlamasıdır; bu, bir sonraki güvenli noktada bir işlevi ana bağlamda tekrar çalıştırmak üzere sıraya koyar:

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 tek satırdır: geri çağırmayı (callback) sıraya koy ve geri dön. handle_press ardından, tahsisatın, print() işlevinin ve yavaş G/Ç’nin tekrar güvenli olduğu normal bağlamda çalışır.

trigger argümanı, hangi kenarın tetikleneceğini seçer: