开箱贴上已经验证过板卡上有三个按键,不需要外接按键的设想理论可行,因此今天实际编码验证效果。看大家玩的都是arduino,那我就走另一个方向,玩CircuitPython。
硬件接线
从按键原理图可以知道:
D0按键对应脚为IO0_BOOT0,按下接地,由于未接上拉,因此需要配置成上拉输入
D1按键对应脚为IO1,按下接到3.3V,由于外部未接下拉,因此需要配置成输入下拉
D2按键对应脚为IO2,按下接到3.3V,由于外部未接下拉,因此需要配置成输入下拉
软件编码
import time import board from digitalio import DigitalInOut, Direction, Pull def keyDetect(): key_value = 0 if key0.value == 0: key_value +=1 if key1.value: key_value +=2 if key2.value: key_value +=4 return key_value def isKeyPressed(): key_value = keyDetect() if key_value: time.sleep(0.01) if key_value == keyDetect(): return key_value return 0 key0 = DigitalInOut(board.BOOT0) key0.direction = Direction.INPUT key0.pull = Pull.UP key0_value = key0.value key1 = DigitalInOut(board.D1) key1.direction = Direction.INPUT key1.pull = Pull.DOWN key2 = DigitalInOut(board.D2) key2.direction = Direction.INPUT key2.pull = Pull.DOWN key_value = 0 old_key_value = key_value while True: key_value=isKeyPressed() if old_key_value != key_value: old_key_value = key_value if key_value == 1: print("Key D0 Pressed") elif key_value == 2: print("Key D1 Pressed") elif key_value == 4: print("Key D2 Pressed") elif key_value == 3: print("Key D0 D1 Pressed") elif key_value == 5: print("Key D0 D2 Pressed") elif key_value == 6: print("Key D1 D2 Pressed") elif key_value == 7: print("Key D0 D1 D2 Pressed") else: print("Key Release")
编码思路为:先将所有按键按下信息记录,判断是否有按键按下,如果有按键按下,则延时消抖后再读一次,若读到的值与之前读到的值一致,则认为按键按下。上层根据按下消息提供对应的输出。
结果验证
>>> %Run -c $EDITOR_CONTENT Key D0 Pressed Key Release Key D1 Pressed Key Release Key D0 D1 Pressed Key Release Key D1 Pressed Key Release Key D2 Pressed Key Release Key D1 D2 Pressed Key Release Key D0 D2 Pressed Key Release Key D0 D1 Pressed Key Release Key D0 D1 D2 Pressed Key Release
可以看到,按键效果与预期一致(消抖过程被认为按键释放后按下新键,对上层逻辑来说,反而降低了状态维护难度,不算问题),按键检测实现完毕