Vibe Coding แสดงผลนัดหมายจาก Google Calendar ไปที่ Mini Display

วันที่นัดเยอะ การหันไปดูจอเล็ก ๆ บนโต๊ะแล้วเห็นเลยว่า “นัดหมายถัดไปคืออะไร อีกกี่นาที” ง่ายกว่าเปิด Calendar ทุกครั้ง โปรเจกต์นี้จะทำให้เราดึงนัดหมายของวันนี้จาก Google Calendar ผ่านลิงก์ iCal แล้วส่งขึ้น Mini Display ให้เองตามรอบเวลา

ตัวอย่างการแสดงผล Mini Display
ตัวอย่างการแสดงผล Mini Display

ข้อมูลที่ได้บนจอ:

  • ชื่อนัดหมายถัดไป พร้อมเวลาเริ่ม–จบ
  • นับถอยหลัง ว่าอีกกี่นาทีจะถึงนัด
  • สถานที่ และตัวเลข “+N more today” บอกว่าวันนี้ยังเหลืออีกกี่นัดหมาย

หลักการทำงานเบื้องหลัง

สิ่งที่เราจะสร้างนี้คือโปรแกรมที่ทำงานเป็นรอบ ๆ บนคอมพิวเตอร์ของเรา โดยมีขั้นตอนดังนี้: ดึงนัดหมายจากลิงก์ iCal ที่มาจาก Google Calendar, สร้างภาพสำหรับแสดงผลบน Mini Display แล้วส่งภาพเข้า Mini Display ผ่าน Wi-Fi วงเดียวกัน ใช้เพียงแค่เครื่องคอมพิวเตอร์ของเรา

  1. รันซ้ำตามรอบเวลา ตั้งด้วย INTERVAL_MINUTES ค่าเริ่มต้นของโปรเจกต์คือ 5 นาที ถ้าอยากให้อัปเดตทุก 30 นาทีก็ตั้งเป็น 30
  2. ดึงข้อมูลจาก Google Calendar (iCal) อ่านลิงก์ iCal ส่วนตัวของปฏิทิน เลือกเฉพาะนัดหมายของวันนี้ แล้วข้ามนัดหมายที่ถูกยกเลิก และนัดหมายที่เราตอบปฏิเสธแล้ว (ผ่านการตั้ง SELF_EMAIL)
  3. แสดงผลภาพจากข้อมูล แสดงผลภาพขนาด 240×240 พร้อมเซฟเป็นไฟล์ calendar.png ไว้ให้ดู Preview
  4. อัปโหลดภาพ ส่งภาพเข้า Mini Display ผ่าน Local Network ด้วย Endpoint ของรุ่นนั้น

สิ่งที่ต้องเตรียม

ต้องมี Mini Display หนึ่งตัวที่ต่อ Wi-Fi ได้แล้ว คอมพิวเตอร์ที่ติดตั้ง Node.js และบัญชี Google Calendar สำหรับดึงข้อมูลนัดหมายมาแสดงผล

สิ่งที่ต้องมีรายละเอียด
Mini DisplayGeekMagic Ultra (~400 บาท) หรือ Smart Clock Pro Ultra (~350 บาท) ต่อ Wi-Fi 2.4GHz หรือ Hotspot
คอมพิวเตอร์อยู่ Wi-Fi วงเดียวกับ Mini Display และเปิดทิ้งไว้ตลอดที่อยากให้จออัปเดต
Node.js 22 ขึ้นไปโหลดที่ nodejs.org เวอร์ชั่น 22 ขึ้นไป
Google Calendarบัญชีที่มีนัดหมายของเรา
IP ของ Mini Displayได้มาจากตอนตั้งค่า Wi-Fi ของ Mini Display
AI Coding Agent ToolsClaude Code, Codex, Antigravity หรือ AI Coding Agent อื่น ๆ

ข้อจำกัดและข้อควรระวังก่อนเริ่ม

ก่อนลงมือ มีสี่ข้อที่ควรรู้ เพราะกระทบทั้งความปลอดภัยและความคาดหวังต่อจอ:

  • ลิงก์ iCal คือรหัสสำหรับอ่านปฏิทินทั้งหมดของเรา ใครได้ลิงก์นี้ไปจะเห็นนัดหมายของเราได้โดยไม่ต้อง Login ให้เก็บเป็นความลับเหมือนรหัสผ่าน อย่าโพสต์ลง Chat ที่คนอื่นเห็น และถ้าหลุดให้ Reset ลิงก์ใหม่ (ดูวิธีในส่วน FAQ)
  • Google อัปเดต iCal ช้า นัดหมายที่เพิ่งสร้างหรือแก้อาจใช้เวลาหลายนาทีกว่าจะโผล่ในลิงก์ ดังนั้นจอนี้เหมาะกับ “ดูคร่าว ๆ ว่านัดหมายถัดไปคืออะไร” ไม่เหมาะกับการเช็กนัดหมายที่เพิ่งเปลี่ยนเมื่อสองนาทีก่อน
  • นับถอยหลังละเอียดเท่ารอบอัปเดต ถ้าตั้งรอบ 30 นาที ตัวเลขนับถอยหลังบนจอจะเปลี่ยนทีละครึ่งชั่วโมงเท่านั้น ถ้าอยากให้ตัวเลขใกล้เคียงความจริง ใช้ค่าเริ่มต้น 5 นาที
  • ต้องมีคอมพิวเตอร์เปิดอยู่ โปรแกรมรันบนเครื่องเรา ถ้าเครื่อง Sleep หรือหลุดจาก Wi-Fi จอจะค้างที่การ์ดล่าสุด และเวลาบนการ์ดใช้ Time Zone ของคอมพิวเตอร์

วิธีทำอย่างละเอียด

ตั้งค่า Mini Display

ทำให้ Mini Display ต่อ Wi-Fi 2.4GHz (หรือ Hotspot) วงเดียวกับคอมพิวเตอร์ และรู้ IP กับ Path อัปโหลดของรุ่นที่ใช้ ถ้ายังไม่เคยตั้งค่า ให้ทำตามบทความ วิธีตั้งค่า Mini Display (GeekMagic Ultra และ Smart Clock Pro Ultra) ก่อน แล้วกลับมาที่นี่

การตั้งค่า Mini Display จะทำให้เราได้ IP ของ Mini Display (192.168.1.xxx) ที่ต้องเอาไปใส่ในไฟล์ .env ของ Project โดยต้องใส่ข้อมูลตามรายละเอียดด้านล่าง

รุ่นDEVICE_URLUPLOAD_DIR
GeekMagic Ultrahttp://<IP ของจอ>/doUpload/image/
Smart Clock Pro Ultrahttp://<IP ของจอ>/photo/upload/photo/

เอาลิงก์ iCal จาก Google Calendar

เปิด Google Calendar บนเว็บ (ใน Desktop Browser เพราะหน้านี้ไม่มีในแอปมือถือ) เข้า Settings เลือกปฏิทินที่ต้องการ แล้วคัดลอก Secret address in iCal format ซึ่งเป็นลิงก์ลงท้ายด้วย .ics

  1. เปิด calendar.google.com แล้วกดไอคอนเฟือง → Settings
  2. ที่แถบซ้าย หัวข้อ Settings for my calendars เลือกปฏิทินที่ต้องการให้ขึ้นจอ
  3. เลื่อนไปที่ Integrate calendar
  4. คัดลอกลิงก์ใต้ Secret address in iCal format
  5. เก็บลิงก์ iCal ไว้ก่อน เดี๋ยวเอาไปวางในไฟล์ .env ด้วยตัวเองในขั้นถัดไป

– Public address in iCal format สามารถอ่านข้อมูลนัดหมายได้กรณีที่เราเปิด Calendar นั้นเป็น Public
– Secret address in iCal format ทำให้เราสามารถอ่านข้อมูลนัดหมายได้แม้จะเป็น Private Calendar (ไม่ต้อง Login)

ติดตั้งโปรเจกต์และทดสอบ

ติดตั้งโปรเจกต์ ตั้งค่า .env แล้วทดสอบทีละขั้น: ส่งรูปตัวอย่างก่อน ต่อด้วยการ์ดจำลอง แล้วค่อยใช้ปฏิทินจริง การทดสอบเป็นขั้น ๆ ช่วยให้รู้ทันทีว่าติดที่การเชื่อมต่อจอ หรือติดที่ลิงก์ปฏิทิน

ดาวน์โหลด Node.js

ดาวน์โหลด Node.js ที่ nodejs.org เวอร์ชั่น 22 ขึ้นไป เพื่อใช้รัน Script สำหรับทำ Project

ดาวน์โหลดและติดตั้ง Project จาก GitHub

ไปที่ หน้า Project แล้วกด Code → Download ZIP แล้วแตกไฟล์ จากนั้นเปิด AI Tools อย่าง Claude, Codex หรือ Antigravity บน Project นั้น

กรณีที่ติดตั้ง Git หรือ GitHub Desktop สามารถ Clone Project มาได้เลย

แล้วรันคำสั่งให้ AI ช่วยติดตั้ง Project ให้ดังนี้

Setup Project นี้ ตาม AGENTS.md ทำตามขั้นตอนและอธิบายสิ่งที่ทำ

ระบบจะติดตั้ง package ที่จำเป็น และสร้างไฟล์ .env ให้

หากต้องการรันคำสั่งเองใน Terminal (macOS) หรือ PowerShell (Windows)

npm install 
cp .env.example .env

สร้างและแก้ไฟล์ .env

เปิด .env ด้วยโปรแกรมแก้ข้อความ แล้วแก้ค่าตามนี้ (ตัวอย่างนี้เป็นของ Smart Clock Pro Ultra)::

DEVICE_URL=http://192.168.1.106/photo/upload
UPLOAD_DIR=/photo/
ICS_URL=
SELF_EMAIL=your-name@gmail.com
INTERVAL_MINUTES=5
ตัวแปรใช้ทำอะไรค่าเริ่มต้น
DEVICE_URLURL อัปโหลดของ Mini Display (ดูได้จากขั้นตอนการตั้งค่า Mini Display)http://10.255.221.161/photo/upload
UPLOAD_DIRโฟลเดอร์ปลายทางบนจอ (ดูได้จากขั้นตอนการตั้งค่า Mini Display)/photo/
ICS_URLลิงก์ iCal ลับจากขั้นที่ 2 ถ้าเว้นว่าง โปรแกรมจะใช้นัดจำลองว่าง
SELF_EMAILอีเมล Google ของเรา ใช้ซ่อนนัดที่ตอบปฏิเสธว่าง
INTERVAL_MINUTESรอบอัปเดตเป็นนาที ใส่ทศนิยมได้ ค่าเริ่มต้นคือ 5 นาที5
PREVIEW_PATHไฟล์ PNG Preview ที่ใช้เพื่อเช็คการแสดงผลบนเครื่องcalendar.png

วางค่า ICS_URL เองลงในไฟล์ .env อย่าส่งลิงก์นี้ให้ AI ถ้าไม่จำเป็น ถ้าใช้ AI Agent ช่วยติดตั้ง ให้ AI ทำถึงขั้นสร้างไฟล์ .env แล้วเราค่อยวางลิงก์เอง เพราะลิงก์นี้เปิดอ่านปฏิทินได้ทั้งหมด

ถ้าอยากให้ AI Agent พาติดตั้ง ใช้ Prompt นี้ได้:

ช่วยติดตั้งโปรเจกต์ https://github.com/Datayolk/mini-display-calendar ให้ฉันทีละขั้น

- Mini Display รุ่น: [GeekMagic Ultra หรือ Smart Clock Pro Ultra]
- IP ของ Mini Display: [เช่น 192.168.1.106] (ถ้าฉันไม่ได้ใส่มา ให้ถามก่อน)
- ระบบปฏิบัติการ: [macOS หรือ Windows]

ทำให้ถึงขั้นสร้างไฟล์ .env และใส่ DEVICE_URL, UPLOAD_DIR ให้ตรงกับรุ่นจอ
แต่ห้ามขอ ICS_URL จากฉัน ให้ฉันวางลิงก์ลงไฟล์ .env เอง แล้วบอกฉันว่าต้องวางตรงไหน
ถ้ามีอะไรที่ฉันต้องทำเอง ให้อธิบายเป็น Step by Step

รัน Project บน Mini Display Device จริง

ให้ AI Agent รัน Project ให้ใช้ Prompt นี้

รัน Project นี้เพื่อใช้งานจริง

หากต้องการรัน Project ใน Terminal ด้วยตัวเองให้ใช้คำสั่ง npm run watch

ไอเดียต่อยอด

โค้ดใน Project แยกเป็นส่วน ๆ ชัดเจน แก้เฉพาะจุดได้โดยไม่ต้องรื้อทั้งโปรเจกต์ ไอเดียด้านล่างยังไม่ได้ทำใน Repo ปัจจุบัน เป็นทิศทางที่ต่อยอดได้ และสั่ง AI Agent ให้ช่วยเขียนได้ (Vibe Coding)

  • ทำให้รองรับ Calendar ได้หลายอัน ตอนนี้อ่านได้ทีละลิงก์ สามารถปรับปรุงเพิ่มเติมให้รองรับได้หลาย ๆ Calendar
  • เพิ่ม Animation ให้ Calendar Mini Display รับไฟล์ GIF ได้ ลองให้สถานะ NOW กะพริบหรือให้แถบนับถอยหลังเคลื่อนไหว แต่ต้องรักษาขนาดภาพ 240×240
  • เปลี่ยนจาก Google Calendar เป็น Todoist ปรับแต่งให้ดึงข้อมูลจาก Todoist API แทน
  • ซ่อนนัดที่ไม่อยากเห็น เช่น นัดหมาย “Focus time”
  • เปลี่ยนสี ฟอนต์ ขนาด ตามที่ต้องการ

คำถามที่พบบ่อย

ทำไมใช้ลิงก์ iCal ไม่ใช้ Google Calendar API?

ลิงก์ iCal ตั้งค่าเร็วกว่ามาก แค่วางลิงก์ครั้งเดียว ไม่ต้องสร้าง Google Cloud Project ไม่ต้องขอสิทธิ์ ไม่ต้องจัดการ Token ข้อแลกเปลี่ยนคือ Google อัปเดตลิงก์ช้ากว่า API และลิงก์เป็นกุญแจอ่านปฏิทินทั้งหมด ถ้างานต้องการข้อมูลสดแบบวินาทีต่อวินาที API เหมาะกว่า

ลิงก์ iCal หลุดไปให้คนอื่นแล้ว ทำไงดี?

กลับไปที่ Settings → Integrate calendar ของปฏิทินนั้นใน Google Calendar แล้วกด Reset ที่ Secret address ลิงก์เดิมจะใช้ไม่ได้ทันที จากนั้นคัดลอกลิงก์ใหม่ไปวางใน .env แล้วรัน npm run watch ใหม่

นัดหมายที่เพิ่งสร้างไม่ขึ้นบนจอ ทำไม?

Google อัปเดตข้อมูลในลิงก์ iCal ช้า อาจต้องรอหลายนาที ลองรอสักพักแล้วสังเกตการ์ดรอบถัดไป ถ้านานผิดปกติให้เช็คว่านัดหมายนั้นอยู่ในปฏิทินที่เราคัดลอกลิงก์มาจริงหรือเปล่า เพราะลิงก์หนึ่งอันคือปฏิทินหนึ่งอัน

นัดหมายที่ฉันตอบปฏิเสธไปแล้วยังขึ้นบนจอ

ใส่อีเมล Google ที่ใช้กับปฏิทินนั้นใน SELF_EMAIL โปรแกรมต้องรู้ว่าเราคือใครถึงจะซ่อนนัดที่เราปฏิเสธได้ แล้วรีสตาร์ตโปรแกรม

เวลาบน Mini Display ไม่ตรงกับเวลาจริง

การ์ดใช้ Time Zone ของคอมพิวเตอร์ที่รันโปรแกรม เช็กการตั้งค่า Time Zone ของเครื่อง (ไม่ใช่ของ Google Calendar)

รันแล้วขึ้น Timeout หรือ ETIMEDOUT

คอมพิวเตอร์ติดต่อ Mini Display ไม่ได้ เช็กตามลำดับ: IP ใน DEVICE_URL ยังตรงกับ IP ปัจจุบันของจอไหม, คอมพิวเตอร์กับจออยู่ Wi-Fi วงเดียวกันไหม, ลองเปิด IP ของจอในเบราว์เซอร์ว่าเข้าได้หรือเปล่า

ขึ้น Device responded 4xx/5xx

จอตอบกลับแต่ไม่ยอมรับไฟล์ ให้เช็ก DEVICE_URL และ UPLOAD_DIR ว่าตรงกับรุ่นที่ใช้ตามตารางในขั้นที่ 1 หรือยัง (GeekMagic Ultra ใช้ /doUpload กับ /image/ ส่วน Smart Clock Pro Ultra ใช้ /photo/upload กับ /photo/)

ขึ้น Calendar fetch failed: HTTP 404

ลิงก์ใน ICS_URL ผิด หรือถูก Reset ไปแล้ว คัดลอกลิงก์ใหม่จาก Google Calendar มาวาง

ต้องเปิดคอมพิวเตอร์ทิ้งไว้ตลอดไหม?

ใช่ โปรแกรมรันบนคอมพิวเตอร์ของเรา ถ้าเครื่อง Sleep จอจะค้างที่การ์ดล่าสุด ถ้าไม่อยากเปิดเครื่องหลักทิ้งไว้ ลองรันบนคอมพิวเตอร์เครื่องเล็กที่เปิดทิ้งได้ หรือเครื่องเก่าที่ไม่ใช้แล้ว ขอแค่ต่อ Wi-Fi วงเดียวกับจอ

ใช้ได้กับปฏิทินอื่นนอกจาก Google Calendar ไหม?

โค้ดอ่านลิงก์ iCal (.ics) ซึ่งเป็นรูปแบบมาตรฐาน ปฏิทินที่ให้ลิงก์ลักษณะนี้ได้ก็น่าจะใช้ได้ แต่โปรเจกต์ถูกทำและทดสอบกับ Google Calendar เป็นหลัก ถ้าอยากใช้ Todoist หรือบริการอื่นที่ไม่มีลิงก์ iCal ต้องเขียน Source เพิ่ม (ดูหัวข้อไอเดียต่อยอด)

ใช้กับ Mini Display รุ่นไหนได้บ้าง?

รองรับ GeekMagic Ultra และ Smart Clock Pro Ultra โดยต่างกันที่ DEVICE_URL และ UPLOAD_DIR ตามตาราง (รุ่นอื่นก็สามารถใช้ได้)