新手必看!如何用 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 專案資料夾裡新建兩個檔案:

  1. TemperatureConverter.h
  2. TemperatureConverter.cpp

1. TemperatureConverter.h

在右上角點擊”…”,選擇”新索引標籤”,名稱填上”TemperatureConverter.h”,就會多一標籤來,建上.h(標頭檔)裡宣告

新增"新增索引標籤"建立.h & .cpp
新增.h程式
				
					#ifndef TEMPERATURE_CONVERTER_H
#define TEMPERATURE_CONVERTER_H

float celsiusToFahrenheit(float celsius);
float fahrenheitToCelsius(float fahrenheit);

#endif

				
			

2. TemperatureConverter.cpp

在 .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 主程式中引用:

主程式.ino部份
				
					#include <Arduino.h>
#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:不會。模組化只是分檔與函式呼叫,不會顯著影響效能。

參考資料

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

返回頂端