นาฬิกาทราย (Hourglass) หรือนาฬิกาทรายทรายเนี่ย เป็นอุปกรณ์วัดเวลาที่เราคุ้นเคยกันดี มันประกอบด้วยหลอดแก้วสองอันเชื่อมกันด้วยคอแคบๆ ทรายจะไหลจากหลอดบนลงหลอดล่าง

การไหลของทรายถูกควบคุมให้ใช้เวลาที่แน่นอนในการย้ายจากหลอดบนลงล่างจนหมด พวกมันเลยถูกใช้เป็นเครื่องมือบริหารเวลาและของตกแต่งบ่อยๆ คราวนี้พี่จะพาน้องทำนาฬิกาทรายแบบดิจิทัลกัน ง่ายมากๆ นี่เป็นอีกหนึ่งโปรเจกต์ในคอลเลกชันนาฬิกาแปลกๆ แบบ DIY ของพี่ ตอนแรกพี่ลองใช้ Arduino Nano มาทำดู แต่ก็รู้สึกว่ามันต้องใช้พลังที่มากกว่านี้ เลยเปลี่ยนมาใช้ ESP32 ซึ่งแม้แต่โปรเจกต์ที่ซับซ้อนกว่านี้ก็ยังจัดไหว
บอกตรงๆ ไอเดียแรกของพี่คืออยากจำลองการเคลื่อนที่ของทรายตามกฎการไหลของของไหลโดยใช้เซ็นเซอร์ IMU ด้วยซ้ำ แต่จนถึงตอนนี้พี่ยังทำไอเดียนั้นให้สมบูรณ์ไม่ได้เลย ฮ่าๆ
อุปกรณ์ในโปรเจกต์นี้ทำง่ายโคตรๆ ประกอบด้วยแค่ 3 ชิ้นส่วนเท่านั้น

- บอร์ดไมโครคอนโทรลเลอร์ ESP8266
- จอแสดงผล SH1106 Oled ความละเอียด 128x64 จุด
- และ เซ็นเซอร์วัดการเอียง (Tilt sensor)
ใช้แบตเตอรี่ลิเธียมเซลล์เดี่ยวเป็นแหล่งจ่ายไฟให้กับวงจร

โปรเจกต์นี้คือคลาสมาสเตอร์เรื่อง การผสมผสานดิจิทัล-อนาล็อก (Digital-Analog Hybridization) เลยนะ นาฬิกาทรายอนิเมชั่นไม่ใช่แค่นาฬิกา มันคือ เครื่องจำลองฟิสิกส์ (Physics Simulator) ด้วยการผสมผสานอัตรารีเฟรชสูงของ SH1106 OLED เข้ากับความรู้สึกถึงแรงโน้มถ่วงจาก เซ็นเซอร์วัดการเอียง เราก็สามารถจำลอง "ความรู้สึก" อินทรีย์ของนาฬิกาทรายโบราณได้ในสภาพแวดล้อมของไมโครคอนโทรลเลอร์ 32-บิตสมัยใหม่
ภาพรวมสถาปัตยกรรม: การจำลองพิกเซลและแรงโน้มถ่วง
นาฬิกาทรายอนิเมชั่น ทำงานผ่านวงจรชีวิตเฉพาะทางที่เรียกว่า State-Switch Visualization ขณะที่ทำงานบน ESP8266 อุปกรณ์จะคอยตรวจสอบการวางตัวของตัวเครื่องตลอดเวลา ถ้าผู้ใช้พลิกอุปกรณ์ 180 องศา สวิตช์วัดการเอียง SW-520D จะสั่งให้ไมโครคอนโทรลเลอร์เปลี่ยนเป็นสถานะ "เติมทรายใหม่" ซึ่งเม็ดทรายเสมือนจริง—ที่ถูกแทนด้วยพิกเซลขนาด 1x1 แต่ละจุด—จะตกลงจากภาชนะเรขาคณิตด้านบนไปยังด้านล่าง ด้วยอัตราที่ควบคุมโดยซอฟต์แวร์ให้ใช้เวลาเต็ม 1 นาทีต่อการย้ายทรายทั้งหมด
โครงสร้างพื้นฐานฮาร์ดแวร์และระดับการแสดงภาพ
- NodeMCU ESP8266: หรือ "เครื่องยนต์จำลอง" แม้แผนเดิมจะใช้ Arduino Nano แต่โปรเจกต์นี้เน้นย้ายมาใช้ ESP8266 32-บิตเพื่อจัดการกับการอัพเดตหน้าจอที่ซับซ้อนและการคำนวณอนุภาคแบบสุ่มโดยไม่มีปัญหา "เฟรมรัว"
- SH1106 OLED (128x64): หรือ "ผืนผ้าใบแสดงภาพ" จอ I2C นี้ให้สีดำที่ลึกและพิกเซลสีขาวที่สดใส ทำให้มันเป็นสื่อที่สมบูรณ์แบบสำหรับการจำลองทรายที่มีคอนทราสต์สูง ไม่เหมือนกับจอ ILI มาตรฐานทั่วไป SH1106 อนุญาตให้ "เขียนลงบัฟเฟอร์โดยตรง (Direct Buffer Writing)" ได้เร็ว ทำให้การไหลของอนุภาคลื่นไหล
- เซ็นเซอร์วัดการเอียง SW-520D: หรือ "ดวงตาตรวจสอบการวางตัว" สวิตช์กลไกง่ายๆ นี้มีลูกโลหะเล็กๆ กลิ้งไปมาบนหน้าสัมผัสตามแรงโน้มถ่วง มันให้การซิงโครไนซ์จากภายนอกสู่ภายในระบบโดยไม่จำเป็นต้องใช้ IMU (Inertial Measurement Unit) ที่ซับซ้อน
โครงการนี้ได้รับการสนับสนุนจาก PCBWay พวกเขามีบริการทุกอย่างที่คุณต้องการเพื่อสร้างโปรเจกต์ของคุณในราคาที่ดีที่สุด ไม่ว่าจะเป็นโปรเจกต์ในโรงเรียน หรือโปรเจกต์ระดับมืออาชีพที่ซับซ้อน คุณสามารถแชร์ประสบการณ์ หรือหาไอเดียสำหรับโปรเจกต์ต่อไปของคุณได้ พวกเขายังให้บริการประกอบแผ่นวงจรพิมพ์แบบ Surface Mount (SMT) พร้อมใช้ในราคาที่ดีที่สุด พร้อมการควบคุมคุณภาพมาตรฐาน ISO9001 อีกด้วย

เซ็นเซอร์ตรวจจับการเอียง (Tilt Sensor) หลักๆ ก็คือสวิตช์ตัวนึง ที่จะอยู่ในสถานะเปิด (Open) เมื่อขาของมันชี้ขึ้นด้านบน และจะอยู่ในสถานะปิด (Closed) เมื่อเราหมุนมัน 180 องศา

เจ้าอุปกรณ์ชิ้นนี้ให้วิธีที่ง่ายที่สุดในการแสดงสถานะทั้งสองของนาฬิกาทราย โดยไม่ต้องพึ่งเซ็นเซอร์หรือไลบรารีเพิ่มเติมให้วุ่นวาย
ตรรกะทางเทคโนโลยีและอัลกอริทึมแอนิเมชัน
ระบบของเรามีความสมจริงทางภาพได้ด้วย Pixel-Mapped Animation:
- สวิตช์แรงโน้มถ่วง (The Gravitational Toggle): โค้ดจะอ่านสถานะของเซ็นเซอร์เอียง ถ้าสถานะตรงกับทิศทาง "พลิกกลับ" ระบบจะเรียกใช้การรีเซ็ตทั้งหมด และเริ่มต้นค่าเวลา `countDownStartTime` ใหม่
- การสุ่มการไหลของเม็ดทราย (Particle Flow Randomization): เพื่อหลีกเลี่ยงการไหลที่ดูเป็นเส้นตรงแบบหุ่นยนต์เกินไป เราใช้เมล็ดสุ่ม `random()` เพื่อทำให้พิกัด X ของเม็ดทรายที่ตกลงมาเปลี่ยนแปลง สร้างเอฟเฟกต์ "กองทราย" แบบยุ่งเหยิงเหมือนทรายจริงๆ
- แดชบอร์ดแสดงเปอร์เซ็นต์ (The Percentage Dashboard): ในเวลาเดียวกัน ตัวจับเวลาที่คำนวณจากคณิตศาสตร์จะแสดงเปอร์เซ็นต์ของเวลาที่ผ่านไป (0-100%) ที่ด้านบนของจอ ทำหน้าที่เป็นทั้งนาฬิกาและแถบแสดงความคืบหน้า
- โปรโตคอลรีเฟรชบัฟเฟอร์ (Buffer Refresh Protocol): จอ OLED จะถูกล้างและวาดใหม่ทุกๆ 100ms โดยการอัปเดตเฉพาะ "บริเวณที่ทรายกำลังตก" โปรเจกต์นี้ช่วยลดการใช้งานบัส I2C ทำให้การจำลองภาพลื่นไหล
ทีนี้มาดูกันว่าเจ้าเครื่องนี้ทำงานยังไงในสภาวะจริง ทันทีที่เปิดหน้าจอ นาฬิกาทรายจะปรากฏในตำแหน่งเริ่มต้น และเม็ดทรายจะไหลจากภาชนะด้านบนไปด้านล่างแบบสุ่ม เวลาที่ทรายทั้งหมดไหลจากบนลงล่างถูกตั้งไว้ในโค้ด ซึ่งในกรณีนี้ตั้งไว้ที่ 1 นาทีพอดี ที่ด้านบนเหนือนาฬิกาทราย จะแสดงเปอร์เซ็นต์เวลาที่ผ่านไปตั้งแต่เริ่มไหลจนถึงขณะนั้น

ในกรณีนี้ เราจะเห็นแอนิเมชันบางอย่างในพื้นหลังด้านบนและล่าง รวมถึงตอนที่เม็ดทรายไหล เพื่อให้นาฬิกาทรายดูสมจริงที่สุด เมื่อทรายไหลหมด (ก็คือครบ 60 วินาที) เราก็สามารถพลิกนาฬิกา 180 องศา แล้วการนับถอยหลังก็จะเริ่มต้นใหม่อีกครั้ง ถ้าเราหมุนนาฬิกาทรายตอนไหนก็ตาม มันจะเริ่มนับเวลาถอยหลังใหม่ตั้งแต่ต้นเลย
ทีนี้มาพูดถึงโค้ดสักหน่อย ต้องบอกเลยว่ามันไม่ได้ถูกออปติไมซ์สมบูรณ์แบบ มันถูกแบ่งออกเป็นหลายส่วน แต่ทั้งหมดนี้ก็เพื่อให้ปรับแต่งได้ง่ายขึ้นนั่นเอง อย่าเพิ่งช็อตนะตัวนี้!

เริ่มต้นง่ายๆ เลยครับน้อง เพียงแค่เปลี่ยนค่าคงที่ (constants) ในโค้ด ก็สามารถปรับทุกพารามิเตอร์ได้หมดเลย ตั้งแต่ขนาดและรูปร่างของภาชนะแก้ว ปริมาณทราย ระยะเวลาและความเร็วในการไหลของทราย พารามิเตอร์ของโดม ไปจนถึงความเข้มข้นของอนิเมชันและจำนวนอนุภาคที่ตกลงมา
ทำไมโปรเจคนี้ถึงสำคัญ
การฝึกฝนทักษะ การวาดในระดับพิกเซลและการซิงค์เซ็นเซอร์กับหน้าจอ เป็นพื้นฐานที่จำเป็นมากสำหรับ การออกแบบ UI/UX และการพัฒนาเกมสำหรับระบบฝังตัว (Embedded) มันสอนให้เรารู้วิธีสร้าง "ปฏิสัมพันธ์เชิงกายภาพ (Embodied Interaction)" — ที่การเคลื่อนไหวทางกายภาพของอุปกรณ์ส่งผลให้เกิดการตอบสนองดิจิทัลทันที นอกเหนือจากนาฬิกาแปลกๆ แล้ว หลักการเดียวกันนี้ยังถูกใช้ใน เครื่องมือวินิจฉัยแบบพกพา, ระบบวัดมุมในอุตสาหกรรม และ จอแสดงผลดิจิทัลแบบอินเทอร์แอคทีฟ การสร้างโปรเจคนี้พิสูจน์แล้วว่าน้องสามารถใช้อุปกรณ์ฮาร์ดแวร์ง่ายๆ มาสร้างตรรกะการทำงานที่ซับซ้อนและน่ามองได้
และสุดท้ายนี้ สรุปสั้นๆ ให้ฟัง โปรเจคเริ่มต้นที่ทั้งสวยงามและใช้งานได้จริงนี้ ใช้แค่อุปกรณ์สามชิ้นเท่านั้นในการสร้าง แต่ในขณะเดียวกันก็ปรับแต่งได้สูงมาก จนเราสามารถเปลี่ยนพารามิเตอร์ทางกายภาพทั้งหมดได้อย่างเกือบจะไม่จำกัด ตามไอเดียที่เรามีว่าอุปกรณ์แบบนี้ควรทำงานยังไง ตัวโครงสร้างทั้งหมดถูกติดตั้งในกล่องที่ทำจากแผ่น PVC หนา 3mm และหุ้มด้วยวอลล์เปเปอร์ติดเองสีสันสดใส จัดไปวัยรุ่น!