Learning Objectives
- 用 machine.Pin 把一支 GPIO 腳位設成輸出,寫 1 與 0 控制 LED 亮暗
- 說明 LED 為什麼要串一顆限流電阻,以及長腳、短腳怎麼接
- 用 time.sleep 控制亮暗的時間,寫出永遠閃爍的程式
- 依序控制多顆 LED,做出紅綠燈的時序
寫程式控制真實世界的第一步
在電腦上寫程式,結果出現在螢幕上;在微控制器上寫程式,結果會出現在真實世界:燈會亮、馬達會轉、喇叭會響。 這些事情的起點都一樣:讓一支腳位輸出高電位或低電位。
這一課要回答:
- 程式怎麼讓 ESP32 的某一支腳位「通電」?
- LED 要怎麼接,才不會燒掉 LED 或開發板?
- 微控制器的程式為什麼常常寫成永遠不會結束的迴圈?
GPIO:可以由程式決定用途的腳位
ESP32 開發板兩側的金屬針腳,大部分是 GPIO(General Purpose Input/Output,通用輸入輸出)。 「通用」的意思是:同一支腳位可以由程式設定成輸出(送出電壓去控制東西)或輸入(讀取外面的電壓,下一課會用到)。
設成輸出時,腳位只有兩種狀態:
| 程式寫入 | 腳位電壓 | 稱為 |
|---|---|---|
1 |
約 3.3V | 高電位(HIGH) |
0 |
約 0V | 低電位(LOW) |
ESP32 的工作電壓是 3.3V,所以「高電位」是 3.3V,不是 5V。之後接感測器或模組時,要確認它們能接受 3.3V 的訊號。
LED 怎麼接
LED(發光二極體)有兩支腳,電流只能從一個方向流過:
- 長腳是正極(陽極),接到 GPIO 腳位
- 短腳是負極(陰極),接到 GND(接地)
LED 本身的電阻很小,直接接在 3.3V 上,電流會大到燒壞 LED,也可能傷到開發板的腳位。所以一定要串聯一顆限流電阻。 電阻值可以這樣估算(「自造者入門」軌第 03 課會詳細算):
電阻 =(電源電壓 - LED 的順向電壓)÷ 想要的電流
=(3.3V - 2.0V)÷ 0.01A
= 130Ω → 選用常見、略大一點的 220Ω
紅色 LED 的順向電壓大約 2V,藍色、白色大約 3V,實際數值以 LED 的規格為準。電阻大一點只是比較暗,比電阻太小安全。
GPIO23 ──[ 220Ω ]──▶|── GND
(LED:長腳在左、短腳在右)
許多 ESP32 開發板在 GPIO2 接了一顆板上 LED,不用接線就能測試;但不是每一塊板子都有,也不一定在 GPIO2,要看板子的說明。
逐步看:讓 LED 閃三次
上方的電路畫面會跟著每一步更新。注意兩件事:執行到 led.value(1) 的下一步,LED 才亮起來;
time.sleep(0.5) 這一行讓「虛擬時間」一口氣前進 0.5 秒(看左上角的時間)。
微控制器的程式為什麼不結束
電腦上的程式做完事就結束,回到作業系統。微控制器通常只做一件事,而且要一直做: 溫度計要一直量、紅綠燈要一直換。所以 MicroPython 的程式常常寫成:
while True:
# 讀感測器、控制輸出、等一下
ESP32 開機時會自動執行存在板子上的 main.py(第 16 課會介紹),裡面通常就是這樣的無窮迴圈,直到斷電或按下重設鍵。
下一個範例只有四行,用 not 把目前的狀態反過來寫回去,LED 就會一直閃。模擬器不能真的跑到永遠,
所以電路規格設定只模擬 2 秒,時間到就停下來,像把電源拔掉一樣。
逐步看:永遠閃爍
每執行一次第 7 行,LED 就換一次狀態。看最後一步:模擬時間到 2 秒時程式停在 sleep 裡,不是程式出錯。
逐步看:紅綠燈
三顆 LED 各接一支腳位。用一個函式一次設定三顆燈,再等一段時間,程式比較好讀,也不容易漏掉某一顆。
小測驗:腳位與接線
執行 led = Pin(23, Pin.OUT) 之後再執行 led.value(1),GPIO23 的電壓大約是多少?
紅色 LED 的順向電壓約 2V,接在 3.3V 的腳位上,想讓電流約 10 mA,限流電阻大約要多少?
LED 接反了(長腳接 GND、短腳接 GPIO),寫入 1 時會怎樣?
小測驗:程式與時間
下面的程式在模擬器裡執行,會印出什麼?
from machine import Pin
led = Pin(23, Pin.OUT)
led.value(1)
led.value(not led.value())
print(led.value())
while True: 迴圈裡只有 led.value(1)、time.sleep(0.3)、led.value(0)、time.sleep(0.7),LED 一秒內亮多久?
重點整理
Pin(編號, Pin.OUT)把 GPIO 設成輸出;value(1)輸出 3.3V,value(0)輸出 0V,value()讀目前的狀態。- LED 長腳接 GPIO、短腳接 GND,一定要串限流電阻(3.3V 下常用 220Ω)。
time.sleep(秒)讓程式暫停;亮與暗各等多久,決定閃爍的節奏。- 微控制器的程式通常寫成
while True無窮迴圈,一直做同一件事。 - 多顆 LED 依序設定時,先設好全部的燈再等待,時序比較清楚。
下一課讀取按鈕:腳位設成輸入,讓程式知道外面發生了什麼事。