นี่คือนาฬิกาเรือนแรกที่พี่สร้างขึ้นในปี 2004 สมัยนั้นพี่ทำนาฬิกาด้วยไอซีดิจิตอลล้วนๆ
พี่ใช้ชิฟต์เรจิสเตอร์ (Shift Register) ขนาด 4 บิต เลยต้องใช้ตั้ง 33 ตัว! และเพื่อดับเบานซ์ (debounce) สวิตช์ 4 ตัว พี่ก็ใช้ลอจิกเกต NAND มาช่วยจัดการ ส่วนการสร้างสัญญาณนาฬิกา 1 Hz นั้น พี่ใช้ไอซีแบ่งความถี่ (divider) หลายตัวมาช่วยลดความถี่จากคริสตัล 1 MHz ลง ด้านหน้าตัวเรือน พ่อตาพี่เป็นคนสลักให้
แต่นาฬิกาเรือนนี้ก็โดนส่งขึ้นไปนอนบนห้องเก็บของ (อัตติก)
ตอนนี้พี่เกษียณแล้ว เลยหยิบมาปัดฝุ่นสร้างใหม่ด้วย Arduino นี่คือรูปนาฬิกาแบบเดิมที่พี่ทำไว้

พี่สร้างนาฬิกาใหม่โดยใช้การเชื่อมต่อ LED ทั้งหมด 60 + 12 จุด เลยต้องใช้ชิฟต์เรจิสเตอร์ 8 บิต จำนวน 9 ตัว อยู่ๆ พี่ก็ไปเจอ MM5451 ซึ่งเป็นชิฟต์เรจิสเตอร์ 35 บิต บนปริ้นท์บอร์ดที่ติดตั้งหน้าจอ 7-Segment LED ไว้ 5 ตัว พี่เลยเจาะแผงด้านหน้าแล้วติดตั้งหน้าจอพวกนั้นเข้าไป ดูรูปด้านล่างได้เลย
พี่เขียนรูทีนสำหรับอ่านและตั้งค่า RTC ขึ้นมาเอง เลยไม่ต้องโหลดไลบรารี RTC มาใช้ พี่ใช้พัลส์ 1 Hz SQW จาก RTC ผ่านพินอินเตอร์รัพต์ (interrupt pin) หมายเลข 2 บน Arduino ในลูปหลัก (main loop) โปรแกรมจะตรวจสอบสถานะของสวิตช์ 4 ตัว ซึ่งด้วยสวิตช์ 4 ตัวนี้ เราสามารถสร้างฟังก์ชันได้ถึง 16 แบบ
ด้านเทคนิค: การรักษาเวลาด้วย I2C และอนิเมชันซ้อนหลายชั้น
โปรเจคนี้เผยให้เห็นเลเยอร์ที่ซ่อนอยู่เบื้องหลังการเปลี่ยนเวลาเป็นแสงสว่างแบบเรียบง่าย:
- เลเยอร์ระบุตัวตน: โมดูล RTC DS3231 ทำหน้าที่เหมือนดวงตาจับเวลาความละเอียดสูง วัดทุกวินาทีได้แม่นยำด้วยคริสตัลภายในที่ชดเชยอุณหภูมิ
- เลเยอร์แปลงสัญญาณ: ระบบใช้พินดิจิตอลความเร็วสูงเพื่อรับพัลส์ PWM ความเร็วสูง เพื่อประสานงานงานสำคัญที่เกี่ยวกับการควบคุมแสง
- เลเยอร์อินเตอร์เฟซภาพ: วงแหวน LED 60+12 ดวง ให้ฟีดแบ็คภาพความละเอียดสูงสำหรับสถานะ "ชั่วโมง/นาที/วินาที" (เช่น วงนอก = วินาที, วงใน = ชั่วโมง)
- เลเยอร์ลอจิกประมวลผล: โค้ด Arduino ใช้กลยุทธ์ "การแมปพิกเซล" (หรือการจับเวลาซ้อนชั้น): มันตีความค่าจาก RTC และจับคู่กับดัชนี LED เพื่อสร้างรูปแบบการแสดงเวลาที่ปลอดภัยและเป็นจังหวะ
- ลูปการสื่อสารแบบไดอะล็อก: ค่าของเวลาจะถูกส่งไปยัง Serial Monitor เป็นจังหวะในช่วงปรับเทียบเริ่มต้น เพื่อประสานสถานะ
โครงสร้างพื้นฐานฮาร์ดแวร์-นาฬิกา
- Arduino Nano: "สมอง" ของโปรเจค จัดการการสุ่มตัวอย่าง I2C แบบหลายทิศทางและประสานการซิงค์วงแหวน LED
- วงแหวน LED (60/12 ดวง): ให้ "หน้าปัดเวลา" ที่แม่นยำสูงและเชื่อถือได้สำหรับทุกจุดบนนาฬิกา
- DS3231 RTC: ให้การรักษาเวลาที่มีความจุสูงและเชื่อถือได้เพื่อความแม่นยำในระยะยาว
- โครงหุ้มพิมพ์ 3 มิติ: ให้อินเตอร์เฟซทางกายภาพที่ชัดเจนและดูโปรเฟสชันนัล พร้อมปกป้องชิ้นส่วนภายใน
- แหล่งจ่ายไฟ 5V 2A: สำคัญสำหรับการจ่ายกระแสที่ชัดเจนและประหยัดพลังงานให้กับ LED สว่าง
- สาย Micro-USB: ใช้สำหรับโปรแกรม Arduino และเป็นอินเตอร์เฟซหลักสำหรับตัวควบคุมระบบ
ฟังก์ชันทั้ง 16 แบบมีดังนี้:
ฟังก์ชัน 1111: หน้าจอ: ว่างเปล่า LED: แสดงเวลา
ฟังก์ชัน 1110: หน้าจอ: แสดงเวลา LED: แสดงเวลาและอายุของดวงจันทร์ (ดูวิดีโอด้านล่าง) LED ที่กะพริบอยู่ที่ตำแหน่งที่ 46 หารด้วย 2 = 23 ดวงจันทร์มีอายุ 23 วัน LED ที่กะพริบจะเคลื่อนที่ 2 ตำแหน่งต่อวัน ดังนั้นสี่เฟสของดวงจันทร์คือ: เมื่อ LED กะพริบที่ตำแหน่งศูนย์ หมายถึง: ดวงจันทร์ดับ (new moon) ที่ตำแหน่ง 15 (หารด้วยสอง = 7.5 วัน) = ข้างขึ้นครึ่งแรก (first quarter) ที่ตำแหน่ง 30 (หารด้วยสอง = 15 วัน) = ดวงจันทร์เต็มดวง (full moon) ที่ตำแหน่ง 45 (หารด้วยสอง = 22.5 วัน) = ข้างแรมครึ่งหลัง (last quarter) จากดวงจันทร์ดับถึงดวงจันทร์ดับครั้งถัดไปคือ 29.5 วัน
ฟังก์ชันถัดไปทั้งหมดสำหรับ LED จะเป็น: แสดงเวลาและอายุของดวงจันทร์ (ยกเว้นฟังก์ชัน 1011) ดังนั้นพี่จะบอกแค่ว่าหน้าจอแสดงอะไรในฟังก์ชันถัดไป
ฟังก์ชัน 1101: วันที่
ฟังก์ชัน 1100:
มุมสูงสุดของดวงอาทิตย์ (ขึ้นอยู่กับละติจูด)
ฟังก์ชัน 1011: วินาที
ฟังก์ชัน 1010: จำนวนวันนับตั้งแต่วันที่ 1 มกราคม
ฟังก์ชัน 1001: เวลาพระอาทิตย์ขึ้น (ขึ้นอยู่กับละติจูด)
ฟังก์ชัน 1000: วันของสัปดาห์
ฟังก์ชัน 0111: ปี
ฟังก์ชัน 0110: ความยาวของวัน (หน่วยชั่วโมง)
ฟังก์ชัน 0101: มุมเอียงของโลก
ฟังก์ชัน 0100: ปรับตั้งค่า (เวลา, วันที่, การปรับเวลา และเรจิสเตอร์ aging ของ RTC)
ฟังก์ชัน 0011: อายุของดวงจันทร์ (หน่วยวัน)
ฟังก์ชัน 0010: วินาทีนับตั้งแต่เที่ยงคืน (สูงสุด = 86400)
ฟังก์ชัน 0001: เวลาพระอาทิตย์ตก (ขึ้นอยู่กับละติจูด)
ฟังก์ชัน 0000: มุมสูงจริงของดวงอาทิตย์ (ขึ้นอยู่กับละติจูด)
ขั้นตอนการทำงานและควบคุมนาฬิกาแบบอัตโนมัติ
กระบวนการจำลองนาฬิกาดิจิทัลนี้ออกแบบมาให้มีประสิทธิภาพสุดๆ:
- จัดเตรียมพื้นที่ทำงาน: จัดวางวงแหวน LED และโมดูล RTC ลงในเคสให้ถูกต้อง แล้วต่อสาย I2C ให้เรียบร้อย อย่าลืมเช็คขั้วนะน้อง!
- ตั้งค่าการซิงค์แบบพลังสูง: ในสเก็ตช์ Arduino ให้เริ่มต้นการสื่อสารกับ shift register และเรียก
rtc.begin()พร้อมกำหนดพินต่างๆ ในฟังก์ชันsetup()ให้เรียบร้อย - ลูปการทำงานภายใน: นาฬิกาจะทำการตรวจสอบเวลาอย่างต่อเนื่องด้วยประสิทธิภาพสูง และอัพเดทตำแหน่งไฟ LED ในแบบเรียลไทม์ตามเวลาปัจจุบัน
- ผสานการแสดงผลและข้อมูล: ดูเถิด นาฬิกาของเธอจะกลายเป็นสัญญาณสถานะที่มีจังหวะ พร้อมกะพริบและเปลี่ยนไปตามการตั้งค่าตารางเวลาของเธอเอง
แนวทางการพัฒนาต่อในอนาคต
- เพิ่ม OLED Identity Dashboard: ต่อจอ OLED ขนาดเล็กด้านหลังนาฬิกาเพื่อแสดง "วันที่/วัน" หรือ "อุณหภูมิ (C)" สวยๆ
- ซิงค์กับเซ็นเซอร์สภาพอากาศหลายตัว: ต่อ "เซ็นเซอร์สัมผัส" พิเศษเพื่อสั่ง "ปิดการเตือน" แบบไร้สายด้วยความแม่นยำสูงผ่านลอจิก
- เพิ่มการซิงค์กับคลาวด์: สร้างเว็บแดชบอร์ดเฉพาะทางบนสมาร์ทโฟนผ่าน WiFi/BT เพื่อติดตามและบันทึกประวัติเวลารวมอย่างแม่นยำ
- ปรับแต่งโปรไฟล์ขั้นสูง: เพิ่มฟีเจอร์ "ปรับความสว่างอัตโนมัติ" ในโค้ด เพื่อให้รูปแบบการแสดงผลเปลี่ยนไปตามแสงแวดล้อมโดยอัตโนมัติด้วยเซ็นเซอร์วัดแสง!
นาฬิกาดิจิทัลแบบ 60+12 LED นี้เป็นโปรเจกต์ที่เพอร์เฟกต์สำหรับสายวิทย์-ช่าง ที่มองหาเครื่องมือบอกเวลาที่มีปฏิสัมพันธ์และน่าสนใจมากกว่าปกติ!
[!TIP] ใช้ RTC แบบ DS3231 แทน DS1307 เพื่อความแม่นยำในระยะยาว จะได้ไม่ต้องมาปรับเวลาใหม่บ่อยๆ นะตัว!