class Signal -- mengendalikan dan mendeteksi perangkat I/O eksternal

Kelas Signal adalah ekstensi sederhana dari kelas Pin. Berbeda dengan Pin yang hanya dapat berada dalam status "absolut" 0 dan 1, Signal dapat berada dalam status "aktif" (on) atau "tidak aktif" (off), sambil diinversi (aktif-rendah) atau tidak. Dengan kata lain, kelas ini menambahkan dukungan inversi logis ke fungsionalitas Pin. Meskipun ini tampak seperti penambahan sederhana, inilah yang diperlukan untuk mendukung berbagai perangkat digital sederhana secara portabel di berbagai board, yang merupakan salah satu tujuan utama MicroPython. Terlepas dari apakah pengguna yang berbeda memiliki LED aktif-tinggi atau aktif-rendah, relai normally open atau normally closed -- Anda dapat mengembangkan satu aplikasi yang terlihat bagus dan berfungsi dengan masing-masing dari mereka, serta menangkap perbedaan konfigurasi perangkat keras dalam beberapa baris di file konfigurasi aplikasi Anda.

Contoh:

from machine import Pin, Signal

# Suppose you have an active-high LED on pin 0
led1_pin = Pin(0, Pin.OUT)
# ... and active-low LED on pin 1
led2_pin = Pin(1, Pin.OUT)

# Now to light up both of them using Pin class, you'll need to set
# them to different values
led1_pin.value(1)
led2_pin.value(0)

# Signal class allows to abstract away active-high/active-low
# difference
led1 = Signal(led1_pin, invert=False)
led2 = Signal(led2_pin, invert=True)

# Now lighting up them looks the same
led1.value(1)
led2.value(1)

# Even better:
led1.on()
led2.on()

Berikut adalah panduan kapan Signal vs Pin harus digunakan:

  • Gunakan Signal: Jika Anda ingin mengendalikan perangkat on/off sederhana (termasuk PWM perangkat lunak!) seperti LED, indikator multi-segmen, relai, buzzer, atau membaca sensor biner sederhana, seperti tombol normally open atau normally closed, ditarik tinggi atau rendah, sakelar Reed, detektor kelembapan/api, dll. Singkatnya, jika Anda memiliki perangkat/sensor fisik nyata yang memerlukan akses GPIO, Anda sebaiknya menggunakan Signal.

  • Gunakan Pin: Jika Anda mengimplementasikan protokol atau bus tingkat lebih tinggi untuk berkomunikasi dengan perangkat yang lebih kompleks.

Pemisahan antara Pin dan Signal berasal dari kasus penggunaan di atas dan arsitektur MicroPython: Pin menawarkan overhead terendah, yang mungkin penting saat bit-banging protokol. Tetapi Signal menambahkan fleksibilitas tambahan di atas Pin, dengan biaya overhead kecil (jauh lebih kecil dari jika Anda mengimplementasikan perbedaan perangkat aktif-tinggi vs aktif-rendah secara manual di Python!). Selain itu, Pin adalah objek tingkat rendah yang perlu diimplementasikan untuk setiap board yang didukung, sementara Signal adalah objek tingkat tinggi yang tersedia secara gratis setelah Pin diimplementasikan.

Jika ragu, coba Signal! Sekali lagi, ia ditawarkan untuk menyelamatkan pengembang dari kebutuhan menangani perbedaan yang tidak menarik seperti sinyal aktif-rendah vs aktif-tinggi, dan memungkinkan pengguna lain berbagi dan menikmati aplikasi Anda, alih-alih frustrasi karena aplikasi tersebut tidak berfungsi untuk mereka hanya karena LED atau relai mereka dikabel dengan cara yang sedikit berbeda.

Konstruktor

class machine.Signal(pin_obj: Pin, *, invert: bool = False)
class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)

Membuat objek Signal. Ada dua cara untuk membuatnya:

  • Membungkus objek Pin yang ada -- universal, berfungsi pada board apa pun.

  • Meneruskan argumen konstruktor Pin secara langsung -- argumen posisi dan kata kunci yang sama yang diterima oleh Pin diteruskan ke Pin yang dibuat secara internal. Tersedia di banyak, tetapi tidak semua board.

Argumen:

  • pin_obj -- instance Pin yang ada untuk dibungkus.

  • pin_args / pin_kwargs -- argumen yang akan diteruskan ke konstruktor Pin saat membuat pin yang mendasari secara langsung.

  • invert -- jika True, sinyal diinversi (aktif rendah).

Metode

value(x: Any = None, /) int | None

Metode ini memungkinkan untuk mengatur dan mendapatkan nilai sinyal, tergantung pada apakah argumen x disediakan atau tidak.

Jika argumen dihilangkan, metode ini mendapatkan level sinyal, 1 berarti sinyal aktif dan 0 -- sinyal tidak aktif.

Jika argumen disediakan, metode ini mengatur level sinyal. Argumen x dapat berupa apa saja yang dapat dikonversi ke boolean. Jika dikonversi ke True, sinyal aktif, jika tidak maka tidak aktif.

Korespondensi antara sinyal yang aktif dan level logika aktual pada pin yang mendasari bergantung pada apakah sinyal diinversi (aktif-rendah) atau tidak. Untuk sinyal non-inversi, status aktif sesuai dengan logika 1, tidak aktif -- ke logika 0. Untuk sinyal inversi/aktif-rendah, status aktif sesuai dengan logika 0, sedangkan tidak aktif -- ke logika 1.

on() None

Mengaktifkan sinyal.

off() None

Menonaktifkan sinyal.