第3章 ESP32 GPIO 完整教學:Pinout、輸入輸出與特殊腳位

發布日期: |更新日期:
文章主圖:第3章 ESP32 GPIO 完整教學:Pinout、輸入輸出與特殊腳位

ESP32 最重要的基礎功能之一,就是 GPIO(General Purpose Input/Output,通用輸入輸出)。

不管未來要做:

  • LED 控制
  • 按鍵輸入
  • 繼電器
  • 蜂鳴器
  • DHT11 / DHT22
  • LCD1602
  • OLED
  • Servo
  • 超音波感測器
  • PIR 人體紅外線
  • RFID
  • GPS
  • LoRa
  • I²C
  • SPI
  • UART
  • Wi-Fi IoT 控制

最後幾乎都會使用到 ESP32 的 GPIO。

如果已經使用過 Arduino UNO R3,ESP32 的:

pinMode();
digitalWrite();
digitalRead();

看起來非常熟悉。

但是 ESP32 GPIO 有一個非常重要的特性:

並不是每一支 GPIO 都可以完全相同地使用。

某些腳位:

  • 只能當輸入。
  • 沒有內部 Pull-up / Pull-down。
  • 與 Flash Memory 有關。
  • 屬於 Strapping Pin。
  • 會影響 ESP32 開機模式。
  • 可能在啟動瞬間輸出特定電位。
  • 可能已被 UART 使用。
  • 在某些模組上可能連接 PSRAM。

因此:

ESP32 學 GPIO,不能只記 pinMode(),更重要的是學會選腳位。

本章將完整介紹:

  • ESP32 GPIO 是什麼。
  • ESP32 Pinout 怎麼看。
  • GPIO 與實體 Pin 的差別。
  • Digital Output。
  • Digital Input。
  • INPUT、OUTPUT、INPUT_PULLUP。
  • GPIO34~GPIO39 為什麼特殊。
  • Strapping Pin 是什麼。
  • GPIO6~GPIO11 為什麼不要使用。
  • GPIO16、17 在不同 ESP32 模組上的差異。
  • UART、I²C、SPI 常見 GPIO。
  • ESP32 GPIO Matrix。
  • 哪些 GPIO 適合初學者。
  • 哪些 GPIO 使用時要小心。
  • LED Blink 實作。
  • 按鍵 Input 實作。
  • LED + Button 完整輸入輸出實作。
  • 常見 GPIO 錯誤與排除方式。

一、什麼是 GPIO?

GPIO 全名:

General Purpose Input / Output

中文通常稱為:

通用輸入輸出腳位

最基本可以分為:

GPIO
 │
 ├── Input
 │
 └── Output

也就是:

Input

ESP32 讀取外部訊號。

例如:

Button
   │
   ↓
ESP32 GPIO

ESP32 可以知道按鍵:

HIGH
或
LOW

Output

ESP32 輸出訊號控制外部裝置。

例如:

ESP32 GPIO
    │
    ↓
   LED

可以控制:

LED ON
LED OFF

二、ESP32 有多少 GPIO?

這一章主要討論的是第一代經典 ESP32 / ESP32-WROOM-32 平台,而不是 ESP32-S3、C3、C6 等其他系列。

經典 ESP32 晶片具有 34 個實體 GPIO。官方 ESP-IDF 文件同時指出,其中 GPIO34~GPIO39 只能設定為 Input。

常見 GPIO 編號包括:

GPIO0
GPIO1
GPIO2
GPIO3
GPIO4
GPIO5

GPIO6
GPIO7
GPIO8
GPIO9
GPIO10
GPIO11

GPIO12
GPIO13
GPIO14
GPIO15

GPIO16
GPIO17
GPIO18
GPIO19

GPIO21
GPIO22
GPIO23

GPIO25
GPIO26
GPIO27

GPIO32
GPIO33

GPIO34
GPIO35
GPIO36
GPIO37
GPIO38
GPIO39

注意:

並沒有:

GPIO20
GPIO24
GPIO28
GPIO29
GPIO30
GPIO31

所以 ESP32 GPIO 編號不是連續的。

三、GPIO Number 不等於「第幾支腳」

這是 Arduino UNO 使用者很容易產生的誤解。

例如程式:

pinMode(23, OUTPUT);

這裡的:

23

代表:

GPIO23

而不是:

開發板左邊或右邊的第 23 支 Pin

因此 ESP32 接線時應該看:

GPIO23
GPIO22
GPIO21
GPIO19
...

而不是自己按照腳位順序數。

四、ESP32 Pinout 是什麼?

Pinout 就是一張:

腳位功能配置圖

通常會標示:

3V3
EN
GPIO
GND
VIN / 5V
TX
RX
ADC
DAC
Touch
SPI
I2C
UART

例如某個腳位可能同時具有:

GPIO21
Digital I/O
I2C SDA

表示它不是只能做一件事情。

ESP32 很多數位周邊訊號可以透過內部 GPIO Matrix 配置到不同 GPIO,因此不像某些微控制器那樣所有功能都嚴格固定在單一腳位。Espressif 官方 FAQ 也指出,多數 Digital Peripheral 可以透過 GPIO Matrix 指派到可用腳位。

五、為什麼不同 ESP32 Pinout 圖看起來不一樣?

因為:

ESP32 不是只有一塊開發板。

可能有:

ESP32-DevKitC
ESP32 DevKit V1
ESP32-WROOM-32 Board
ESP32-WROVER
ESP32-DevKitM
第三方 ESP32 Board

不同板子:

  • Pin 數可能不同。
  • 左右排列不同。
  • USB 晶片不同。
  • LED GPIO 不同。
  • Flash / PSRAM 不同。
  • 標示方式不同。

官方 ESP32-DevKitC 就是其中一種 Espressif 開發板,主要 GPIO 會引出到左右兩側 Pin Header。

所以:

購買 ESP32 開發板後,第一件事情就是確認實際型號並保存對應 Pinout。

六、ESP32 GPIO 的 3.3V 邏輯

這是本章最重要的安全觀念之一。

ESP32 GPIO 使用:

3.3V Logic

因此不要把 Arduino UNO 的:

5V GPIO

使用習慣直接搬過來。

典型概念:

ESP32 LOW
≈ 0V

ESP32 HIGH
≈ 3.3V

外部模組如果輸出:

5V

不要直接送進 ESP32 GPIO。

可能需要:

Voltage Divider

或:

Logic Level Converter

所以一定要區分:

ESP32 開發板可以由 USB 5V 供電

與:

ESP32 GPIO 是 3.3V 邏輯

這是完全不同的兩件事情。

七、ESP32 GPIO Output

最基本的 Output 程式:

const int LED_PIN = 23;

void setup()
{
  pinMode(LED_PIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_PIN, HIGH);
  delay(1000);

  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

核心只有:

pinMode(LED_PIN, OUTPUT);

以及:

digitalWrite();

八、pinMode() 是什麼?

語法:

pinMode(pin, mode);

例如:

pinMode(23, OUTPUT);

代表:

GPIO23
設定成
Output

如果:

pinMode(27, INPUT);

表示:

GPIO27
設定成
Input

Arduino Framework 中常見設定包括:

INPUT
OUTPUT
INPUT_PULLUP

九、digitalWrite() 是什麼?

Output 模式下可以使用:

digitalWrite(pin, value);

例如:

digitalWrite(23, HIGH);

GPIO23 輸出 High。

例如:

digitalWrite(23, LOW);

GPIO23 輸出 Low。

典型 LED 控制:

HIGH
 ↓
LED ON

LOW
 ↓
LED OFF

但如果外部模組是:

Active LOW

則邏輯可能相反。

十、第一個 GPIO Output 實作:外接 LED

材料

  • ESP32 × 1
  • LED × 1
  • 220Ω~330Ω 電阻 × 1
  • 麵包板 × 1
  • 杜邦線

本實作使用:

GPIO23

而不是直接假設開發板 Built-in LED 位於 GPIO2。

這樣比較不受不同 ESP32 開發板影響。

十一、LED 接線

ESP32 GPIO23
      │
      ↓
    220Ω
      │
      ↓
   LED Anode +
      │
   LED Cathode -
      │
      ↓
     GND

簡化成:

GPIO23 → 220Ω → LED → GND

十二、ESP32 LED Blink 程式

const int LED_PIN = 23;

void setup()
{
  pinMode(LED_PIN, OUTPUT);

  Serial.begin(115200);

  Serial.println();
  Serial.println("ESP32 GPIO Output Test");
}

void loop()
{
  digitalWrite(LED_PIN, HIGH);

  Serial.println("LED ON");

  delay(1000);

  digitalWrite(LED_PIN, LOW);

  Serial.println("LED OFF");

  delay(1000);
}

十三、預期結果

LED:

ON
 ↓
1 秒
 ↓
OFF
 ↓
1 秒
 ↓
重複

Serial Monitor:

LED ON
LED OFF
LED ON
LED OFF
...

Baud Rate:

115200

十四、ESP32 GPIO Input

除了 Output,GPIO 第二個最基本功能就是:

Input

例如接:

Button
PIR
Switch
Sensor Digital Output
Limit Switch
IR Sensor

程式可以使用:

digitalRead();

十五、digitalRead() 是什麼?

例如:

int state = digitalRead(27);

表示讀取:

GPIO27

目前電位。

結果通常為:

HIGH

或:

LOW

所以:

if (digitalRead(27) == HIGH)
{
}

就是檢查 GPIO27 是否為 High。

十六、為什麼按鍵 Input 不能直接懸空?

假設:

GPIO27
   │
Button
   │
 GND

按鍵沒有按時,GPIO27 如果沒有 Pull-up 或 Pull-down,可能處於:

Floating

也就是浮動狀態。

ESP32 可能讀到:

HIGH
LOW
HIGH
HIGH
LOW
...

變得不穩定。

因此 Digital Input 通常需要:

Pull-up

或:

Pull-down

十七、INPUT_PULLUP

Arduino Framework 提供非常方便的:

INPUT_PULLUP

例如:

pinMode(27, INPUT_PULLUP);

概念:

3.3V
 │
Internal Pull-up
 │
GPIO27
 │
Button
 │
GND

因此:

按鍵沒有按

GPIO = HIGH

按鍵按下

GPIO = LOW

也就是:

Released = HIGH
Pressed  = LOW

初學者一開始很容易把這個邏輯寫反。

十八、按鍵 Input 實作

使用:

Button → GPIO27

接線:

GPIO27
  │
Button
  │
GND

因為使用:

INPUT_PULLUP

所以不需要額外外接 Pull-up 電阻。

十九、按鍵測試程式

const int BUTTON_PIN = 27;

void setup()
{
  Serial.begin(115200);

  pinMode(BUTTON_PIN, INPUT_PULLUP);

  Serial.println();
  Serial.println("ESP32 Button Test");
}

void loop()
{
  int buttonState = digitalRead(BUTTON_PIN);

  if (buttonState == LOW)
  {
    Serial.println("Button Pressed");
  }
  else
  {
    Serial.println("Button Released");
  }

  delay(200);
}

二十、按鍵執行結果

未按:

Button Released

按下:

Button Pressed

對應:

Released
=
HIGH

Pressed
=
LOW

原因就是:

INPUT_PULLUP

二十一、ESP32 GPIO 最大陷阱:不是每支都能 Output

經典 ESP32 有幾支 GPIO 非常特殊:

GPIO34
GPIO35
GPIO36
GPIO37
GPIO38
GPIO39

這些 GPIO:

只能 Input。

Espressif 官方文件明確指出 GPIO34~GPIO39 為 Input-only GPIO,沒有 Output Driver。

因此:

pinMode(34, OUTPUT);

不是正確的用途。

二十二、GPIO34~GPIO39 還有第二個重要限制

除了:

Input Only

之外,它們還:

沒有軟體可啟用的內部 Pull-up / Pull-down。

Espressif 官方 GPIO 文件明確說明 GPIO34~GPIO39 不具軟體啟用的 Pull-up / Pull-down 功能。

所以例如:

pinMode(34, INPUT_PULLUP);

不能當成一般 GPIO27 那樣使用內建 Pull-up。

如果 GPIO34 接按鍵,就應考慮:

External Pull-up

例如:

3.3V
 │
10kΩ
 │
GPIO34
 │
Button
 │
GND

二十三、GPIO34~GPIO39 適合做什麼?

非常適合:

Sensor Input
ADC Input
Digital Input

例如:

Analog Sensor
    │
    ↓
 GPIO34

因為它們本來就是 Input-only。

但是不適合:

LED
Relay
Buzzer
Motor Signal Output

二十四、ESP32 Strapping Pin 是什麼?

ESP32 開機或 Reset 時,需要讀取某些 GPIO 電位來決定:

  • Boot Mode
  • Flash 啟動相關設定
  • 其他啟動設定

這些腳位稱為:

Strapping Pins

經典 ESP32 的主要 Strapping Pins 包括:

GPIO0
GPIO2
GPIO5
GPIO12
GPIO15

Espressif 官方 GPIO 文件將 GPIO0、GPIO2、GPIO5、GPIO12 與 GPIO15 列為 ESP32 Strapping Pins。

二十五、Strapping Pin 是不是完全不能使用?

不是。

這個觀念要特別釐清。

Strapping Pin 並不等於:

禁止使用

而是:

可以使用
但必須了解它對 Boot 的影響

因為 ESP32 Reset / Power-on 的瞬間會讀取相關腳位狀態。

如果外部模組強制把某支 Strapping Pin 拉到錯誤電位,就可能造成:

ESP32 無法正常開機

所以對初學者而言:

如果還有其他 GPIO 可以選,優先避開 Strapping Pins。

二十六、GPIO0 為什麼特別重要?

GPIO0 與:

Boot / Download Mode

密切相關。

上一章我們介紹 ESP32 Upload 時:

按住 BOOT

很多 ESP32 Development Board 的 BOOT Button 就與 GPIO0 有關。

當 ESP32 Reset 時 GPIO0 被拉到特定狀態,可以讓晶片進入下載模式。Espressif 官方開發文件也將 GPIO0 與 Firmware Download / Boot Mode 操作連結。

因此如果外部電路在開機時一直把 GPIO0 拉錯,就可能出現:

ESP32 不執行程式

而進到 Download Mode。

二十七、GPIO12 為什麼也要特別小心?

GPIO12 是 ESP32 的 Strapping Pin 之一。

它在某些啟動設定中具有特殊作用,因此外部電路如果在 Reset 時強制改變它的電位,可能導致開機異常。

所以初學階段不建議把:

Button
Relay
Sensor

優先安排在 GPIO12。

不是因為 GPIO12 完全不能使用,而是:

先選其他 GPIO
比較容易除錯

二十八、GPIO6~GPIO11 為什麼不要使用?

這是另一組非常重要的 GPIO。

GPIO6
GPIO7
GPIO8
GPIO9
GPIO10
GPIO11

在典型 ESP32 模組中會用於:

SPI Flash

Espressif 官方文件明確指出 GPIO6~GPIO11 通常保留給 Flash 使用。

例如 ESP32-DevKitC 官方文件中的:

D0
D1
D2
D3
CMD
CLK

就是 ESP32 與 SPI Flash 溝通使用的訊號,因此官方建議不要將它們拿來作一般用途,否則可能干擾 Flash 存取。

二十九、動到 Flash GPIO 可能發生什麼?

ESP32 執行程式本身就需要從:

Flash Memory

取得程式內容。

如果 GPIO6~GPIO11 被外部電路干擾,可能造成:

Boot Fail
Crash
Reset
Upload Error
Program Error

所以最簡單的規則:

GPIO6~GPIO11 不要拿來接一般模組。

三十、GPIO16、GPIO17 可以使用嗎?

答案:

要看你使用哪一種 ESP32 模組。

這也是很多網路 Pinout 教學容易過度簡化的地方。

在一般沒有 PSRAM 的 ESP32-WROOM-32 類型模組中,GPIO16、GPIO17 常可作一般 GPIO。

但是在部分:

ESP32-WROVER

等具有 PSRAM 的模組上,GPIO16、GPIO17 可能已用於 PSRAM。

Espressif 官方 WROVER 文件就指出,某些 WROVER 模組使用 GPIO16 與 GPIO17 連接 PSRAM。

所以:

WROOM

與:

WROVER

不能完全使用同一張 GPIO 建議表。

三十一、GPIO1 與 GPIO3 要注意什麼?

經典 ESP32 常見:

GPIO1 = TX0
GPIO3 = RX0

通常會被:

UART0

使用。

也就是:

ESP32
 │
UART0
 │
USB-to-UART
 │
PC

與:

Serial.begin(115200);

相關。

因此如果把其他裝置接到 GPIO1、GPIO3,很可能:

  • 影響 Upload。
  • 影響 Serial Monitor。
  • 出現亂碼。
  • 干擾其他 UART Device。

所以本套教材初期:

GPIO1、GPIO3 優先保留給 USB Serial。

三十二、ESP32 GPIO 分類表

以下以經典 ESP32-WROOM-32 類型教學為主:

經典 ESP32 GPIO 分類與使用注意事項
GPIO 一般用途建議 注意事項
GPIO0 小心使用 Strapping / BOOT
GPIO1 優先保留 UART0 TX
GPIO2 小心使用 Strapping
GPIO3 優先保留 UART0 RX
GPIO4 可使用 一般 GPIO
GPIO5 小心使用 Strapping
GPIO6 避免 Flash
GPIO7 避免 Flash
GPIO8 避免 Flash
GPIO9 避免 Flash
GPIO10 避免 Flash
GPIO11 避免 Flash
GPIO12 小心使用 Strapping
GPIO13 可使用 一般 GPIO
GPIO14 可使用 一般 GPIO
GPIO15 小心使用 Strapping
GPIO16 視模組 WROOM 常可用,部分 PSRAM 模組占用
GPIO17 視模組 WROOM 常可用,部分 PSRAM 模組占用
GPIO18 可使用 常作 SPI
GPIO19 可使用 常作 SPI
GPIO21 可使用 常作 I²C SDA
GPIO22 可使用 常作 I²C SCL
GPIO23 可使用 常作 SPI
GPIO25 可使用 GPIO / DAC
GPIO26 可使用 GPIO / DAC
GPIO27 可使用 一般 GPIO
GPIO32 可使用 GPIO / ADC
GPIO33 可使用 GPIO / ADC
GPIO34 Input Only 無內部 Pull-up/down
GPIO35 Input Only 無內部 Pull-up/down
GPIO36 Input Only 無內部 Pull-up/down
GPIO37 Input Only 實際是否引出依模組/板子
GPIO38 Input Only 實際是否引出依模組/板子
GPIO39 Input Only 無內部 Pull-up/down

GPIO34~GPIO39 的 Input-only 特性,以及 GPIO0、2、5、12、15 為 Strapping Pin,均可由 Espressif 官方 ESP32 GPIO 文件確認。

三十三、初學者比較推薦哪些 GPIO?

如果使用一般:

ESP32-WROOM-32 Development Board

而且只是做:

  • LED
  • Relay
  • Button
  • DHT
  • Buzzer

我會優先從這些腳位挑選:

GPIO4
GPIO13
GPIO14
GPIO18
GPIO19
GPIO21
GPIO22
GPIO23
GPIO25
GPIO26
GPIO27
GPIO32
GPIO33

這不是「官方唯一安全清單」,而是教學時為了:

降低 Boot 問題
降低 UART 衝突
避開 Flash
避免 Input-only

所採用的實務選擇。

真正製作產品時仍要依:

  • ESP32 Module
  • Schematic
  • Peripheral
  • ADC
  • Touch
  • SPI
  • UART
  • I²C
  • Boot
  • Sleep

需求進行完整 Pin Planning。

三十四、最簡單的腳位選擇原則

初學者可以先記:

GPIO6~11
→ 不用

GPIO34~39
→ 只能 Input

GPIO0、2、5、12、15
→ Boot 特殊腳,小心

GPIO1、3
→ Serial,先保留

剩下再依功能選擇。

這四條規則就可以避免大部分 GPIO 問題。

三十五、ESP32 I²C 常用 GPIO

Arduino ESP32 教學非常常見:

GPIO21 = SDA
GPIO22 = SCL

例如:

ESP32
 │
 ├── GPIO21 → SDA
 └── GPIO22 → SCL

可以連接:

OLED SSD1306
LCD1602 I2C
BME280
BMP280
MPU6050
RTC

但是要注意:

GPIO21 / GPIO22 是非常常見的 Arduino-ESP32 I²C 配置,不代表 ESP32 的 I²C 永遠只能接這兩支腳。

因為 ESP32 GPIO Matrix 提供相當高的周邊腳位配置彈性。

三十六、ESP32 SPI 常用 GPIO

常見 VSPI 類型配置會看到:

SCK  → GPIO18
MISO → GPIO19
MOSI → GPIO23
CS   → GPIO5

但是:

GPIO5

本身又是:

Strapping Pin

因此實際應用仍要考慮外部裝置在 Boot 時是否會影響該腳位。

ESP32 的 GPIO Matrix 也允許許多 SPI Signal 改到其他合適 GPIO,並非所有專案都必須使用同一組 Pin。

三十七、ESP32 UART 常見腳位

UART0 常見:

TX0 → GPIO1
RX0 → GPIO3

主要用於:

Programming
Debug
Serial Monitor

因此我們通常不優先拿它接 GPS。

未來使用:

GPS
RS485
Arduino
Serial Sensor

時,可以使用其他 UART。

例如常見教學會把 UART2 配置到:

RX → GPIO16
TX → GPIO17

但仍必須確認使用的 ESP32 模組是否有 PSRAM 占用這兩支腳。

三十八、什麼是 GPIO Matrix?

GPIO Matrix 是 ESP32 很重要的硬體特色。

一般微控制器可能:

UART TX
只能在固定 Pin

ESP32 很多 Digital Peripheral 則可以:

Peripheral
    │
GPIO Matrix
    │
    ↓
Selected GPIO

例如:

UART
SPI
I2C
PWM

很多訊號都具有重新 Mapping 的彈性。Espressif 官方也指出,多數 Digital Peripheral 可透過 GPIO Matrix 連到可使用的 Pin。

這就是 ESP32 比 Arduino UNO 更彈性的地方之一。

三十九、ESP32 GPIO 並不是什麼都可以亂 Mapping

雖然 ESP32 GPIO Matrix 很強,但是:

不等於任何功能都可以無限制放在任何腳位。

例如:

ADC
DAC
Touch
RTC
Flash
PSRAM
Strapping

仍然存在硬體限制。

所以正確觀念應該是:

ESP32 GPIO 很有彈性

而不是:

所有 Pin 完全一樣

四十、ESP32 Input + Output 綜合實作

接下來建立一個最基本的人機控制:

Button
   │
   ↓
ESP32
   │
   ↓
 LED

功能:

按下 Button
→ LED ON

放開 Button
→ LED OFF

四十一、材料

  • ESP32 × 1
  • LED × 1
  • 220Ω~330Ω × 1
  • 按鍵 × 1
  • Breadboard × 1
  • Jumper Wire

GPIO 規劃:

LED
→ GPIO23

Button
→ GPIO27

這兩支很適合做基本 GPIO 教學。

四十二、接線

LED

GPIO23
  │
220Ω
  │
LED
  │
GND

Button

GPIO27
  │
Button
  │
GND

程式使用:

INPUT_PULLUP

四十三、完整程式

const int LED_PIN = 23;
const int BUTTON_PIN = 27;

void setup()
{
  Serial.begin(115200);

  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  digitalWrite(LED_PIN, LOW);

  Serial.println();
  Serial.println("==========================");
  Serial.println("ESP32 GPIO Input/Output");
  Serial.println("==========================");
}

void loop()
{
  int buttonState = digitalRead(BUTTON_PIN);

  if (buttonState == LOW)
  {
    digitalWrite(LED_PIN, HIGH);

    Serial.println("Button Pressed - LED ON");
  }
  else
  {
    digitalWrite(LED_PIN, LOW);

    Serial.println("Button Released - LED OFF");
  }

  delay(100);
}

四十四、程式執行流程

ESP32 Power ON
      ↓
setup()
      ↓
GPIO23 = OUTPUT
GPIO27 = INPUT_PULLUP
      ↓
loop()
      ↓
Read GPIO27
      ↓
  Is LOW?
   /   \
 YES   NO
  │     │
LED ON LED OFF
  │     │
  └──→ Repeat

四十五、為什麼按下按鍵是 LOW?

因為:

pinMode(BUTTON_PIN, INPUT_PULLUP);

ESP32 內部將 GPIO 拉到 High。

按鍵未按:

3.3V
 │
Pull-up
 │
GPIO27

所以:

HIGH

按鍵按下:

GPIO27
 │
Button
 │
GND

因此:

LOW

這種接法在實際微控制器專案中非常常見。

四十六、為什麼按鍵可能一次跳很多次?

真實機械按鍵並不是:

LOW → HIGH

瞬間完美切換。

實際可能:

LOW
HIGH
LOW
HIGH
LOW
HIGH

幾毫秒後才穩定。

這稱為:

Contact Bounce

也就是:

按鍵彈跳

未來我們會進一步使用:

Debounce

解決。

四十七、ESP32 GPIO 可以控制 Relay 嗎?

可以控制 Relay Module 的控制輸入,但是:

不要直接用 GPIO 驅動 Relay Coil。

正確結構通常是:

ESP32
 GPIO
   │
   ↓
Relay Module
   │
Driver Circuit
   │
Relay

如果是裸 Relay:

ESP32 GPIO
    │
    ↓
Transistor / MOSFET
    │
    ↓
Relay Coil

還要考慮:

Flyback Diode

不能讓 ESP32 GPIO 直接承受線圈電流。

四十八、ESP32 GPIO 可以直接推 Servo 嗎?

Servo 的:

Signal

可以由 ESP32 GPIO 控制。

但 Servo 電源:

VCC

通常不建議直接由 ESP32 3.3V Pin 供應。

比較正確:

External 5V Supply
   │
   ├── Servo VCC
   │
   └── ESP32 GND 共地

ESP32:

GPIO → Servo Signal

四十九、ESP32 GPIO 可以接 5V Sensor 嗎?

要看:

Sensor Output

到底是多少伏特。

例如某些 Sensor:

VCC = 5V

並不代表:

Signal = 5V

必須查 Datasheet。

如果 Signal 真的是:

5V Logic

則不要直接送入 ESP32 GPIO。

可使用:

Voltage Divider

或:

Level Shifter

五十、ESP32 GPIO 最常見的 10 個錯誤

錯誤 1:把 GPIO 當 5V

錯。

ESP32 GPIO 是 3.3V 邏輯。

錯誤 2:GPIO34 接 LED

GPIO34 屬於:

Input Only

不能拿來當 LED Output。

錯誤 3:GPIO34 使用 INPUT_PULLUP

GPIO34~GPIO39 沒有軟體可啟用的內部 Pull-up / Pull-down。

應該外接電阻。

錯誤 4:GPIO6 接 Sensor

GPIO6~GPIO11 通常已供 Flash 使用。

不要使用。

錯誤 5:亂用 GPIO0

可能影響:

BOOT

與:

Download Mode

錯誤 6:UART 裝置直接占用 GPIO1、GPIO3

可能影響:

Upload
Serial Monitor
Debug

錯誤 7:看到 Pinout 有 GPIO 就認為一定能用

要先確認:

Input-only?
Flash?
PSRAM?
Strapping?
UART?

錯誤 8:不同 ESP32 Board 使用同一張 Pinout

ESP32-S3:

≠

ESP32-C3:

≠

ESP32-WROOM-32。

錯誤 9:GPIO 直接驅動大電流負載

例如:

Motor
Relay Coil
High-power LED

都不應直接由 GPIO 供電。

錯誤 10:忽略共地

例如:

ESP32
+
External 5V Supply
+
Servo

如果沒有建立正確:

Common GND

訊號可能無法正常工作。

五十一、ESP32 GPIO Debug 建議流程

發現 GPIO 沒反應時,不要立刻懷疑板子壞掉。

按照:

Step 1
確認 GPIO Number
      ↓
Step 2
確認 pinMode()
      ↓
Step 3
確認 Input / Output
      ↓
Step 4
確認是不是 GPIO34~39
      ↓
Step 5
確認是不是 GPIO6~11
      ↓
Step 6
確認是不是 Strapping Pin
      ↓
Step 7
確認 3.3V / 5V
      ↓
Step 8
確認 GND
      ↓
Step 9
Serial Monitor Debug

這會比直接更換 ESP32 有效率很多。

五十二、建立 GPIO 測試程式

例如要確認 GPIO23 是否正常:

const int TEST_PIN = 23;

void setup()
{
  Serial.begin(115200);

  pinMode(TEST_PIN, OUTPUT);

  Serial.println("GPIO Test Start");
}

void loop()
{
  Serial.println("GPIO HIGH");

  digitalWrite(TEST_PIN, HIGH);

  delay(2000);

  Serial.println("GPIO LOW");

  digitalWrite(TEST_PIN, LOW);

  delay(2000);
}

用:

  • LED
  • Multimeter
  • Logic Analyzer
  • Oscilloscope

都可以驗證。

五十三、ESP32 GPIO 與 Arduino UNO 有什麼不同?

Arduino UNO R3 與經典 ESP32 GPIO 比較
項目 Arduino UNO R3 經典 ESP32
Logic 5V 3.3V
GPIO 較少 更多
GPIO Matrix 無相同架構 有
Input-only GPIO 一般教學較單純 GPIO34~39
Strapping Pin 使用體驗較單純 有
Wi-Fi 無 有
Bluetooth 無 有
ADC 有 有
DAC 無 部分 GPIO 支援
Touch 無 有
UART 較少 多組
GPIO 規劃難度 低 較高

ESP32 功能更多,但是:

功能越多
=
GPIO 規劃越重要

五十四、ESP32 GPIO 使用建議速查表

如果目前只是初學,可以先使用:

優先使用

GPIO4
GPIO13
GPIO14
GPIO18
GPIO19
GPIO21
GPIO22
GPIO23
GPIO25
GPIO26
GPIO27
GPIO32
GPIO33

Input Only

GPIO34
GPIO35
GPIO36
GPIO37
GPIO38
GPIO39

初學先避開

GPIO0
GPIO2
GPIO5
GPIO12
GPIO15

因為:

Strapping

不要一般使用

GPIO6
GPIO7
GPIO8
GPIO9
GPIO10
GPIO11

因為典型模組用於:

Flash

優先保留

GPIO1
GPIO3

給:

UART0 / USB Serial

這套分類主要是讓 ESP32 初學者降低出錯機率,不應取代實際模組 Datasheet 與開發板 Schematic。

五十五、GPIO 規劃範例

假設未來要建立:

ESP32 智慧環境控制器

使用:

DHT22
OLED
Button
Relay
Buzzer

可以規劃:

DHT22
→ GPIO27

OLED SDA
→ GPIO21

OLED SCL
→ GPIO22

Button
→ GPIO32

Relay
→ GPIO25

Buzzer
→ GPIO26

這樣:

GPIO6~11
→ 沒碰

GPIO0/2/5/12/15
→ 避開

GPIO1/3
→ 保留 Serial

整個專案會比較容易除錯。

五十六、另一個 GPIO 規劃範例

ESP32:

DHT22
+
LCD1602 I2C
+
Relay
+
Button

可以:

ESP32 智慧環境控制器 GPIO 規劃範例
Device ESP32
DHT22 DATA GPIO27
LCD SDA GPIO21
LCD SCL GPIO22
Relay IN GPIO25
Button GPIO32

這樣就是很適合後續 IoT 教學的基礎配置。

五十七、GPIO 選擇的工程思維

不要每次寫程式才想:

「還有哪個 Pin 空著?」

更好的方式是專題開始前先建立:

Pin Assignment Table

例如:

ESP32 Pin Assignment Table
Function GPIO Direction Notes
DHT22 27 I/O Sensor
Button 32 Input Pull-up
Relay 25 Output Active LOW
Buzzer 26 Output PWM
SDA 21 I/O I²C
SCL 22 Output I²C
UART RX 16 Input GPS
UART TX 17 Output GPS

這就是從:

Maker 實驗

進一步走向:

工程設計

非常重要的一步。

五十八、ESP32 不同系列不能直接套同一張 GPIO 表

這點一定要建立觀念。

ESP32 家族目前具有多種不同系列。

例如:

ESP32
ESP32-S2
ESP32-S3
ESP32-C3
ESP32-C6
...

它們的:

GPIO 數量
Strapping Pin
USB
Flash
JTAG
ADC
Touch

都可能不同。

例如 ESP32-S2 官方資料的 Strapping Pin 就與經典 ESP32 不同,因此不能直接照搬 ESP32-WROOM-32 的 GPIO 表。

所以本章看到:

GPIO34~39 Input Only
GPIO0/2/5/12/15 Strapping

是針對:

經典 ESP32

而不是整個 ESP32 家族所有型號。

五十九、本章實作成果

完成本章後,你已經學會:

GPIO Output

ESP32
 ↓
LED

GPIO Input

Button
 ↓
ESP32

GPIO Input + Output

Button
 ↓
ESP32
 ↓
LED

並了解:

INPUT
OUTPUT
INPUT_PULLUP

pinMode()
digitalWrite()
digitalRead()

以及 ESP32 最重要的特殊 GPIO。

六十、FAQ:ESP32 GPIO 常見問題

Q1:ESP32 所有 GPIO 都可以當 Output 嗎?

不可以。

經典 ESP32 的:

GPIO34~GPIO39

只能作為 Input,而且沒有 Output Driver。

Q2:GPIO34 可以接按鍵嗎?

可以。

但是 GPIO34~GPIO39 沒有內部 Pull-up / Pull-down,因此如果電路需要固定預設電位,要外接:

10kΩ

等 Pull-up 或 Pull-down 電阻。

Q3:GPIO34 可以接 LED 嗎?

不適合作為 LED Output。

因為它:

Input Only

Q4:ESP32 哪些 GPIO 不要用?

一般 ESP32-WROOM-32 教學最需要避開的是:

GPIO6~GPIO11

因為它們通常用於 SPI Flash。

Q5:GPIO0 可以使用嗎?

可以。

但是:

GPIO0

是 Strapping Pin,而且與 Boot / Download Mode 有關,所以初學者如果有其他 GPIO 可選,不建議優先使用。

Q6:GPIO2 可以使用嗎?

可以,但是 GPIO2 是經典 ESP32 的 Strapping Pin,因此外部電路不能在 Boot 時造成不適當電位。

Q7:GPIO21 與 GPIO22 一定只能做 I²C 嗎?

不是。

它們是 Arduino ESP32 非常常見的:

SDA = GPIO21
SCL = GPIO22

配置,但是 ESP32 GPIO Matrix 具有很高的訊號配置彈性。

Q8:GPIO1、GPIO3 可以接 Sensor 嗎?

技術上視設計而定,但一般開發階段不建議優先使用。

因為常見 ESP32 開發板會將它們作為:

UART0
TX / RX

與 Upload、Serial Monitor 有關。

Q9:GPIO16、GPIO17 可以用嗎?

如果是沒有 PSRAM 的一般 ESP32-WROOM-32 類型模組,通常可以。

但部分 ESP32-WROVER / PSRAM 模組可能使用 GPIO16、GPIO17,因此必須先確認實際模組。

Q10:ESP32 可以直接接 5V Output Sensor 嗎?

不要把 ESP32 GPIO 當成 5V Logic Input 使用。

如果 Sensor 輸出為 5V,應考慮:

Voltage Divider

或:

Level Shifter

六十一、本章總結

ESP32 GPIO 程式本身並不困難。

最基本只有:

pinMode();
digitalWrite();
digitalRead();

但真正重要的是:

選對 GPIO。

經典 ESP32 最值得記住的四組腳位是:

GPIO34~GPIO39
=
Input Only

官方資料也指出它們沒有軟體可啟用的內部 Pull-up / Pull-down。

第二組:

GPIO0
GPIO2
GPIO5
GPIO12
GPIO15
=
Strapping Pins

這些 GPIO 會涉及開機設定,因此使用時需要注意外部電路在 Reset / Boot 階段產生的電位。

第三組:

GPIO6~GPIO11
=
SPI Flash

一般 ESP32-WROOM-32 教學不要使用。

第四組:

GPIO1
GPIO3
=
UART0

初期建議保留給:

Programming
Serial Monitor
Debug

因此 ESP32 初學者可以先優先使用:

GPIO4
GPIO13
GPIO14
GPIO18
GPIO19
GPIO21
GPIO22
GPIO23
GPIO25
GPIO26
GPIO27
GPIO32
GPIO33

再隨著後續學習:

ADC
PWM
I2C
SPI
UART
Wi-Fi

逐步重新安排 GPIO。

六十二、ESP32 GPIO 快速記憶圖

ESP32 GPIO
                 │
        ┌────────┴────────┐
        │                 │
     一般 GPIO          特殊 GPIO
        │                 │
        │      ┌──────────┼───────────┐
        │      │          │           │
        │   Input Only  Strapping    Flash
        │      │          │           │
        │    34~39     0,2,5,      6~11
        │               12,15
        │
        ├── 21 / 22 → 常用 I2C
        │
        ├── 18 / 19 / 23 → 常用 SPI
        │
        ├── 1 / 3 → UART0
        │
        └── 25 / 26 / 27 / 32 / 33
              常用一般 GPIO

這張觀念圖如果記住,大部分 ESP32 GPIO 問題都可以先避開。

六十三、下一章

完成 GPIO 基礎之後,下一章就可以進一步處理真正的 Digital Input:

第 4 章 ESP32 數位輸入完整教學:按鍵、Pull-up、Pull-down 與 Debounce

下一章會深入介紹:

Digital Input
      ↓
Button
      ↓
Floating
      ↓
Pull-up
      ↓
Pull-down
      ↓
INPUT_PULLUP
      ↓
Contact Bounce
      ↓
Debounce
      ↓
millis()
      ↓
短按 / 長按
      ↓
LED / Relay Control

並建立:

Button
   │
   ↓
ESP32
   │
   ├── LED
   └── Relay

真正可用在後續專題的人機輸入控制方式。

下一步學習

不要停在這一篇,接著把內容做成自己的實作

目前主題:ESP32 / IoT。從完整學習路線、免費資源、會員下載,再接到實作所需材料。

同系列:ESP32 |  已是會員?直接前往 Getfile
相關資源與會員文章下載
文章可免費閱讀;下載完整 DOCX 或 PDF 需登入免費基本會員。
查看相關資源 會員免費下載 DOCX 會員免費 PDF/列印

← 回文章列表