ออกแบบและสร้าง "ลูกเต๋าดิจิทัล" ด้วย 7-Segment และเซ็นเซอร์วัดแสง (LDR)
เกี่ยวกับโปรเจกต์นี้:
นี่คือโปรเจกต์ลูกเต๋าดิจิทัลง่ายๆ ที่ใช้จอแสดงผล 7-Segment หลักเดียว ง่ายโคตรๆ เพราะสิ่งที่ต้องทำก็แค่เอานิ้วไปแตะหรือบังตัวต้านทานไวแสง (LDR) ด้านบน มันแสดงให้เห็นหลักการของ Embedded Systems โดยเปลี่ยนจากการกดปุ่มแบบเดิมๆ มาใช้ "เงา" หรือการเอานิ้วไปบัง LDR เพื่อสั่งให้ลูกเต๋าสุ่มตัวเลขแทน
อยากเห็นมันทำงานยังไงเหรอ? ไปดูคลิปตัวอย่างกันเลย!
ลงลึกกับจอแสดงผล 7-Segment 1 หลัก
เจาะลึก 7 segment display 1 หลัก:

จอแสดงผล 7-Segment ประกอบด้วย LED 7-8 ดวง (รวมจุดทศนิยมหรือ DP) เรียงเป็นรูปเลข 8 การจะแสดงเลขอะไรก็ตาม เราต้องควบคุมสถานะเปิด/ปิดของแต่ละเซ็กเมนต์ LED ตามแพตเทิร์นที่กำหนด แต่ละเซ็กเมนต์จะมีตัวอักษรกำกับและต่อเพื่อให้ LED ดวงนั้นๆ ติด ต่อไปพี่จะอ้างอิงจากรูปนี้เวลาอธิบายการต่อสาย (เช่น ขา C ต่อกับ Pin 5) การเข้าใจโครงสร้างนี้สำคัญมาก เพราะถ้าต่อผิดแม้แต่ขาเดียว ตัวเลขที่แสดงก็จะเพี้ยนทันที
รายละเอียดการต่อวงจรฮาร์ดแวร์
ในโปรเจกต์นี้ เรามีส่วนหลักๆ ที่เชื่อมโยงกันสองส่วนคือ ส่วนรับอินพุต (เซ็นเซอร์) และส่วนแสดงผลเอาต์พุต
1. ส่วนเซ็นเซอร์ LDR (ตัวต้านทานไวแสง)
LDR เป็นเซ็นเซอร์ที่มีค่าความต้านทานเปลี่ยนไปตามความเข้มของแสงที่ตกกระทบ เพื่อให้ Arduino อ่านค่ามันได้ เราต้องตั้งวงจร แบ่งแรงดัน (Voltage Divider) ดังนี้:
- Photoresistor/LDR ขาแรกต่อกับไฟ 5V
- Photoresistor/LDR ขาที่สองต่อกับตัวต้านทาน 10 KΩ ลงกราวด์ (GND) และขานี้ก็ต่อกับขา A0 บน Arduino Uno ด้วย
เมื่อเราเอามือไปบัง LDR ค่าความต้านทานของมันจะเพิ่มขึ้น ทำให้แรงดันตกคร่อมตัวต้านทาน 10 KΩ ลดลง Arduino จะตรวจจับการเปลี่ยนแปลงของค่า Analog นี้และใช้มันเป็นสัญญาณทริกเกอร์เพื่อสุ่มตัวเลข
2. ส่วนจอแสดงผล 7-Segment
การจะขับ LED ในจอแสดงผล เราต้องใช้ตัวต้านทานจำกัดกระแส (Current Limiting Resistors) เพื่อป้องกัน LED เสียหาย:
- The1digit7segmentdisplay ต่อกับตัวต้านทาน 220Ω หลายๆ ตัวไปยังขาต่างๆ ของ Arduino

- นี่คือการต่อสายแบบเฉพาะเจาะจง ดูรูปด้านบนเพื่อดูว่าขาที่มีตัวอักษรบนจอแสดงผลหมายถึงเซ็กเมนต์ไหน
การวิเคราะห์ลอจิกซอฟต์แวร์
หัวใจของโปรเจกต์นี้อยู่ที่การแปลงค่า Analog จาก LDR ให้เป็นเหตุการณ์สุ่มตัวเลข
- การปรับเทียบ (Calibration): สภาพแสงในแต่ละห้องไม่เหมือนกัน คุณควรปรับค่า Threshold ในโค้ดให้เหมาะ เพื่อให้โปรเจกต์ทำงานได้แม่นยำที่สุด หมายเหตุ: คุณสามารถปรับค่าการตั้งค่าแสงในโค้ดให้ตรงกับสภาพแสงในห้องคุณได้
- การสุ่ม (Randomization): เมื่อค่าที่อ่านได้จาก
analogRead(A0)ต่ำกว่าค่า Threshold ที่ตั้งไว้ (เพราะมีเงามาบัง) โปรแกรมจะเรียกใช้ฟังก์ชันrandom(1, 7)เพื่อสุ่มตัวเลขตั้งแต่ 1 ถึง 6 - ลอจิกการแสดงผล: หลังจากได้ตัวเลขสุ่มมาแล้ว โค้ดจะใช้คำสั่ง
digitalWrite()ส่งสัญญาณไปยังพอร์ตต่างๆ ตามแพตเทิร์นที่กำหนดไว้ในฟังก์ชันย่อย (เช่น ถ้าสุ่มได้เลข 1 เซ็กเมนต์ B และ C ต้องถูกตั้งค่าเป็น HIGH)
ทิปส์โปรแบบช่างๆ:
ประหยัดชิ้นส่วน: ถ้าไม่อยากใช้ตัวต้านทาน 220 Ω ถึง 8 ตัว คุณสามารถเปลี่ยนการสั่ง
digitalWrite(_, HIGH);ทั้งหมดในโค้ด เป็นการใช้ค่าเริ่มต้นแบบนี้:digitalWrite(_, DEFAULT);ซึ่งจะอยู่ในคำสั่ง if พวกนี้จะตั้งค่าให้ LED ในแต่ละเซ็กเมนต์อยู่ในระดับกลางๆ จอจะได้ไม่ไหม้ :) หรืออีกวิธีคือ ลดความสว่างของจอเพื่อปกป้อง LED โดยเปลี่ยนจากการใช้สถานะHIGHปกติ มาใช้เทคนิค PWM แทนDebouncing (ดีบาวน์ซิ่ง): ในระดับวิศวะ การเพิ่มดีเลย์เล็กน้อยหลังจากตรวจจับแสง ช่วยป้องกันการสุ่มซ้ำซ้อนที่เกิดจากสัญญาณรบกวนของแสง (noise) ได้นะตัวนี้
โปรเจคนี้เป็นจุดเริ่มต้นที่เจ๋งมากสำหรับการเรียนรู้การจัดการอินพุท/เอาท์พุท (Input/Output) และการประยุกต์ใช้เซนเซอร์อย่างสร้างสรรค์ในชีวิตประจำวัน! สู้งานนะน้อง!