如果我們需要讓Pico / Pico W 可以透過按鈕和使用者互動,也就是在接上按鈕之後,可以在程式中偵測到按鈕的狀態,只要找到一個簡易型的按鈕,然後把按鈕一端接到GPIO的任一腳,另外一端接地,就可以寫出按鈕偵測的程式查詢目前按鈕是否被按下去。
我們這次使用的按鈕是以下這種:
這個例子使用了兩個按鈕,分別接到GP18和GP19,也就是實際接腳的第24和第25的位置。連接完成之後,可以使用以下的程式碼來檢查是否可以順利偵測(以下的程式碼是在Pico上執行的,如果你用的是Pico W的話,請把 led = Pin(25, Pin.OUT)這行改為 led = Pin(“LED”, Pin.OUT):
from machine import Pin
btn1 = Pin(18, Pin.IN, Pin.PULL_UP)
led = Pin(25, Pin.OUT)
while True:
if btn1.value():
led.off()
else:
led.on()
上述的程式會讓你在按下按鈕的時候點亮板子上的預設LED,放開按鈕的時候該LED就會熄滅。
假設我們想要利用兩顆按鈕來進行計數器的加減,按左邊按鈕時把計數器加1,按右邊按鈕時則把計數器減1,第一個想法是製作以下的程式:
from machine import Pin
import time
btn1 = Pin(18, Pin.IN, Pin.PULL_UP)
btn2 = Pin(19, Pin.IN, Pin.PULL_UP)
counter = 0
while True:
if btn1.value()==0:
counter += 1
print(counter)
elif btn2.value()==0:
counter -= 1
print(counter)
time.sleep_ms(100)
上述程式在執行時大致上可行,但是由於按鈕在按下時會有彈跳的現象,而且按下去到離開的時間不一定,所以有時候可能會被多加1或多減了1,在計數上並不太確實。此種情況可以利用以下的程式來解決,也就是當按鈕按下去之後,我們還要多一個偵測的動作,一直到按鈕被放開時才加1或減1。
結合之前文章中介紹的SSD1306微型顯示器的功能,以下的程式把計數器的內容顯示在顯示器的正中央位置,程式碼如下:
from machine import Pin, I2C
import ssd1306, time
i2c = I2C(0, sda=Pin(16), scl=Pin(17))
disp = ssd1306.SSD1306_I2C(128, 64, i2c)
btn1 = Pin(18, Pin.IN, Pin.PULL_UP)
btn2 = Pin(19, Pin.IN, Pin.PULL_UP)
count = 0
while True:
if btn1.value() == 0:
while btn1.value()==0:
pass
count -= 1
elif btn2.value() == 0:
while btn2.value()==0:
pass
count += 1
disp.fill(0)
disp.text(str(count), 62, 32)
disp.show()
利用上述的程式,就可以很明確地判斷按鈕是否完成了按下且釋放的動作,只有完成了這兩個動作之後,才會進行計數器計數以及顯示的功能。