【Wokwi 實戰】會「問問題」的 Arduino 機器人:用 Keypad 與 LCD 打造互動式 Servo 控制系統

還記得上一篇我們學會了如何用 Wokwi 快速除錯嗎?今天我們要更進一步,讓你的 Arduino 變聰明,不再只是單向接收指令,而是學會與你「對話」!

想像一下,你正在設計一個保險箱,或者一隻機械手臂。如果使用者不小心按錯一個數字,機械手臂就立刻甩動,那多危險啊?所以,真正的產品設計通常會有一個「防呆機制」——也就是在執行動作前,先問你一句:「你確定嗎?」

今天這篇教學,我們就要結合 Keypad(鍵盤)、LCD 螢幕 與 Servo(伺服馬達),在 Wokwi 上打造一個有禮貌、會再次確認的互動控制系統。

在 Wokwi 模擬器中,請點擊「+」號新增以下元件:

  1. Arduino UNO:你的大腦。
  2. Keypad (Membrane 4×4):用來輸入角度數字,還有控制確認(C)與取消(B)。
  3. LCD 1602 (I2C):顯示我們輸入的數字與提示訊息。(記得選 I2C 版本,這樣接線最簡單!)
  4. Servo (SG90):負責執行轉動動作。

邏輯流程設計:學會「狀態機」概念

寫程式最怕邏輯打結,所以動手寫 code 前,我們先把「劇本」想好。這個系統其實就是一個簡單的「對話」流程:

  1. 輸入階段:使用者按數字鍵,螢幕顯示數字。

  2. 提交階段:使用者按下 # 鍵(代表 Enter),系統進入「詢問模式」。

  3. 確認階段

    • 螢幕顯示:「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

controlServoPicture-1

程式碼教學:讓它動起來

這個程式需要用到三個函式庫:KeypadLiquidCrystal_I2C 和 Servo。Wokwi 的 Library Manager 都可以直接搜尋並新增喔!

以下是完整的範例程式碼,我加上了詳細的中文註解:

				
					#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>

/* --- 硬體設定區 --- */
// 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 後,按下綠色播放鍵,你可以這樣測試:

  1. 正常操作

    • 在 Keypad 點擊 9 0

    • LCD 顯示 “Angle: 90″。

    • 點擊 # (Enter)。

    • LCD 問你 “Confirm? (C/B)”。

    • 點擊 C -> 看! Servo 馬達轉到 90 度了!

  2. 反悔測試

    • 輸入 1 8 0,按下 #

    • 系統問你確定嗎?這時候點擊 B

    • LCD 顯示 “Cancelled”,馬達紋絲不動,畫面清空讓你重新輸入。這就是我們要的安全機制!

  3. 防呆測試

    • 故意輸入 9 9 9,按下 #

    • LCD 會警告你 “Error: 0-180 only”。程式保護了馬達不會接收錯誤指令。

結語

恭喜你!你今天不僅學會了操作三個重要元件,更學會了設計一個**「有人性」的互動介面**。

透過按鍵 C (Confirm) 和 B (Back) 的邏輯切換,你的裝置不再是冷冰冰的機器,而是一個懂得詢問意願的智慧助手。這種「輸入 -> 確認 -> 執行」的邏輯,在未來的專案(例如密碼鎖、澆花系統)都非常實用喔!

趕快去 Wokwi 上試試看,把這套邏輯變成你的技能吧!我們下次見!

Wokwi模擬使用數字鍵,來控制伺服馬達設計分享:https://wokwi.com/projects/450822155947906049

想實作的朋友們,歡迎參考之前文章"【Arduino入門】Arduino設計入門

發佈留言

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

返回頂端