3.10. GPIO input

Đọc một công tắc (hoặc bất kỳ tín hiệu kỹ thuật số nào) từ một chân (pin) GPIO đi qua machine.Pin một lần nữa, lần này được cấu hình là ngõ vào. Giao diện đối xứng với output: cấu hình chế độ, sau đó kiểm tra giá trị của chân (pin) trong vòng lặp chính hoặc đăng ký trình xử lý ngắt kích hoạt khi giá trị thay đổi.

3.10.1. Cấu hình ngõ vào

Truyền Pin.IN vào hàm khởi tạo, và tùy chọn một điện trở kéo:

from machine import Pin

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

Điều đó cấu hình P0 là ngõ vào với điện trở kéo lên nội bộ của MCU được bật. Khi không có gì kết nối với chân (pin), điện trở kéo lên giữ nó cao; đóng công tắc từ chân (pin) xuống đất kéo nó thấp.

3.10.2. Đọc giá trị

value() không có đối số trả về trạng thái hiện tại -- 0 là thấp, 1 là cao:

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

Trong mẫu vòng lặp chính, kiểm tra trông như thế này:

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

Giấc ngủ 50 ms giữ cho vòng lặp không chạy ở tốc độ CPU đầy đủ.

3.10.3. Ngõ vào điều khiển bằng ngắt

Kiểm tra hoạt động được, nhưng mỗi lần lặp của vòng lặp chính tốn thời gian CPU. Đối với các ngõ vào thay đổi hiếm khi -- nhấn nút một lần mỗi phút, tín hiệu báo động -- irq() đăng ký một trình xử lý chỉ chạy khi chân (pin) thay đổi.

Trình xử lý chạy trong ngữ cảnh ngắt, điều này hạn chế những gì nó có thể làm:

  • Không cấp phát bộ nhớ. Tạo các đối tượng mới -- danh sách, chuỗi, ngoại lệ, chuỗi định dạng -- có thể thất bại bên trong một ISR vì heap bị khóa. Cấp phát trước bất kỳ bộ đệm nào mà trình xử lý cần ở phạm vi module.

  • Không làm công việc chạy lâu. Trình xử lý nên chuyển giao và trả về. Dành thời gian thực bên trong một ISR sẽ trì hoãn mọi thứ khác (các ngắt khác, vòng lặp chính, lưu lượng USB).

  • Không in trong ISR chặt chẽ. print() cấp phát, chặn trên UART, và là một trong những thứ tốn kém nhất mà trình xử lý có thể làm.

Mẫu chuẩn là ISR lên lịch công việc thực thông qua micropython.schedule(), xếp hàng một hàm để chạy lại trong ngữ cảnh chính tại điểm an toàn tiếp theo:

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 chỉ có một dòng: xếp hàng hàm gọi lại và trả về. handle_press sau đó chạy trong ngữ cảnh bình thường, nơi cấp phát, print(), và I/O chậm đều an toàn trở lại.

Đối số trigger chọn cạnh nào kích hoạt: