class Signal – 控制和感知外部I/O设备¶
Signal类是 Pin
类的一个简单扩展。与Pin只能处于“绝对”的0和1状态不同,Signal可以处于“有效”(开)或“无效”(关)状态,同时可以是反向(低电平有效)或非反向的。换句话说,它为Pin功能增加了逻辑反转支持。虽然这看起来是一个简单的添加,但它正是支持各种简单数字设备以跨不同板卡可移植的方式所需的,这是MicroPython的主要目标之一。无论不同的用户拥有高电平有效的LED还是低电平有效的LED,常开或常闭的继电器 - 你都可以开发一个单一的、外观良好的应用程序,它可以与它们中的每一个一起工作,并且可以在应用程序的配置文件中用几行代码捕获硬件配置差异。
例子:
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()
以下是应该使用Singal还是Pin的指导:
使用Signal:如果你想控制简单的开/关(包括软件PWM!)设备,如LEDs、多段显示器、继电器、蜂鸣器,或读取简单的二进制传感器,如常开或常闭按钮、高电平或低电平拉高、簧片开关、湿度/火焰探测器等等。总之,如果你有一个需要GPIO访问的真实物理设备/传感器,你很可能应该使用Signal。
使用Pin:如果你实现了一个高级协议或总线来与更复杂的设备通信。
Pin和Signal之间的分裂来自于上述用例和MicroPython的架构:Pin提供了最低的开销,这在位摆动协议时可能很重要。但Signal在Pin的基础上增加了额外的灵活性,代价是微小的开销(比如果你手动用Python实现高电平有效与低电平有效设备差异要小得多!)。此外,Pin是一个低级对象,需要为每个支持的板卡实现,而Signal是一个高级对象,一旦Pin实现了,就免费获得。
如果有疑问,试试Signal吧!再次强调,它是为了节省开发者处理如高电平有效与低电平有效信号等不令人兴奋的差异的需要,并允许其他用户分享和享受你的应用程序,而不是因为它们的LED或继电器的接线方式略有不同而感到沮丧。
构造函数¶
- class machine.Signal(pin_obj, invert=False)¶
- class machine.Signal(pin_arguments..., *, invert=False)
创建一个Singal对象。有两种创建方式:
通过包装现有的Pin对象 - 适用于任何卡板的通用方法。
直接将所需的Pin参数传递给Signal构造器,跳过创建中间Pin对象的需要。在许多但不是所有的板卡上可用。
参数包括:
pin_obj
是现有的Pin对象。pin_arguments
是可以传递给Pin构造函数的相同参数。invert
- 如果为True,信号将被反转(低电平有效)。
方法¶
- Signal.value([x])¶
此方法允许根据是否提供参数
x
来设置和获取信号的值。如果省略参数,则此方法获取信号电平,1表示信号断言(活动)且0 - 信号非活动。
如果提供了参数,则此方法设置信号电平。参数
x
可以是任何可以转换为布尔值的东西。如果它转换为True
,则信号活动,否则它是非活动的。信号活动与底层引脚上的实际逻辑电平之间的对应关系取决于信号是否被反转(低电平有效)或不反转。对于非反转信号,活动状态对应于逻辑1,非活动状态 - 对应于逻辑0。对于反转/低电平有效信号,活动状态对应于逻辑0,而非活动状态 - 对应于逻辑1。
- Signal.on()¶
激活信号。
- Signal.off()¶
关闭信号。