สวัสดีครับ ตอนนี้ผมกำลังเรียน Software Engineer ภาค Inter อยู่ที่มหาลัยที่ร้อนที่สุดย่านลาดกระบัง ทีนี้เนื่องจากว่าผมเลือกลงเรียนฝั่ง Mobile เลยมีวิชา Microprocessor และวิชา Embedded Systems ที่ผมต้องทำ Project ที่เป็น Hardware
มาดูวิดีโอกันก่อนดีกว่า
เวอร์ชั่นแรก
คือว่าวิชา Microprocessor ที่ผมเรียนต้องใช้ MCU เป็น ARM Cortex-M3 กับบอร์ด LPCXPresso LPC1769 งงสิครับ ปรกติใช้แต่ Arduino พอเจอบอร์ดนี้คู่กับ IDE ที่ไม่คุ้นตา เลยเลือกทำเครื่องทำค๊อกเทลแล้วกัน ผมกับเพื่อนผม@warakornjet เลยคิดว่าทำอันนี้ละกัน ไม่ยากไม่ง่ายเกินไป
requirements คร่าวๆ
- มีเมนูให้เลือกเครื่องดื่มได้หลากหลาย
- สามารถกำหนดปริมาตรของเครื่องดื่มที่ต้องการได้
- แต่ละสูตรมีการกำหนดส่วนผสมด้วยอัตราส่วนได้
ต่อไปก็เริ่มออกแบบตัวเครื่อง หลังจากที่เคยได้ลองออกแบบด้วย CAD ในโปรเจ็คก่อนๆ แล้วพบว่าทำให้ข้อผิดพลาดด้าน Design ลดลงมาก ผมเลยเลือกออกแบบในคอมด้วย Fusion 360 เหมือนเดิม
ส่วนประกอบของเครื่องได้แก่
- บอดี้ทำจากอะครีลิคหนา 2 มม. ตัดด้วยเครื่อง Laser CNC
- ปั๊ม Diaphragm 12 โวลต์ (จริงๆ ควรจะใช้ปั๊มแบบ Peristaltic แต่ว่ามันแพงไปหน่อยสำหรับโปรเจ็คส่งอาจารย์)
- โมดูลขับมอเตอร์ L298N
- LPCXPresso LPC 1769 MCU (อาจารย์บังคับ TT)
- หน้าจอ TFT ILI9341
- ปุ่ม Push button
- Adapter 12v และ 3.3v regulator สำหรับจ่ายให้ MCU
รายละเอียดโปรแกรมและอื่นๆ ผมขอให้ไปดูที่ Documents ของโปรเจ็คนะครับ(ให้เขียนหมดน่าจะยาวเกินไป) แต่ผมขอพูดถึงหลักการคร่าวๆ ในการควบคุมปั๊มให้จ่ายของเหลวตามปริมาตรที่เราต้องการ โดยเวลาเป็นตัวกำหนด แต่ก่อนอื่นเราต้องรู้อัตราการไหลของน้ำที่ปั๊มสามารถทำงานได้(หน่วยเป็นมิลลิลิตรต่อวินาที) แล้วเราจะสามารถคำนวนเวลา(เป็นวินาที)ที่ปั๊มต้องทำงานได้ง่ายๆ
เวลาที่ปั๊มต้องทำงาน[milliseconds] = (ปริมาตรที่ต้องการ[ml.] / อัตราการไหล[ml./s]) * 1000;
ผมจะไม่ใช้วิธีการ delay(ms) แบบธรรมดา ในการรอให้ปั๊มทำงาน เนื่องจากจะไป Block การทำงานของ MCU ทำให้เราไม่สามารถทำอย่างอื่นได้ เช่นการอัปเดทหน้าจอแสดงผลว่าได้จ่ายเครื่องดื่มมากี่เปอร์เซ็นต์แล้ว ดังนั้งจึงต้องใช้วิธีการจับเวลาแทน
วิธีการก็คือเรียกใช้ฟังก์ชัน millis() ซึ่งจะรีเทิร์นเวลาตั้งแต่เปิด mcu ขึ้นมา(หน่วยเป็น milliseconds) อยากให้ปั๊มหยุดทำงานเมื่อไหร่ก็ไปคำนวณมาว่าต้องใช้กี่ milliseconds แล้วเอาไปบวกกับค่าที่ได้จาก millis() (ขอตั้งชื่อตัวแปรนี้ว่า dispStopTime1) แล้วก็เขียน logic เช็คใน main loop ว่าค่าจาก millis() นั้นเกินค่าของ dispStopTime1 รึยัง ถ้ายังก็ให้ปั๊มทำงาน แต่ถ้าเกินแล้วก็ให้หยุดการทำงานของปั๊ม
ใครอยากไปดูโค้ดยาวๆ จิ้มที่นี่ได้เลย

เวอร์ชั่นสอง
เวอร์ชั่นสอง สิ่งที่เปลี่ยนแปลงหลักๆ คือเปลี่ยน MCU เป็น ESP32 เอาปุ่มและจอ TFT ออก แล้วใช้โทรศัพท์ Android เป็นตัวสั่งการแทน และการสแกนจ่ายเงินด้วย QR Code พร้อมเพย์ที่เป็นมาตราฐานของประเทศไทย
โทรศัพท์สามารถเสียบลงไปในช่องด้านบนได้เลย ทำให้ตอนนี้เครื่องเป็นระบบ Android จอสัมผัส ลื่นปรื้ดด ตอบสนองและใช้งานง่ายสุดๆ ตัวโทรศัพท์ Android นั้นทำหน้าที่ทุกอย่างตั้งแต่เป็น GUI ให้ผู้ใช้, ดึงข้อมูลสูตรเครื่องดื่มและรูปมาจาก Server, ติดต่อกับ Backend ระบบจ่ายเงิน และคำนวณปริมาตรที่แต่ละปั๊มต้องจ่ายออกมา เมื่อระบบยืนยันการจ่ายเงินแล้ว ตัวโทรศัพท์ Android จะส่งข้อมูลไปให้ ESP32 ว่าให้แต่ละปั๊มจ่ายออกมากี่มิลลิลิตร แล้วตัว ESP32 ก็จะทำงานควบคุมปั๊มให้ตามนั้น
การต่อวงจรของเวอร์ชั่นนี้ค่อนข้างเรียบง่าย แต่เอาปั๊มออกตัวนึงเพราะทดลองแค่ 3 ตัวก็พอ
ส่วนระบบการจ่ายเงินด้วย QR Code นั้นต้องไปใช้บริการจาก Payment Gateway ที่ชื่อว่า GB PrimePay ซึ่งรองรับการสร้าง QR Code แบบ Dynamic ด้วย API
ซึ่ง Process การชำระเงินที่ผมทำจะเป็นดังนี้
- Android ไป Generate transaction ID จาก Firebase API ที่ผมสร้างขึ้นจาก Firebase Functions
- Android ส่ง transaction ID, จำนวนเงินที่ต้องจ่าย และรายละเอียดต่างๆ ไปที่ API ของ GB PrimePay และทาง API จะ Return ข้อมูลสำหรับสร้าง QR Code กลับมา
- สร้าง QR Code ให้ลูกค้าชำระ
- หากการชำระเสร็จสิ้นสำเร็จ GB Primepay จะยิง Webhook มาที่ Firebase Functions ของผม
- Firebase บันทึกข้อมูลลง Realtime Database
- Android ได้รับการเปลี่ยนแปลงข้อมูลใน Realtime Database ว่าการชำระเงินสมบูรณ์ จึงทำการเปลี่ยนหน้าไปขั้นตอนต่อไป

Tech Stack ที่ใช้ทั้งหมดก็จะประมาณนี้
และแน่นอนครับ โค้ดและเอกสารทั้งหมด แบบเต็มๆ สามารถดูได้จาก Github นี้

หวังว่าบล๊อคนี้จะช่วยเป็นไอเดียในการนำ Microcontroller มาประยุกต์ใช้ในชีวิตประจำวันได้
สำหรับบล๊อกนี้ สวัสดีครับ
สวัสดีครับ การทดลองของคนดีมากครับ ผมอยากทำเป็นการจ่ายเงินเข้าห้องพักรีสอร์ท เมื่อแขกเข้ามาหน้าห้องสามารถเปิดด้วย QR code ได้ ขอเบอร์ติดต่อคุณครับ
ถูกใจถูกใจ