ชื่อโปรเจกต์: Riddle Keypad Project (TEJ3M Summative)
ปริศนาพาเพลิน: ฝ่าด่าน Hardware Logic
"โปรเจกต์ Riddle Keypad" นี้คือการเจาะลึกการออกแบบ Embedded System แบบเน้นๆ ซึ่งเป็นโปรเจกต์จบของหลักสูตร TEJ3M งานนี้เราจะฉีกกฎระบบ "Password Entry" หรือการกรอกรหัสผ่านแบบจืดๆ ทั่วไป โดยบังคับให้ User ต้องไขปริศนาที่โชว์บนจอ LCD แล้วกดคำตอบผ่าน 4x4 Matrix Keypad บอกเลยว่างานนี้ไม่ได้มีดีแค่การเขียน Code หลังบ้านนะน้อง แต่มันคือการรีดประสิทธิภาพ User Interface (UI) ออกมาให้สุดด้วย
แก้ปัญหา Pin ไม่พอใช้ (Pin Constraint)
ปกติแล้วจอ LCD 16x2 ทั่วไปต้องใช้ Digital Pins ถึง 6 ขา ส่วน Keypad 4x4 ก็ล่อไปอีก 8 ขา ถ้าใช้ Board Arduino Uno นี่บอกเลยว่า Pins แทบไม่เหลือให้ไปต่อ Sensor หรือ Actuator ตัวอื่นแล้ว
- I2C Efficiency: เพื่อแก้ปัญหานี้ พี่เลยจัด Sunfounder I2C LCD มาใช้ซะเลย โดยผ่าน Protocol Inter-Integrated Circuit (I2C) ทำให้ควบคุมจอได้โดยใช้แค่ 2 ขา (SDA/SCL) ทีนี้เราก็เหลือ Pins 2 ถึง 9 ไว้ใช้งานกับ Keypad Matrix ได้แบบหล่อเท่เลย
- Matrix Scanning: ในส่วนของ Code เราใช้ Library
Keypad.hมาช่วยสแกน Row และ Column ด้วยความถี่สูง เพื่อเช็คว่าจุดตัดไหนโดนกดลงไปจริงๆ
ปั้น UI/UX ให้เนียน: Cursor และ Logic การแสดงผล
การจะโชว์คำถามปริศนาไปพร้อมๆ กับแสดงผลที่ User พิมพ์ลงบนจอ LCD 16x2 เล็กๆ นี่ถือเป็นโจทย์ที่ท้าทายมาก:
- Static vs. Dynamic Content: บรรทัดบนเราจะล็อคไว้โชว์คำถาม (Static) ส่วนบรรทัดล่างจะอัปเดตตามที่ User กดปุ่มเข้ามา (Dynamic)
- Cursor Management: แทนที่จะทำ Loop ให้มันเลื่อนไปมา (Horizontal Scrolling) ซึ่งเดี๋ยวน้องจะมึนตับเอาบนจอเล็กๆ พี่เลยใช้ Logic "Character Replacement" แทน โดยให้ตัวอักษรใหม่ไปโผล่ในตำแหน่งที่กำหนดไว้เป๊ะๆ เพื่อให้ User โฟกัสได้ง่ายขึ้น
- State Machine Logic: ตัว Arduino จะคอยเทียบ String ที่พิมพ์เข้ามากับ "Answer Key" ที่เราตั้งไว้ตลอดเวลา ถ้ามัน Match กันปุ๊บ ก็จะสั่งเปลี่ยนเป็น "Correct" State ซึ่งในงานจริงๆ น้องจะเอาไปสั่งงาน Servo-motor ให้ปลดล็อค หรือเปิด Gate อะไรก็จัดไปวัยรุ่น
บทบาทวิศวกรในโลกความจริง
โปรเจกต์นี้จำลองการทำงานในระดับมืออาชีพที่ต้องเอางานหลายส่วนมาจอยกัน ทั้ง Programmer ที่ต้องคุมเรื่องการรวม Library และ Logic, Designer ที่ดูเรื่อง Mechanical และ Housing ที่ทำจาก 3D-printed (ใช้ Dremel Slicer) และ Engineer ที่ต้องเช็คว่าการ Wiring ของจริงมันต้องแน่นและ Noise-free สัญญาณนิ่งๆ
บอกเลยว่ากว่าจะจบงานนี้ พี่ต้องรื้อแก้โค้ดไปหลายรอบมาก ปัญหาแรกที่เจอคือตอนออกแบบ ในตอนแรกพี่กะจะใช้ [LCD](https://s.shopee.co.th/6AfsSPcAnb) ใน Tinkercad แต่มันกิน Port ของ [Arduino](https://s.shopee.co.th/7fUgFAWSki) เยอะเกินไปจนไม่มีที่เหลือให้ต่อ Keypad พี่เลยแก้เกมด้วยการใช้ Sunfounder LCD แทน ทำให้เหลือที่ใช้แค่ 4 Port (Analog 2 ขา, Ground 1 ขา, Power 1 ขา) ทีนี้ก็เหลือ Port 2-9 ไว้ใช้กับ Keypad ได้สบายๆ อีกเรื่องที่ปวดหัวคือการวางตำแหน่งตัวเลข โค้ดตอนแรกใช้บรรทัดเดียว แต่พี่อยากให้มันโชว์คำถามปริศนาด้วยแล้วให้คำตอบคือรหัสผ่าน พอคำถามมันยาวจนกินไปสองบรรทัด พี่เลยต้องเปลี่ยนตำแหน่งตัวเลขที่โชว์ตอนเราพิมพ์ ปัญหาก็คือไอ้ `lcd.setCursor` มันดันไปผูกกับ Variable `data_count` แถมอยู่ใน Loop อีก ทำให้จะย้ายตำแหน่งเริ่มต้นไปไว้กลางจอนี่ทำยากฉิบ... ตอนแรกกะจะให้บรรทัดบนเลื่อนไปมาแต่ Arduino มันไม่มีฟังก์ชันนี้มาให้ในตัว ถ้าจะทำต้องเขียน custom for loop เอง ซึ่งพี่มองว่ามันจะทำให้โค้ดอ่านยากและซับซ้อนเกินความจำเป็น พี่เลยแก้ปัญหาด้วยการให้เลขใหม่ทับเลขเก่าในตำแหน่งเดิมไปเลย แทนที่จะเลื่อนตำแหน่ง Cursor ไปเรื่อยๆ ทุกครั้งที่กดปุ่ม วิธีนี้ทำให้โค้ดคลีนขึ้น อ่านง่ายขึ้น แถมฟังก์ชันการทำงานยังอยู่ครบ ส่วนที่ไหลลื่นสุดๆ คือช่วงแรกที่หัดใช้ Keypad library วิธีการ Setup และ Config ค่าให้แต่ละปุ่มนี่ถือว่าเรียนรู้ง่ายมาก โปรเจกต์แนวนี้เอาไปประยุกต์ใช้ในโลกจริงได้เพียบ เช่น ทำระบบปลดล็อคประตูหรือแผงควบคุม แค่เปลี่ยนจากคำว่า "Correct" ให้ไปสั่ง Motor หมุนเปิดล็อค หรือส่งสัญญาณ Analog ไปอุปกรณ์อื่นแทน ในการทำงานจริงเราจะแบ่งกันชัดเจน ทีมเขียนโค้ด (Programmers) ทีมออกแบบตัวเครื่อง (Designers/Engineers) และทีมประกอบ (Engineers) สู้งานนะน้อง!

Logic diagram ของตัว Code