title: "在 Arduino 上於 60 分鐘內打造一隻迷你虛擬寵物 🐾"
published: true
description: "將 Arduino Uno Q 變成 Kiku,一隻具有動畫 LED 臉孔、情緒與鍵盤控制的 Tamagotchi 風格虛擬寵物。"
tags: arduino, beginners, programming, hacktoberfest

如果你的第一個硬體專案,不是另一個閃爍的 LED,而是一隻會餓、會跟你玩、會睡覺,還會對你輸入的內容做出反應的小寵物,會怎麼樣?

來認識 Kiku。🌸

Kiku 是 Her AI Studio 的吉祥物與內部寵物;這是一個社群計畫,致力於幫助新一代女性學習並使用 AI 進行創作。

在這個迷你工作坊中,我們要把 Kiku 縮小到整隻寵物都能住進一塊 Arduino Uno Q 裡。

完整教學可在 Her AI Studio 課程 中找到

你需要準備:

  • 一塊 Arduino Uno Q
  • 一條 USB 傳輸線
  • 你的筆電
  • Arduino App Lab
  • 約 60 分鐘

提示!為了慶祝 Hacktoberfest 2026,Major League Hacking 的紀念贈品包會隨這些 Arduino 一起出貨,所以你可以把這個工作坊當作你的 Hack Day 入門,開始接觸硬體駭客活動。

sleep

噓,Kiku 正在睡覺

到了最後,你會得到一隻迷你 Tamagotchi 風格的寵物,它的臉會顯示在板子上的 LED 矩陣上。你可以從鍵盤 餵牠、跟牠玩,還能讓牠睡覺。更重要的是,你會看到只需要少少的程式碼,就能做出一種彷彿有生命的行為。

你將學到什麼

這個專案結合了幾個很實用的嵌入式程式設計概念:

  • 將程式燒錄到實體硬體上
  • 透過 Serial 與微控制器溝通
  • 在 LED 矩陣上繪製圖像
  • 追蹤應用程式狀態
  • 回應使用者輸入
  • 建立簡單動畫
  • 製作一個迷你狀態機

如果你平常大多寫的是只待在筆電裡的軟體,那麼看到自己的程式突然出現在實體硬體上,會是一件特別有成就感的事。

第 1 部分:先確認板子真的有在運作

在打造虛擬寵物之前,先從嵌入式開發者版本的 "Hello, world!" 開始:讓 LED 閃爍。

用 USB 把你的 Uno Q 連接到筆電,並開啟你已下載的 Arduino App Lab。登入你的板子。

建立一個新應用程式,看看自動產生的樣板程式碼。打開 sketch.ino,寫一個基本的閃爍範例:

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);

  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
}

在 App Lab 中按下 run。

如果內建 LED 每秒亮滅一次,它活了!

如果板子沒有被偵測到,請檢查你的 USB 傳輸線。有些 USB 線只能供電,不能傳輸資料。

第 2 部分:讓你的 Arduino 有辦法聽你說話

現在我們需要讓 Kiku 聽得到我們。當然,我們也可以加按鈕或感測器(在完整工作坊與完整 AI Kit 裡我們就是這麼做的),但其實已經有一個更簡單的介面:Serial 通訊。

用來上傳程式的同一條 USB 連線,也能在程式執行時傳遞筆電與 Arduino 之間的訊息。在 App Lab 裡,它看起來像這樣:

Serial Monitor

在 setup() 中開始 Serial 通訊:

void setup() {
  Serial.begin(9600);
}

接著檢查是否有輸入字元:

void loop() {
  if (Serial.available() > 0) {
    char typed = Serial.read();

    if (typed == 'f') {
      // 餵 Kiku
    }

    if (typed == 'p') {
      // 跟 Kiku 玩
    }

    if (typed == 's') {
      // 睡覺或起床
    }
  }
}

你的鍵盤等於變成了這個實體裝置的控制器。

要和 Kiku 互動,我們會用 3 個按鍵:

f → 餵食
p → 玩耍
s → 睡覺 / 起床

第 3 部分:讓 Kiku 有一點感覺

虛擬寵物需要的不只是指令,它還需要狀態。Kiku 會追蹤三個簡單的數值:

int hunger = 3;
int joy = 6;
int energy = 8;

bool asleep = false;

我們會把每個數值視為 0 到 10 之間的值。這樣一來,動作就可以透過增加或減少這些數值來改變寵物。例如餵 Kiku 會降低飢餓值(但不要餵過頭!):

hunger = max(0, hunger - 3);
joy = min(10, joy + 1);

玩耍可能會讓 Kiku 更開心,但也會消耗體力:

joy = min(10, joy + 3);
energy = max(0, energy - 2);
hunger = min(10, hunger + 1);

讓時間變得重要

如果 Kiku 的狀態只有在我們輸入內容時才會改變,那牠就不會特別有「活著」的感覺。

所以我們引入時間!每隔幾秒,tick() 函式會更新 Kiku 的狀態,像這樣:

void tick() {
  if (asleep) {
    // 回復體力
  } else {
    // 消耗體力
    // 逐漸降低愉悅
  }

  // 逐漸變餓
}

在你的程式中,請使用較短的間隔,這樣比較容易觀察到變化(之後你也可以再調整,讓你的寵物放輕鬆一點):

const unsigned long TICK_MS = 10000;

也就是每 10 秒更新一次。離開 Kiku 一下子再回來,牠的狀態肯定已經不同了——被晾著不管時,牠們可是會鬧脾氣的!

讓狀態變成一張臉

Kiku 會把內部狀態轉換成 Uno Q 的 LED 矩陣上的表情。我們可以定義牠的眼睛:

enum Eyes {
  EYES_OPEN,
  EYES_CLOSED,
  EYES_HAPPY,
  EYES_PEEK
};

以及嘴巴的表情:

enum Mouth {
  MOUTH_FLAT,
  MOUTH_SMILE,
  MOUTH_FROWN,
  MOUTH_OPEN,
  MOUTH_DOT
};

現在我們的程式可以把狀態轉換成情緒:

Mouth moodMouth() {
  if (hunger >= 7 || joy <= 3)
    return MOUTH_FROWN;

  if (joy >= 7)
    return MOUTH_SMILE;

  return MOUTH_FLAT;
}

當然,Kiku 並不是真的在感受快樂或飢餓,不過只靠幾個變數與條件判斷,突然就開始像有個性了。

把動作連結到行為

現在各個部分就串起來了。你的主迴圈有三個工作:

  1. 聽取指令。
  2. 隨時間更新 Kiku 的狀態。
  3. 畫出合適的表情。

簡化後如下:

void loop() {
  if (Serial.available() > 0) {
    char typed = Serial.read();

    if (typed == 'f') feed();
    if (typed == 'p') play();
    if (typed == 's') toggleSleep();
  }

  // 當經過足夠時間時更新數值

  // 計算眨眼

  // 重新繪製 Kiku
}

這就是你的 Kiku 的核心架構。也試試看用你自己的裝置來跑!

在 App Lab 中開啟 Serial Monitor,然後輸入:

f

Kiku 吃飯。

接著輸入:

p

Kiku 玩耍。

再來:

s

Kiku 睡覺。

接下來呢?

試著做一些修改,改變 Kiku 的個性。

1. 改變時間

修改 TICK_MS。

2. 發明一個表情

讓 Kiku 眨眼、驚訝,或是難過。

3. 再加一個指令

例如:

c → 清理

我們實際做出了什麼?

表面上,我們做出了一隻可愛的虛擬寵物。往深一層看,我們其實探索了幾個會出現在更大型系統中的概念:

輸入處理:Serial 指令變成事件。

狀態管理:變數記住每次迴圈之間發生了什麼。

狀態轉換:動作會改變那些狀態。

基於時間的行為:即使沒有直接輸入,系統也會改變。

渲染:內部狀態透過 LED 矩陣變得可見。

人機互動:動畫與節奏讓簡單的邏輯看起來更有表現力。


如果你為 Hacktoberfest 做出了自己的 Kiku,我們很想看看你給牠設計了什麼樣的個性。🌸


本文由 Her AI Studio 作為送給 Hacktoberfest 駭客們的禮物;這是一個為下一代 AI 女性所設的社群計畫。

完整的 Kiku 工作坊包含完整的 Arduino 程式、練習、知識檢核與其他資源,可在 Her AI Studio 課程 中取得。


原文出處:https://dev.to/heraistudio/build-a-tiny-virtual-pet-on-arduino-in-60-minutes-2cf


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝49   💬2  
689
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登