## 按鈕

檢測按鈕是否按下:
~~~
from gpiozero import Button
button = Button(2)
while True:
if button.is_pressed:
print("Button is pressed")
else:
print("Button is not pressed")
~~~
直到按下代碼程序才繼續運行:
~~~
from gpiozero import Button
button = Button(2)
button.wait_for_press()
print("Button was pressed")
~~~
每按代碼一次都執行特定函數一次:
~~~
from gpiozero import Button
from signal import pause
def say_hello():
print("Hello!")
button = Button(2)
button.when_pressed = say_hello # 沒有括號
pause()
~~~
>注意:```button.when_pressed = say_hello```不會執行```say_hello```函數,只是創建了一個```say_hello```函數的引用,指明按鈕按下的時候需要執行```say_hello```函數。
類似的,我們可以指定一個釋放按鈕時需要執行的函數:
~~~
from gpiozero import Button
from signal import pause
def say_hello():
print("Hello!")
def say_goodbye():
print("Goodbye!")
button = Button(2)
button.when_pressed = say_hello
button.when_released = say_goodbye
pause()
~~~

## 大按鈕
上面的例子用的是微動開關,比較簡單,市面上比較常見的按鈕模塊,也是出于按鍵方便和美觀的考慮,大按鈕模塊:

需要注意到是上圖中的兩種按鈕都有3個引腳,但其實有一點小差異的:

上圖的這種有3個引腳,分別是VCC,OUT和GND,需要注意的是OUT是在中間的。而且
按個按鈕OUT連接樹莓派數字引腳,VCC連接5V,Gnd連接樹莓派接地之后,按下是輸出高電平的,釋放輸出低電平。

上圖是參考資料中的按鈕,則是按下高電平,釋放低電平。
而下圖中的按鈕也就是`5色輕觸按鍵模塊`:

則是按下低電平,釋放高電平。
而GPIO Zer類中的按鈕,默認的是按下低電平,釋放高電平,如果是用按下高電平釋放低電平的按鈕,上面的代碼需要略作修改才能夠得到相同的結果:
```
from gpiozero import Button
button = Button(6, pull_up=True)
while True:
if button.is_pressed:
print("Button is pressed")
else:
print("Button is not pressed")
```
>這里就是涉及到樹莓派引腳的`pull_up`。參考資料[http://www.geekfans.com/article-5086-1.html](http://www.geekfans.com/article-5086-1.html)樹莓派的上拉和下拉設置。如果按鈕不能按照預期工作,修改下`pull_up`參數試試看,
### 正負極反接
或者把按鈕的vcc連接到樹莓派的gnd,把按鈕的gnd連接到樹莓派的5v。

對于這個按鈕,如果想要跟上面`微動開關`的代碼相同,不想修改代碼的話,只需要把按鈕的gnd連接到樹莓派5v,按鈕的vcc連接到樹莓派Gnd,里面的原理待我搞透徹了再補充。
這樣的話,微動開關的例子,可以原封不動的運行生效。
```
from?gpiozero?import?Button,?LED
from?signal?import?pause
led?=?LED(16)
button?=?Button(5)
led.source?=?button
pause()
```
這段代碼的意思是,LED燈是否亮取決于按鈕的狀態,當然如果是正常的接法,led的亮滅其實跟按鈕相反的代碼就是:
```
>`gpio_pull?????????????? Desired pull-up/down state (off, down, up)`
`Default is "up".`
`Note that the default pin (GPIO3) has an`
`external pullup.`
```
樹莓派的GPIO2是個很特殊的按鈕。
# 不知道按鈕按下輸出高電平還是低電平怎么辦
可以在正確連接線路的基礎上,編寫代碼進行測試。
```
from gpiozero import Button
from signal import pause
button = Button(6)
while True:
print(button.value)
pause()
```
這樣就可以很輕易的測試出硬件連接正確的情況下,按下按鈕出處的值了。然后根據值來判斷LED的亮滅就可以了:
```
from gpiozero import Button, LED
from signal import pause
from gpiozero.tools import negated
led = LED(16)
button = Button(6)
# led.source = negated(button)
while True:
if button.value: # 按鈕沒按下是1
led.off()
else: # 按鈕按下 button的值是0
led.on()
pause()
```
但是這樣寫比較麻煩,我們可以簡化一下:
```from gpiozero import Button, LED
from signal import pause
led = LED(16)
button = Button(6)
while True:
led.value = not button.value
pause()
```
注意因為在python中0在進行布爾判斷的時候是False,其余的是True,所以如果是1 然后not 1,結果是False。但是這樣寫還是不夠簡練,我們用GPIO Zero提供的數據源工具更加優雅的實現,按下按鈕LED亮,松開按鈕LED滅的效果:
```
from gpiozero import Button, LED
from signal import pause
from gpiozero.tools import negated
led = LED(16)
button = Button(6)
led.source = negated(button)
pause()
```
上面這段代碼就用到了GPIO Zero中精心設計的聲明式編程范式,聲明led燈的狀態與button按鈕返回的狀態相反,這樣就實現了按下燈亮,抬起燈滅的效果了。
>A GPIO pin designated as an input pin can be read as high (3V3) or low (0V). This is made easier with the use of internal pull-up or pull-down resistors. Pins GPIO2 and GPIO3 have fixed pull-up resistors, but for other pins this can be configured in software.[https://www.ccarea.cn/archives/215](https://www.ccarea.cn/archives/215)
## 參考資料:
* [Arduino大按鈕](https://www.ncnynl.com/archives/201606/108.html)
- 簡介
- 更新樹莓派源
- GPIO Zero基礎案例
- 導入GPIO Zero庫
- 引腳編碼
- 樹莓派代碼編輯器
- LED
- 電磁繼電器
- 呼吸燈
- LED條形圖
- led條
- 交通燈
- 按鈕
- 按鈕控制LED燈
- 用按鈕控制攝像頭
- 舵機
- 關機按鈕
- 按鈕拍照
- 反應速度游戲
- 音樂盒子
- 單個按鈕控制多個元件
- 全彩燈
- 人體紅外傳感器
- 亮度傳感器
- 距離傳感器
- 馬達控制
- 機器人
- 按鈕控制機器人
- 鍵盤控制機器人
- 紅外感應機器人
- 電位器
- 用數模轉換器測量溫度
- 通過3個電位器控制全彩燈
- 時控加熱燈
- 聯網狀態指示
- CPU溫度條形圖
- 更多
- OLED屏幕
- GPIO Zero基礎案例2
- 古德微樹莓派案例
- ws2812燈帶python案例
- ads1115
- 高級秘籍
- 4 配置遠程GPIO
- 5 遠程GPIO案例
- 5.1 LED和按鈕
- 6 樹莓派Zero OTG USB數據線
- 7.數據源和值
- 微信發送疫情
- 8. 命令行工具
- 9. 常見問題
- 10. 從RPi.GPIO庫遷移到GPIO Zero
- 公眾號文章
- Python繪制疫情圖表
- 百度人工智能案例
- vscode配置樹莓派遠程開發環境
- Jupyter Notebook相關
- 樹莓派拍攝定格動畫
- oled
- 創客與音樂
- 如何入門Python
- 交通標志