2026年10月27日 星期二

用一顆按鈕控制開發板上的 LED

用一顆按鈕控制開發板上的 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。

  1. 使用 Codex 建立按鈕控制 LED 的 MicroPython 程式。
  2. 透過 Thonny 開啟程式,並儲存為 button_led.py。
  3. 加入 print(),將按鈕與 LED 狀態輸出到 Thonny Shell。
  4. 實際測試時發現 LED 沒有亮,將測試結果回報給 Codex。
  5. Codex 協助分析後,發現固定使用 GPIO 25 不一定適用於目前的開發板。
  6. 將 LED 設定修改為 Pin("LED", Pin.OUT)。
  7. 再次測試後,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 閃爍模式, 或加入蜂鳴器與其他感測器。

小提醒:執行程式前,請確認 Thonny 已選擇正確的 MicroPython 開發板與連接埠。

沒有留言:

張貼留言