Table of Contents
Toggle前言:為什麼要學 ESP32 程式模組化?
在寫 ESP32 程式時,如果一開始就把所有程式碼都塞在 setup() 與 loop() 中,很快就會變得難以閱讀、難以維護。模組化就像整理房間,把不同功能放進不同抽屜,找起來更快,也更容易擴充。
ESP32 簡介與開發環境設定
什麼是 ESP32?
ESP32 是一顆集成 Wi-Fi 與藍牙功能的微控制器,性能比 Arduino UNO 更強大,非常適合物聯網專案。
常見開發環境 (Arduino IDE / PlatformIO)
多數新手會先從 Arduino IDE 開始,因為介面簡單。進階用戶可用 PlatformIO 管理多專案與套件。
安裝與基本設定步驟
在 Arduino IDE 安裝 ESP32 開發板支援,選擇正確的開發板與序列埠,即可開始撰寫程式。
程式模組化的概念與好處
什麼是模組化程式碼?
模組化就是把重複或特定功能的程式片段抽出成「函式」或「模組檔案」,讓程式更清楚、更可重用。
模組化在專案管理的優勢
- 程式碼更易讀
- 降低錯誤率
- 減少重複撰寫
- 方便團隊合作
為何新手應從簡單範例練習?
從攝氏轉華氏這種簡單邏輯入手,就能練習函式設計與模組化,先熟悉語法,再拓展到感測器或網路應用。
實作教學:攝氏與華氏溫度轉換範例
問題說明:為何需要溫度轉換?
有些感測器回傳攝氏,有些回傳華氏;如果你要顯示或上傳雲端,常常需要轉換單位。
傳統寫法:單一檔案的程式碼
void setup() {
Serial.begin(115200);
}
void loop() {
float celsius = 25.0;
float fahrenheit = celsius * 9.0 / 5.0 + 32.0;
Serial.println(fahrenheit);
delay(1000);
}
這樣寫雖然可行,但如果專案很大就不好維護。
進階寫法:用函式封裝轉換邏輯
// 宣告函式
float celsiusToFahrenheit(float celsius);
float fahrenheitToCelsius(float fahrenheit);
void setup() {
Serial.begin(115200);
float tempC = 30.0;
float tempF = celsiusToFahrenheit(tempC);
Serial.print("攝氏 ");
Serial.print(tempC);
Serial.print("°C = 華氏 ");
Serial.println(tempF);
float backToC = fahrenheitToCelsius(tempF);
Serial.print("華氏 ");
Serial.print(tempF);
Serial.print("°F = 攝氏 ");
Serial.println(backToC);
}
void loop() {
}
// 定義函式
float celsiusToFahrenheit(float celsius) {
return (celsius * 9.0 / 5.0) + 32.0;
}
float fahrenheitToCelsius(float fahrenheit) {
return (fahrenheit - 32.0) * 5.0 / 9.0;
}
你應該會在”序列埠視窗”看到:
攝氏 30.00°C = 華氏 86.00°F
華氏 86.00°F = 攝氏 30.00°C
建立自己的函式庫
在 Arduino IDE 專案資料夾裡新建兩個檔案:
- TemperatureConverter.h
- TemperatureConverter.cpp
1. TemperatureConverter.h
在右上角點擊”…”,選擇”新索引標籤”,名稱填上”TemperatureConverter.h”,就會多一標籤來,建上.h(標頭檔)裡宣告


#ifndef TEMPERATURE_CONVERTER_H
#define TEMPERATURE_CONVERTER_H
float celsiusToFahrenheit(float celsius);
float fahrenheitToCelsius(float fahrenheit);
#endif
2. TemperatureConverter.cpp
在 .cpp (實作檔) 裡定義

#include "TemperatureConverter.h"
float celsiusToFahrenheit(float celsius) {
return (celsius * 9.0 / 5.0) + 32.0;
}
float fahrenheitToCelsius(float fahrenheit) {
return (fahrenheit - 32.0) * 5.0 / 9.0;
}
3. 在 .ino 主程式中引用:

#include
#include "TemperatureConverter.h"
void setup() {
Serial.begin(115200);
float c = 20.0;
float f = celsiusToFahrenheit(c);
Serial.println(f);
float back = fahrenheitToCelsius(f);
Serial.println(back);
}
void loop() {
}
重點:
- 宣告 (declaration) 可以放在程式最前面,告訴 Arduino 這個函式存在。
- 定義 (definition) 寫在程式後面,內容怎麼算。
- float celsiusToFahrenheit(float celsius)
- float = 傳回值型態
- celsiusToFahrenheit = 函式名稱
- (float celsius) = 參數 (輸入值)
除錯與最佳化技巧
常見錯誤與解決方式
- No such file or directory → 檢查檔案是否放在正確資料夾
- multiple definition → 確認函式沒有重複定義
如何測試與驗證函式結果
利用 Serial.print 或單元測試,輸出多組測試數據比對。
模組化延伸應用
把溫度轉換拓展到感測器讀值
例如從 DHT11 或 DS18B20 讀取攝氏值,再用函式轉換華氏。
結合 WiFi 傳輸溫度數據
用 ESP32 WiFi 上傳到雲端(如 Blynk、Thingspeak),程式架構依然清晰。
總結:養成良好的程式架構習慣
從簡單範例開始練習函式封裝與模組化,可以讓未來專案更穩定、更容易擴充。ESP32 功能強大,如果搭配良好的程式架構,就能像搭積木一樣快速組合專案。
常見問題 FAQs
Q1:模組化與物件導向有何不同?
A:模組化偏重程式分檔,物件導向則是設計類別與物件,兩者可搭配使用。
Q2:ESP32 的函式庫要放在哪裡?
A:可放在 Arduino IDE 的 libraries 資料夾,或專案同層資料夾。
Q3:要不要一開始就學 C++ 類別?
A:新手可先從函式開始,再慢慢學類別,避免一次太多負擔。
Q4:PlatformIO 與 Arduino IDE 差異?
A:PlatformIO 更適合多專案管理與進階用戶,Arduino IDE 適合初學快速上手。
Q5:模組化會不會讓程式變慢?
A:不會。模組化只是分檔與函式呼叫,不會顯著影響效能。
