1) Chip ESP32 WROOM
ESP32 là một vi điều khiển mạnh mẽ, được sử dụng rộng rãi trong các ứng dụng IoT, nhúng và tự động hóa nhờ tích hợp sẵn WiFi, Bluetooth và nhiều ngoại vi. Một trong những ưu điểm nổi bật của ESP32 là hệ thống GPIO linh hoạt, cho phép mỗi chân đảm nhiệm nhiều chức năng khác nhau tùy theo cấu hình.
Chip ESP32 có tổng cộng 48 chân, mỗi chân có thể đảm nhiệm nhiều chức năng khác nhau. Tuy nhiên, không phải tất cả chân đều được đưa ra ngoài trên các board phát triển ESP32, và một số chân không thể sử dụng trong dự án.
Có rất nhiều câu hỏi liên quan đến cách sử dụng GPIO của ESP32:
Bạn nên dùng chân nào? Bạn nên tránh những chân nào trong dự án?
Bài viết này nhằm cung cấp một tài liệu tham khảo đơn giản và dễ hiểu về GPIO của ESP32.
Hình dưới đây minh họa sơ đồ chân ESP-WROOM-32. Bạn có thể dùng nó làm tài liệu tham chiếu nếu bạn đang sử dụng chip ESP32 dạng module để tự thiết kế một bo mạch riêng.

2) Ngoại vi chip ESP32
Các ngoại vi (peripherals) của ESP32 bao gồm:
- 18 kênh ADC (bộ chuyển đổi tương tự sang số)
- 3 giao diện SPI
- 3 giao diện UART
- 2 giao diện I2C
- 16 kênh xuất PWM
- 2 DAC (bộ chuyển đổi số sang tương tự)
- 2 giao diện I2S
- 10 GPIO cảm ứng điện dung (capacitive sensing)
Các chức năng ADC và DAC được gán cố định vào một số chân nhất định. Tuy nhiên, bạn có thể tự chọn chân cho các chức năng như UART, I2C, SPI, PWM… bằng cách gán trong code.
Điều này thực hiện được nhờ tính năng multiplexing của chip ESP32.
Mặc dù bạn có thể tự cấu hình chức năng chân bằng phần mềm, nhưng vẫn có một số chân được gán mặc định như minh họa trong hình dưới đây (đây là ví dụ dành cho bo ESP32 DEVKIT V1 DOIT loại 36 chân — vị trí chân có thể thay đổi tùy nhà sản xuất).

Ngoài ra, một số chân có đặc tính đặc biệt, khiến chúng phù hợp hoặc không phù hợp cho một số loại dự án nhất định.
Bảng dưới đây cho biết chân nào nên dùng làm input, output và chân nào cần thận trọng


🟦 Các chân chỉ dùng để Input
GPIO 34, 35, 36, 39
- Chỉ hỗ trợ input
- Không có pull-up / pull-down nội bộ
- Không thể dùng làm output
🟥 Các chân nối với SPI Flash (KHÔNG nên dùng)
GPIO 6, 7, 8, 9, 10, 11
- Kết nối trực tiếp đến SPI Flash tích hợp
- Dùng chúng có thể gây lỗi boot hoặc treo chip
🟩 Các chân cảm ứng điện dung (Touch)
Dùng để tạo nút cảm ứng, có thể đánh thức chip từ Deep Sleep
- T0 – GPIO 4
- T1 – GPIO 0
- T2 – GPIO 2
- T3 – GPIO 15
- T4 – GPIO 13
- T5 – GPIO 12
- T6 – GPIO 14
- T7 – GPIO 27
- T8 – GPIO 33
- T9 – GPIO 32
🟨 ADC (Bộ chuyển đổi Analog → Digital)
- ESP32 có 18 kênh ADC độ phân giải 12-bit (0–4095 tương ứng 0–3.3V)
- ADC1:
- CH0 – GPIO 36
- CH1 – GPIO 37 (không xuất chân ra DevKit)
- CH2 – GPIO 38 (không xuất chân ra DevKit)
- CH3 – GPIO 39
- CH4 – GPIO 32
- CH5 – GPIO 33
- CH6 – GPIO 34
- CH7 – GPIO 35
- ADC2:
- CH0 – GPIO 4
- CH1 – GPIO 0
- CH2 – GPIO 2
- CH3 – GPIO 15
- CH4 – GPIO 13
- CH5 – GPIO 12
- CH6 – GPIO 14
- CH7 – GPIO 27
- CH8 – GPIO 25
- CH9 – GPIO 26
⚠️ Lưu ý
- Giá trị ADC không hoàn toàn tuyến tính → đọc thực tế có thể sai lệch nhỏ, ví dụ 0–0.1V hoặc 3.2–3.3V
- Có thể điều chỉnh dải đo và độ phân giải bằng lập trình
🟧 DAC (Bộ chuyển đổi Digital → Analog)
- ESP32 có 2 kênh DAC 8-bit
- DAC1 → GPIO 25
- DAC2 → GPIO 26
🟩 PWM
- ESP32 có 16 kênh PWM độc lập
- Tất cả các chân xuất tín hiệu đều hỗ trợ PWM (trừ GPIO 34–39 chỉ input)
- Cấu hình khi lập trình: tần số (frequency), chu kỳ nhiệm vụ (duty cycle), kênh PWM, GPIO
🟨 I2C
- ESP32 hỗ trợ 2 kênh I2C
- Có thể gán bất kỳ GPIO nào làm SDA/SCL
- Mặc định trên Arduino IDE:
- GPIO 21 → SDA
- GPIO 22 → SCL
🟪 SPI (Serial Peripheral Interface)
Mapping SPI mặc định:

🟫 UART (Universal Asynchronous Receiver/Transmitter)
- ESP32 hỗ trợ 3 cổng UART: UART0, UART1, UART2
- UART0: dùng upload code & Serial Monitor (có thể dùng giao tiếp khác sau khi upload)
- UART1 & UART2: giao tiếp với thiết bị ngoại vi
Có thể map sang bất kỳ GPIO nào, mặc định:

Lưu ý: để dùng UART1, cần remap sang GPIO khác bằng thư viện HardwareSerial.
⚡ Interrupts
- Tất cả GPIO ESP32 đều có thể cấu hình làm ngắt (interrupt).
⚙️ Strapping Pins
- Quy định chế độ boot → quyết định flash firmware hoặc bootloader
- Các chân Strapping:

Lưu ý: Không gắn module/cảm biến trực tiếp vào các chân này → có thể gây lỗi khi upload code hoặc reset
⚡ Chân tự HIGH hoặc xuất PWM khi boot
GPIO 1, 3, 5, 6–11 (SPI Flash, không dùng), 14, 15
Nếu dùng để điều khiển relay, motor… → có thể bật sai lúc khởi động
🔌 Chân EN (Enable)
- Kích hoạt bộ ổn áp 3.3V
- Kéo xuống GND → ESP32 tắt
- Có thể nối nút nhấn để reset thủ công
🛡️ Dòng tối đa cho GPIO
- Mỗi chân GPIO tối đa chịu 40 mA
- Khuyến nghị dùng ≤ 20–25 mA để an toàn
3) Sản phẩm của team DevIoT

Bo mạch cũng sử dụng chip ESP32, và chọn board trên Arduino IDE cũng là ESP32 DOIT DEVKIT V1


.png&w=3840&q=100)