「模組設計習慣」是指在開發 MCU 或嵌入式系統時,將你的設計分為可重用、可維護、可擴展的單元(模組),不只是把程式寫對,更是把系統設計好。
這種習慣會讓你從「寫功能」的階段,進化到「搭積木」的高手。
🧱 什麼是模組?
模組可以是:
| 類型 | 範例 | 功能 |
|---|---|---|
| 硬體模組 | OLED 顯示模組、DHT22、MP3 播放器 | 提供具體輸入或輸出能力 |
| 軟體模組 | UART 控制、WiFi 網頁伺服器 | 封裝某一類功能的程式代碼 |
| 系統模組 | 音訊系統、感測系統、通訊系統 | 整合數個硬體與軟體模組的組件 |
🔧 好的模組設計習慣具備:
1. 功能分離
- 把顯示、感測、通訊、控制分成獨立檔案與邏輯區塊。
- 例:
oled.c,wifi_server.c,sensor_temp.c
2. 介面清晰
- 模組提供標準函式如:
cCopyEditvoid oled_init();
void oled_print(const char* str);
float read_temperature();
- 不對外暴露內部細節。
3. 可重用性
- 一次寫好就能搬到下一個專案。
- 例:UART 傳輸、SD 卡讀寫、JSON 解析等模組能跨專案使用。
4. 不互相耦合
oled.c不應該直接呼叫wifi_server.c,而是透過主程序中樞協調。
5. 初始化統一化
- 每個模組都提供
init(),統一在main()中初始化:
cCopyEditvoid setup() {
uart_init();
oled_init();
sensor_init();
}
🧠 範例:用 ESP32 做個智慧溫濕度顯示器
你的模組可能是這樣:
bashCopyEditproject/
├── main.c ← 主流程
├── wifi_server.c/h ← 建立網頁伺服器
├── dht22_sensor.c/h ← 溫濕度感測
├── oled_display.c/h ← 顯示數據
├── web_ui/ ← HTML 與 JS 檔案
└── utils.c/h ← 共用工具(字串處理等)
這時你會發現:
main.c像是調度中心(main loop),其他模組都自己完成初始化與任務。- 未來只要換成不同感測器,只需要換掉
dht22_sensor.c,其他都能重用。
✅ 為什麼這習慣重要?
| 傳統寫法 | 模組化寫法 |
|---|---|
| 所有程式塞一個檔案 | 每個功能拆成一個檔案 |
| 拿來一個範例就直接修改 | 建立可重用模組 |
| 修改時可能影響整個系統 | 模組間獨立,修改風險小 |
| 不易除錯、無法擴展 | 清楚架構、容易維護與升級 |
✨ 建立模組習慣的起點
建議從你的下一個 MCU 專案開始:
- 用
.h/.c分離功能 - 每個模組有
init()和一兩個對外函式 - 測試每個模組獨立功能是否能工作
- 用 main loop 統一調度