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:
Pin.IRQ_FALLING– 1’den 0’a.Pin.IRQ_RISING– 0’dan 1’e.Pin.IRQ_FALLING|Pin.IRQ_RISING– her iki kenar.