用一顆按鈕控制開發板上的 LED:Thonny、MicroPython 與 Codex 實作紀錄
在學習 MicroPython 的過程中,一個很適合入門的實驗, 就是使用按鈕控制開發板上的 LED。 這次透過 Thonny 撰寫程式,完成「按一下按鈕,LED 切換亮滅」的功能, 並將開關與 LED 狀態輸出到 Thonny Shell。
硬體接線
本次使用 Raspberry Pi Pico 類型的開發板,接線方式如下:
- 按鈕一端接 GPIO 15
- 按鈕另一端接 GND
- LED 使用開發板上的板載 LED
- 程式使用內建上拉電阻
使用上拉電阻時,按鈕沒有按下時會讀到高電位; 按下按鈕後,GPIO 15 會接地並讀到低電位。
使用 Codex 協助完成的過程
這次實作使用 Codex 協助撰寫程式、修改功能,以及分析硬體測試時遇到的問題。 一開始先向 Codex 說明需求:使用一顆按鈕控制開發板上的板載 LED。
- 使用 Codex 建立按鈕控制 LED 的 MicroPython 程式。
- 透過 Thonny 開啟程式,並儲存為
button_led.py。 - 加入
print(),將按鈕與 LED 狀態輸出到 Thonny Shell。 - 實際測試時發現 LED 沒有亮,將測試結果回報給 Codex。
- Codex 協助分析後,發現固定使用 GPIO 25 不一定適用於目前的開發板。
- 將 LED 設定修改為
Pin("LED", Pin.OUT)。 - 再次測試後,LED 成功恢復正常亮滅。
一開始遇到的問題
最初使用 GPIO 25 控制板載 LED:
led = Pin(25, Pin.OUT)
程式雖然可以執行,但 LED 卻沒有亮。 原因是不同型號的開發板,板載 LED 可能使用不同的控制方式。 因此,固定使用 GPIO 25 不一定能控制目前使用的板載 LED。
修正方式
將 LED 設定改為使用開發板定義的 LED 名稱:
led = Pin("LED", Pin.OUT)
這樣 MicroPython 會依照目前使用的開發板,自動對應正確的板載 LED。 修正後,LED 就能正常亮滅。
完整 MicroPython 程式
from machine import Pin
from time import sleep
# 使用板子定義的板載 LED 腳位
led = Pin("LED", Pin.OUT)
# 按鈕接在 GPIO 15 與 GND,使用內建上拉電阻
button = Pin(15, Pin.IN, Pin.PULL_UP)
while True:
if button.value() == 0:
led.value(not led.value())
print("開關:ON,LED:", "亮" if led.value() else "滅")
# 等待按鈕放開,避免一次觸發多次
while button.value() == 0:
sleep(0.01)
# 簡單防止按鍵彈跳
sleep(0.02)
Thonny Shell 輸出
按下按鈕後,Thonny Shell 會顯示:
開關:ON,LED: 亮
再次按下按鈕時,則會顯示:
開關:ON,LED: 滅
這次實作學到的事情
- 如何使用 MicroPython 設定 GPIO 輸入與輸出。
- 如何使用按鈕控制 LED 的亮滅。
- 如何使用內建上拉電阻簡化按鈕接線。
- 如何使用
print()在 Thonny Shell 顯示狀態。 - 如何透過等待按鈕放開與延遲處理按鍵彈跳。
- 不同開發板的板載 LED 腳位定義可能不同。
- 如何使用 Codex 協助產生程式、分析錯誤並進行修改。
實作心得
這次實驗讓我了解到,不同開發板的硬體定義可能不完全相同。
使用固定 GPIO 編號前,必須先確認該編號是否真的對應到板載 LED。
使用 Pin("LED", Pin.OUT) 可以讓程式具備更好的相容性。
此外,按鈕程式需要加入等待放開與按鍵防彈跳處理, 否則按一下可能會被程式判斷成多次按鍵。 透過 Codex 的協助,可以快速建立程式、加入新功能, 並根據實際硬體測試結果找出問題。
這個小實驗也可以進一步延伸成長按偵測、LED 閃爍模式, 或加入蜂鳴器與其他感測器。
沒有留言:
張貼留言