(ESP32-S3)LED 閃爍

ESP32-S3 入門教學 - 第一個專案:LED 閃爍

🚀 ESP32-S3 入門教學

第一個專案:LED 閃爍

📅 教學目標:

  • 了解 ESP32-S3 基本結構
  • 學會建立 ESP-IDF 專案
  • 完成第一個 LED 閃爍程式

💡 前置準備:ESP32-S3 開發板、USB 傳輸線、ESP-IDF 開發環境

1 / 12

🔧 ESP32-S3 硬體介紹

晶片規格

項目 規格
處理器 Xtensa LX7 雙核心, 240 MHz
Wi-Fi 802.11 b/g/n (2.4 GHz)
藍牙 BLE 5.0
GPIO 最多 44 個
SRAM 512 KB
Flash 可達 16 MB

💡 GPIO 2 通常連接到板載 LED,是學習 GPIO 控制最好的起點!

3 / 12

⚙️ ESP-IDF 開發環境

什麼是 ESP-IDF?

ESP-IDF (Espressif IoT Development Framework) 是 Espressif 官方提供的開發框架,包含:

  • 編譯工具鏈 (GCC, GDB)
  • ESP-IDF API - 訪問硬體功能
  • 範例程式碼
  • 燒錄與除錯工具

環境安裝選項

方式 優點 適用場景
手動安裝 完全控制 進階用戶
VS Code 擴展 圖形化、方便 初學者推薦
Docker 環境隔離 跨平台開發
4 / 12

📁 專案資料夾結構

esp-idf_project/ ├── CMakeLists.txt # CMake 設定檔 ├── sdkconfig # SDK 設定(晶片選擇等) ├── main/ │ ├── CMakeLists.txt # 主程式 CMake 設定 │ └── main.c # 你的程式碼在這裡! └── build/ # 編譯產出的資料夾(自動生成)

🔑 重點:

  • main.c - 程式的入口點,從這裡開始學習
  • sdkconfig - 晶片與功能設定,不需要手動修改
  • build/ - 編譯後自動產生,不要手動編輯
5 / 12

💻 主要程式碼解析

完整的 LED 閃爍程式

/* LED Blink Example - Random Nerd Tutorials */ #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "sdkconfig.h" // 定義 LED 連接的 GPIO 腳位 #define BLINK_GPIO 2 void app_main(void) { // 設定 GPIO 腳位 gpio_reset_pin(BLINK_GPIO); gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); // 無限迴圈:LED 閃爍 while (1) { printf("LED ON\n"); gpio_set_level(BLINK_GPIO, 1); // 開 vTaskDelay(1000 / portTICK_PERIOD_MS); printf("LED OFF\n"); gpio_set_level(BLINK_GPIO, 0); // 關 vTaskDelay(1000 / portTICK_PERIOD_MS); } }
6 / 12

🔌 GPIO 控制原理

三個關鍵函數

// 1. 重置 GPIO 腳位(安全初始化) gpio_reset_pin(BLINK_GPIO); // 2. 設定腳位方向:輸出模式 gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); // 3. 設定腳位電平:高電位(1) 或 低電位(0) gpio_set_level(BLINK_GPIO, 1); // LED 亮 gpio_set_level(BLINK_GPIO, 0); // LED 滅

💡 GPIO 輸出原理:

  • GPIO 2 連接到 LED 的陰極 (K)
  • GPIO 輸出 高電位 (1) → LED 兩端無電壓差 → 不亮
  • GPIO 輸出 低電位 (0) → LED 有電壓差 → 亮

⚠️ 大多數 ESP32-S3 開發板的板載 LED 是「低電位點亮」設計

7 / 12

⏱️ FreeRTOS 延時函數

精確的延時控制

// vTaskDelay 使用方式 // 參數: ticks 數量,不是毫秒! // portTICK_PERIOD_MS 是每個 tick 的毫秒數 // 通常是 1ms(1000 Hz) // 延時 1000 毫秒 = 1 秒 vTaskDelay(1000 / portTICK_PERIOD_MS); // 延時 500 毫秒 = 0.5 秒 vTaskDelay(500 / portTICK_PERIOD_MS); // 延時 100 毫秒 = 0.1 秒 vTaskDelay(100 / portTICK_PERIOD_MS);

📊 常用延時對照表:

延時時間程式碼
0.5 秒vTaskDelay(500 / portTICK_PERIOD_MS)
1 秒vTaskDelay(1000 / portTICK_PERIOD_MS)
2 秒vTaskDelay(2000 / portTICK_PERIOD_MS)
5 秒vTaskDelay(5000 / portTICK_PERIOD_MS)
8 / 12

🔨 編譯與燒錄

指令步驟

# 1. 設定目標晶片為 ESP32-S3 idf.py set-target esp32s3 # 2. 編譯專案 idf.py build # 3. 燒錄到開發板(自動偵測 COM 埠) idf.py flash # 4. 開啟序列埠監視器查看輸出 idf.py monitor # 或者一鍵完成:燒錄 + 監視 idf.py flash monitor

💡 提示:燒錄時請按住 BOOT 按鈕,然後按一下 RESET 按鍵進入下載模式

⚠️ 常見問題:如果燒錄失敗,檢查:

  • USB 傳輸線是否支援資料傳輸(非僅充電)
  • 驅動程式是否正確安裝
  • COM 埠號是否正確
9 / 12

✅ 疑難排解

常見問題與解決方案

問題 可能原因 解決方案
編譯錯誤 sdkconfig 設定錯誤 刪除 build 資料夾,重新 set-target
無法燒錄 未進入下載模式 按住 BOOT + 按 RESET
找不到 COM 埠 驅動未安裝/USB 線問題 安裝 CH340/CP2102 驅動
LED 不亮 GPIO 腳位錯誤 確認開發板電路圖,確認 LED 極性
monitor 無輸出 波特率不正確 確認設定為 115200

🔧 除錯技巧:使用 idf.py monitor 查看序列埠輸出,通常會顯示錯誤訊息

10 / 12

📚 延伸學習資源

推薦學習路徑

🎯 下一步挑戰:

  1. 按鈕控制 LED - 使用 GPIO 輸入,偵測按鈕按壓
  2. PWM 呼吸燈 - 使用 ledc 模組,實現漸明漸暗效果
  3. 序列通訊 - 透過 UART 與電腦通訊
  4. Wi-Fi 連線 - 讓 ESP32-S3 連上網路

優質學習資源

  • 📖 Random Nerd Tutorials - https://RandomNerdTutorials.com/
  • 📖 ESP-IDF 官方文檔 - https://docs.espressif.com/
  • 📖 ESP32 (ESP-IDF) 電子書 - RandomNerdTutorials.com/esp-idf-esp32-ebook/

💡 建議:跟著範例一步步做,修改參數觀察變化,是最好的學習方式!

11 / 12

🎉 恭喜完成!

💡✨🔌

您已經學會了:

  • ✅ ESP32-S3 基本架構
  • ✅ ESP-IDF 專案結構
  • ✅ GPIO 控制 LED
  • ✅ FreeRTOS 延時函數
  • ✅ 編譯、燒錄、監視流程

🚀 繼續探索,享受嵌入式開發的樂趣!

12 / 12

留言

這個網誌中的熱門文章

秤重感測器-HX711-ESP32

webserver控制伺服馬達-ESP32

ESP32-DC直流馬達測試