還記得上一篇我們學會了如何用 Wokwi 快速除錯嗎?今天我們要更進一步,讓你的 Arduino 變聰明,不再只是單向接收指令,而是學會與你「對話」!
想像一下,你正在設計一個保險箱,或者一隻機械手臂。如果使用者不小心按錯一個數字,機械手臂就立刻甩動,那多危險啊?所以,真正的產品設計通常會有一個「防呆機制」——也就是在執行動作前,先問你一句:「你確定嗎?」
今天這篇教學,我們就要結合 Keypad(鍵盤)、LCD 螢幕 與 Servo(伺服馬達),在 Wokwi 上打造一個有禮貌、會再次確認的互動控制系統。
Table of Contents
Toggle本次實驗器材(Wokwi 虛擬元件)
在 Wokwi 模擬器中,請點擊「+」號新增以下元件:
- Arduino UNO:你的大腦。
- Keypad (Membrane 4×4):用來輸入角度數字,還有控制確認(C)與取消(B)。
- LCD 1602 (I2C):顯示我們輸入的數字與提示訊息。(記得選 I2C 版本,這樣接線最簡單!)
- Servo (SG90):負責執行轉動動作。
邏輯流程設計:學會「狀態機」概念
寫程式最怕邏輯打結,所以動手寫 code 前,我們先把「劇本」想好。這個系統其實就是一個簡單的「對話」流程:
輸入階段:使用者按數字鍵,螢幕顯示數字。
提交階段:使用者按下 # 鍵(代表 Enter),系統進入「詢問模式」。
確認階段:
螢幕顯示:「Confirm? C=Yes B=No」。
按下 C (Confirm):馬達轉動,任務完成。
按下 B (Back):取消操作,清除數字,重新輸入。
這就是程式設計中常見的**狀態機(State Machine)**概念,我們等等在程式碼中會看到如何實現它。
接線圖重點 (Mental Diagram)
在 Wokwi 中接線非常直觀,重點提示如下:
LCD 16×2 (I2C):
SDA 接 Arduino A4
SCL 接 Arduino A5
VCC 接 5V, GND 接 GND
(小撇步:I2C 只要兩條線就能控制螢幕,省下超多腳位!)
Servo 馬達:
PWM (訊號線) 接 Arduino Pin 10
VCC 與 GND 正常連接。
Keypad 4×4:
它有 8 支腳(4 列 4 行)。我們可以依序接到 Arduino 的 Pin 9 到 Pin 2。
程式碼教學:讓它動起來
這個程式需要用到三個函式庫:Keypad、LiquidCrystal_I2C 和 Servo。Wokwi 的 Library Manager 都可以直接搜尋並新增喔!
以下是完整的範例程式碼,我加上了詳細的中文註解:
#include
#include
#include
#include
/* --- 硬體設定區 --- */
// LCD 設定:位址通常是 0x27,大小 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Servo 設定
Servo myservo;
const int servoPin = 10;
// Keypad 設定
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// 配合 Wokwi 的接線習慣,這裡定義接腳
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
/* --- 變數區 --- */
String inputString = ""; // 儲存使用者輸入的數字字串
bool isConfirming = false; // 狀態標記:現在是不是在「確認中」?
void setup() {
Serial.begin(9600);
// 初始化 Servo
myservo.attach(servoPin);
myservo.write(0); // 歸零
// 初始化 LCD
lcd.init();
lcd.backlight();
// 開機畫面
lcd.setCursor(0, 0);
lcd.print("Servo Controller");
delay(1000);
resetDisplay();
}
void loop() {
char customKey = customKeypad.getKey();
if (customKey) {
// 根據目前的狀態(輸入中 vs 確認中)決定按鍵的功能
if (isConfirming) {
handleConfirmation(customKey);
} else {
handleInput(customKey);
}
}
}
// 處理一般輸入模式
void handleInput(char key) {
// 如果按的是數字 0-9
if (key >= '0' && key <= '9') {
if(inputString.length() < 3) { // 限制最多輸入3位數
inputString += key;
lcd.setCursor(0, 1);
lcd.print("Angle: " + inputString);
}
}
// 如果按下 '#' 代表輸入完畢 (Enter)
else if (key == '#') {
if (inputString.length() > 0) {
int angle = inputString.toInt();
// 簡單的防呆:檢查角度是否在 0~180 之間
if(angle >= 0 && angle <= 180) {
askConfirmation(); // 進入確認模式
} else {
lcd.clear();
lcd.print("Error: 0-180 only");
delay(1500);
resetDisplay();
}
}
}
// 如果按下 'B' 代表 Backspace (刪除)
else if (key == 'B') {
inputString = "";
resetDisplay();
}
}
// 處理確認模式
void handleConfirmation(char key) {
if (key == 'C') {
// 按下 C:執行動作!
int angle = inputString.toInt();
lcd.clear();
lcd.print("Moving to " + String(angle));
myservo.write(angle); // 轉動馬達
delay(1500);
resetDisplay();
}
else if (key == 'B') {
// 按下 B:反悔了,取消
lcd.clear();
lcd.print("Cancelled");
delay(1000);
resetDisplay();
}
}
// 輔助函式:切換到確認畫面
void askConfirmation() {
isConfirming = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Angle: " + inputString);
lcd.setCursor(0, 1);
lcd.print("Confirm? (C/B)");
}
// 輔助函式:重置回輸入畫面
void resetDisplay() {
isConfirming = false;
inputString = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Enter Angle:");
lcd.setCursor(0, 1);
lcd.print("Angle: ");
}
測試你的 Wokwi 機器人
將程式碼貼入 Wokwi 後,按下綠色播放鍵,你可以這樣測試:
正常操作:
在 Keypad 點擊 9 0。
LCD 顯示 “Angle: 90″。
點擊 # (Enter)。
LCD 問你 “Confirm? (C/B)”。
點擊 C -> 看! Servo 馬達轉到 90 度了!
反悔測試:
輸入 1 8 0,按下 #。
系統問你確定嗎?這時候點擊 B。
LCD 顯示 “Cancelled”,馬達紋絲不動,畫面清空讓你重新輸入。這就是我們要的安全機制!
防呆測試:
故意輸入 9 9 9,按下 #。
LCD 會警告你 “Error: 0-180 only”。程式保護了馬達不會接收錯誤指令。
結語
恭喜你!你今天不僅學會了操作三個重要元件,更學會了設計一個**「有人性」的互動介面**。
透過按鍵 C (Confirm) 和 B (Back) 的邏輯切換,你的裝置不再是冷冰冰的機器,而是一個懂得詢問意願的智慧助手。這種「輸入 -> 確認 -> 執行」的邏輯,在未來的專案(例如密碼鎖、澆花系統)都非常實用喔!
趕快去 Wokwi 上試試看,把這套邏輯變成你的技能吧!我們下次見!
Wokwi模擬使用數字鍵,來控制伺服馬達設計分享:https://wokwi.com/projects/450822155947906049
想實作的朋友們,歡迎參考之前文章"【Arduino入門】Arduino設計入門"
