教你怎麼 DIY 一個 WordClock | 地表最強手工生日禮物

更新 發佈閱讀 19 分鐘

這篇文章是一篇教學文,我有一個朋友很喜歡 Wordclock,它是一款很精緻的時鐘,但是它的報時方式是切換盤面上的數字,如下圖。

Word Clock

Word Clock

所以我決定手搓一個西文版(因為他的母語是西班牙文)的 Wordclock 給他。這篇文章就是來記錄一下這個東西要怎麼手工做出來,你就可以省下好幾萬塊。

材料:

要做出一個 Word clock,我們需要的材料如下


  1. IKEA 買的 SANNAHED 框,我買的尺寸是 50*50cm,這個東西會當成 wordclock 的外框。
  2. 一個印有時鐘字母圖案的客製化字母遮罩,燈從後面照的時候就可以有字母的形狀。網路上有很多德文或英文的模板,其他語言的就很少。我的作法是找一個英文的模板,匯入一個叫做 INKSCAPE 的軟體,然後讓 AI 生成西文版的排版,接著開始複製貼上成西文的。我在德國的作法是在這個網站下單,大概兩周後送過來。
  3. 一個 microcontroller,我買的是 ESP88266 ,要包含 WiFi 模組,因為我們的時鐘要透過 WiFi 校準。構想是當你把 wordclock 帶到一個有 WiFi 的環境並插電時,wordclock 會變成一個基地台,然後你在手機上點 wordclock 的網路,接著從手機把你所在地的網路名稱和密碼輸入 wordclock,然後它就會停止當基地台並連上網。
  4. WS2812B 燈條,買 30LED/公尺的規格,因為這個規格的燈和燈的間距剛好會對到字母遮罩。
  5. Level Converter,要把 5V 轉成 3.3V 用。5V 是 LED 燈,3.3V 是 microcontroller 要用。
  6. 兩捲顏色不一樣的電纜線,焊接時才不會眼花。一條不要的 USB 線。
  7. 一個乳白色壓克力板,以及一個黑色 PVC 發泡板 (原文是 Hartschaumplatte,我不太確定翻譯的對不對),長寬都是 50*50 cm,厚度是 3mm。黑色板子之後要割成網格狀,目的是隔絕光線,不要一個字母的光透到隔壁字母去。白色板子是柔和光線,這樣才不會太刺眼。
  8. 電烙鐵,你需要把電線和燈焊在一起。
  9. 一把美工刀、一把尺(鐵尺是最好的,因為你可以拿美工刀沿著尺割板子)

Wordclock 的製作有點像三明治,透過在 IKEA 的 SANNAHED 框內疊上好幾層不同的材料達到目的。第一層是客製化字母遮罩 (顯示字體),第二層要放乳白色壓克力板 (柔和光線),第三層是 黑色 PVC 發泡板 (確保光線不溢散),第四層是 SANNAHED 附贈的一塊木板 (LED 燈條貼在這)。

步驟:

這些步驟不一定有前後關係,可以根據取得材料的順序合理地自行調換。

  1. 把 PVC 發泡板用美工刀割出 110 個洞,確保模放在板子後面可以看到每一個字母。
  1. 把 LED 燈條,每排11個燈剪成10排。用剪刀剪就可以了,剪的地方就是銅箔的地方。要注意方向,燈條上的左右是不一樣的,一邊是輸入,一邊是輸出 (燈條上會標示)。我們要的是把它貼成 S 型的,第一排輸入在左輸出在右,第二排輸入在右輸出在左,這樣不斷交替下去。接下來把每排連起來的時候,就可以用很短的線。
貼上10排,每排11個的LED燈條(你要買一捲自己用剪刀剪)

貼上10排,每排11個的LED燈條(你要買一捲自己用剪刀剪)

  1. 開始焊接,把燈條的上下兩排全部接起來,接成 S 型。建議用不同顏色的線,這樣你才不會不小心把 GND 跟 5V 焊在一起。
把燈條焊接成 S 型,GND接GND,Vo接 Vin,5V接5V

把燈條焊接成 S 型,GND接GND,Vo接 Vin,5V接5V

  1. 我們接著來燒錄 LED 燈的測試程式碼,這步主要是和我們焊接有沒有接好,能不能用 ESP 8266 點亮所有的 LED 燈。首先拿一條線,把 ESP 8266 接到筆電上,然後在筆電上裝 Arduino IDE。點開後選好型號,去 Library Manager 安裝 FastLED,貼上下面的測試程式碼後按上傳 (程式碼是給 Gemini 生成的)。
#include <FastLED.h>

// --- 硬體設定 ---
#define NUM_LEDS 110 // 你的總燈數
#define DATA_PIN 4 // 接到 ESP8266 的 D2 腳位 (GPIO4)
#define BRIGHTNESS 50 // 亮度 (0-255,測試時先調低以免燒毀 USB 孔)
#define LED_TYPE WS2812B // 燈條型號
#define COLOR_ORDER GRB // WS2812B 的標準色彩順序

CRGB leds[NUM_LEDS];

void setup() {
delay(2000); // 開機安全延遲
// 初始化 FastLED
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
}

void loop() {
// 測試 1:紅色跑馬燈
for(int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Red;
FastLED.show();
delay(30);
leds[i] = CRGB::Black;
}

// 測試 2:全亮綠色
fill_solid(leds, NUM_LEDS, CRGB::Green);
FastLED.show();
delay(1000);

// 測試 3:全亮藍色
fill_solid(leds, NUM_LEDS, CRGB::Blue);
FastLED.show();
delay(1000);

// 全部熄滅,準備下一次循環
FastLED.clear();
FastLED.show();
delay(500);
  1. 接著我們要把微控制器、Level Converter、和剛剛的 LED 燈條焊接在一起。我的做法是拿一條不要的 usb 線,然後把 usb c 的那端剪開,剪開後你會看到一堆亂七八糟的線纏在一起,我們取出裡面的紅線和黑線 (他們分別是5V和GND)。我們接下來要拿出六根電纜線,三根和 usb 的紅線纏起來,三根和 usb 的黑線纏起來,纏得跟麻花捲一樣,然後把他們焊起來。然後用電火布把他們包起來,確保他們不會碰到。
  2. 電源分配: 紅線麻花捲的那三根,分別接往燈條的5V、Level Converter 的 HV、ESP8266的5V。
  3. 接地分配: 黑色麻花線的那三根,則是接到燈條起點的 GND、Level Converter 的 GND (我接在 HV 那側)、ESP8266 的 GND 孔。
  4. 訊號及參考電壓: ESP8266 的 D2 孔接到 Level Converter 的 LV1 孔,並且把 Level Converter 的 HV1 孔接上燈條的 Din、LV 接到 ESP8266 的 3V3 孔位。
  5. 把以下程式碼燒到微控制器上 (這整段程式碼都是給 Gemini 寫的,我就複製貼上)。
#include <ESP8266WiFi.h>
#include <WiFiManager.h> // 神器:不用寫死 Wi-Fi 密碼
#include <FastLED.h>
#include <time.h> // 處理網路對時

#define NUM_LEDS 110
#define DATA_PIN 4 // D2 腳位
#define BRIGHTNESS 150 // 亮度 (0-255,太亮可以調低)
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB

CRGB leds[NUM_LEDS];

// 設定顯示顏色 (你可以自己改成 CRGB::Red, CRGB::Blue, 或是自訂顏色)
CRGB timeColor = CRGB::White;

// 時區設定 (目前設定為西班牙馬德里時間,含日光節約自動切換)
// 如果你要顯示台灣時間,請改成 "CST-8"
#define TZ_INFO "CET-1CEST,M3.5.0,M10.5.0/3"

// ==========================================
// 核心座標轉換:處理 S 型走線
// ==========================================
int XY(int x, int y) {
if(y % 2 == 0) {
// 偶數排 (0, 2, 4...) 從左到右
return (y * 11) + x;
} else {
// 奇數排 (1, 3, 5...) 從右到左
return (y * 11) + (10 - x);
}
}

// 點亮單字的輔助函數 (y: 第幾排, x_start: 起始行數, len: 單字長度)
void lightWord(int y, int x_start, int len) {
for(int i = 0; i < len; i++) {
leds[XY(x_start + i, y)] = timeColor;
}
}

// ==========================================
// 西語單字座標映射 (對應你提供的 11x10 網格)
// ==========================================
void showPrefix(int h) {
if(h == 1) {
lightWord(0, 0, 2); // ES
lightWord(0, 5, 2); // LA
} else {
lightWord(0, 1, 3); // SON
lightWord(0, 5, 3); // LAS
}
}

void showHour(int h) {
switch(h) {
case 1: lightWord(0, 8, 3); break; // UNA
case 2: lightWord(1, 0, 3); break; // DOS
case 3: lightWord(1, 4, 4); break; // TRES
case 4: lightWord(2, 0, 6); break; // CUATRO
case 5: lightWord(2, 6, 5); break; // CINCO
case 6: lightWord(3, 0, 4); break; // SEIS
case 7: lightWord(3, 5, 5); break; // SIETE
case 8: lightWord(4, 0, 4); break; // OCHO
case 9: lightWord(4, 4, 5); break; // NUEVE
case 10: lightWord(5, 2, 4); break; // DIEZ
case 11: lightWord(5, 7, 4); break; // ONCE
case 0:
case 12: lightWord(6, 0, 4); break; // DOCE
}
}

void showMinute(int mStep) {
switch(mStep) {
case 1: lightWord(6, 5, 1); lightWord(8, 6, 5); break; // Y CINCO
case 2: lightWord(6, 5, 1); lightWord(7, 7, 4); break; // Y DIEZ
case 3: lightWord(6, 5, 1); lightWord(9, 5, 6); break; // Y CUARTO (對應面板拼寫)
case 4: lightWord(6, 5, 1); lightWord(7, 1, 6); break; // Y VEINTE
case 5: lightWord(6, 5, 1); lightWord(8, 0, 11); break;// Y VEINTICINCO
case 6: lightWord(6, 5, 1); lightWord(9, 0, 5); break; // Y MEDIA
case 7: lightWord(6, 6, 5); lightWord(8, 0, 11); break;// MENOS VEINTICINCO
case 8: lightWord(6, 6, 5); lightWord(7, 1, 6); break; // MENOS VEINTE
case 9: lightWord(6, 6, 5); lightWord(9, 5, 6); break; // MENOS CUARTO
case 10: lightWord(6, 6, 5); lightWord(7, 7, 4); break; // MENOS DIEZ
case 11: lightWord(6, 6, 5); lightWord(8, 6, 5); break; // MENOS CINCO
}
}

void setup() {
Serial.begin(115200);
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);

// 開機時先亮一顆藍燈,表示正在處理 Wi-Fi
FastLED.clear();
leds[XY(0,0)] = CRGB::Blue;
FastLED.show();

// 啟動 WiFiManager
WiFiManager wifiManager;

// 取消這行的註解可以清除記住的 WiFi (測試用)
// wifiManager.resetSettings();

// 如果連不上,會發出名為 "WordClock_Setup" 的 Wi-Fi
wifiManager.autoConnect("WordClock_Setup");

Serial.println("Wi-Fi 連線成功!");

// 設定 NTP 網路時間
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
setenv("TZ", TZ_INFO, 1);
tzset();
}

void loop() {
time_t now = time(nullptr);
struct tm* timeinfo = localtime(&now);

// 確認年份大於 2000,代表時間已經從網路同步成功
if (timeinfo->tm_year > 100) {
int h = timeinfo->tm_hour;
int m = timeinfo->tm_min;

// 轉為 12 小時制
h = h % 12;
if (h == 0) h = 12;

int mStep = m / 5;

// 西語時間邏輯:超過 30 分後,小時要加 1 (用 MENOS 表達差幾分)
if (mStep >= 7) {
h = h + 1;
if (h > 12) h = 1;
}

FastLED.clear();
showPrefix(h);
showHour(h);
showMinute(mStep);
FastLED.show();

} else {
// 時間還沒抓到時,讓第一顆藍燈閃爍
FastLED.clear();
leds[XY(0,0)] = (millis() % 1000 < 500) ? CRGB::Blue : CRGB::Black;
FastLED.show();
}

delay(1000); // 每秒更新一次
}

7. 接著把 usb 沒被剪的那端接上一個 5V 豆腐頭插上插座就大功告成!

成品展示

成品展示

最好笑的是我把右下角拼錯了,應該是 CUARTO 才對,因為我原本想寫的是 1/4。另外貼上字母遮罩的時候要謹慎,否則就會像我的一樣凹凸不平,近看很醜。

參考資料:

寫論文都要參考資料,做 DIY 也是。我的材料都是跟著這個教學買的,然後有些地方自己改一下。比如影片中用了一塊木板,然後割圓孔出來,但是我沒有雷射切割,所以我改成買黑色板子然後用美工刀割。

留言
avatar-img
德國留學仔想靠寫作賺點錢
46會員
50內容數
在德國念碩的台灣仔,不定期更新自己的生活,希望藉此領取微薄的補貼。喜歡旅行、讀書、看電影,不喜歡自己念的專業。
2026/02/04
這是我在做德語 B2 練習題的單字和文法表,希望能幫到同樣要考試的人。
2026/02/04
這是我在做德語 B2 練習題的單字和文法表,希望能幫到同樣要考試的人。
2026/02/04
這篇文章是我考德文檢定 Telc 的心得,包含一些我的考試技巧、心得、流程、準備材料和模板。希望能對同樣要考德文檢定的人有幫助。
Thumbnail
2026/02/04
這篇文章是我考德文檢定 Telc 的心得,包含一些我的考試技巧、心得、流程、準備材料和模板。希望能對同樣要考德文檢定的人有幫助。
Thumbnail
2025/08/31
我超愛看小說,是一個沒有書店就活不下去的書蟲。所以我平常沒事就會去逛二手書店,有時候可以挖到寶,我尤其喜歡那種破破爛爛的二手書。二手書店裡翻到一本想要的書,那種驚喜感,比拆禮物還讓人開心。今天就來分享一下在雙北我平常會逛的二手書店們。
Thumbnail
2025/08/31
我超愛看小說,是一個沒有書店就活不下去的書蟲。所以我平常沒事就會去逛二手書店,有時候可以挖到寶,我尤其喜歡那種破破爛爛的二手書。二手書店裡翻到一本想要的書,那種驚喜感,比拆禮物還讓人開心。今天就來分享一下在雙北我平常會逛的二手書店們。
Thumbnail
看更多
你可能也想看
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
Meet Audiogest — 借助人工智慧實現轉錄。享受註冊時的 40 分鐘免費試用,使用 Whisper 和 Pyannote 進行說話人分離,並使用 GPT-4 生成摘要。沒有訂閱費,只需提前充值積分,方便快捷。立即簡化您的音訊任務。
Thumbnail
Meet Audiogest — 借助人工智慧實現轉錄。享受註冊時的 40 分鐘免費試用,使用 Whisper 和 Pyannote 進行說話人分離,並使用 GPT-4 生成摘要。沒有訂閱費,只需提前充值積分,方便快捷。立即簡化您的音訊任務。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
這 5 個工具可以幫你創作動畫、自動化工作、回答問題、提升 Instagram 技能和簡化網站分析。 AI 技術正在改變我們生活的方方面面,包括創意、工作和學習。 本週,我們來看看 5 個令人驚奇的未來工具,它們可以幫你做夢成真。
Thumbnail
這 5 個工具可以幫你創作動畫、自動化工作、回答問題、提升 Instagram 技能和簡化網站分析。 AI 技術正在改變我們生活的方方面面,包括創意、工作和學習。 本週,我們來看看 5 個令人驚奇的未來工具,它們可以幫你做夢成真。
Thumbnail
這兩年 AI 的發展真的快到讓人眼花撩亂,身為一個喜歡在工作之餘研究新科技、讓生活更便利的人,Google Gemini 絕對是我筆記本裡最重要的一頁。 回想起它剛推出的時候,到現在變成我們手機裡隨傳隨到的好幫手,這段「進化史」其實蠻精彩的。今天就用比較輕鬆的方式,跟大家聊聊我眼中的 Gemi
Thumbnail
這兩年 AI 的發展真的快到讓人眼花撩亂,身為一個喜歡在工作之餘研究新科技、讓生活更便利的人,Google Gemini 絕對是我筆記本裡最重要的一頁。 回想起它剛推出的時候,到現在變成我們手機裡隨傳隨到的好幫手,這段「進化史」其實蠻精彩的。今天就用比較輕鬆的方式,跟大家聊聊我眼中的 Gemi
Thumbnail
在現今的數位時代,資訊圖表 (infographic) 已成為傳達複雜資訊的利器之一, 而創意滿滿的 ppt 插圖、海報、DM、宣傳手冊封面和其他視覺設計文案,更是各種活動、簡報和品牌行銷時不可或缺的一環。 本文將分享一個好用的 Midjourney 指令模板,可讓我們透過 AI 繪圖工具
Thumbnail
在現今的數位時代,資訊圖表 (infographic) 已成為傳達複雜資訊的利器之一, 而創意滿滿的 ppt 插圖、海報、DM、宣傳手冊封面和其他視覺設計文案,更是各種活動、簡報和品牌行銷時不可或缺的一環。 本文將分享一個好用的 Midjourney 指令模板,可讓我們透過 AI 繪圖工具
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News