2,160 ชั่วโมงกับการทำ Senior Project [ตอนที่ 2]

Phiraphong Lamun
5 min readJun 15, 2017

--

เมื่อโรงเรือนเพาะปลูกพืชเสร็จเรียบร้อยแล้วพร้อมที่จะส่งค่าขึ้นระบบคลาวด์ ในส่วนต่อมาก็จะเป็นส่วนที่ผมรับผิดชอบเป็นหลักเลยก็ว่าได้ ก็คือการทำแอปพลิเคชันแอนดรอยด์ ซึ่งในตอนนี้เนื้อหาส่วนใหญ่ก็เลยจะเป็นการพัฒนาแอปพลิเคชันนั่นเองครับ เพื่อไม่ให้เสียเวลา งั้นเราลองไปติดตามกันเลยนะครับ ^^-

1. เริ่มต้นกับ Feature ของ Application Smart Greenhouse

สำหรับ Feature ที่คิดจะทำนั้นก็มีค่อนข้างเยอะพอสมควร

พอนั่งคิดไปๆ ก็มีความคิดอยากทำนู้นทำนี้ มาเรื่อยๆ อ๋อยยยย…. จะเสร็จไหมนะ ถึงจุดๆนี้ก็เลยตัดสินใจ เอาแค่งานหลักๆให้เสร็จก่อน เช่น การแสดงค่าสถานะ การควบคุมอุปกรณ์ภายในโรงเรือน เป็นต้น เมื่องานหลักเสร็จก็ค่อยมาเก็บงานรองๆตามกันมา

ในเมื่อมี Feature แล้ว ไหนๆ ก็เขียน Story และ Scenario เลยละกัน เพื่อจะได้เอาไว้ใช้ Test ในอนาคตอีกด้วย

ซึ่ง Story จะเขียนในรูปของ

ในฐานะที่ฉันเป็น…. (As a…) [e.g. User, Admin, Farmer]

ฉันต้องการ…(I want to …)

เพื่อที่จะ….(So that …) อาจจะงงๆหน่อยนะครับ แฮ่รๆ ลองดูตัวอย่างกันนะครับ

ใน Story ที่ 1 นะครับจะได้ว่า… “ในฐานะที่ฉันเป็นผู้ใช้งาน ฉันต้องการทราบค่าอุณหภูมิภายในโรงเรือน ณ เวลาปัจจุบันผ่านอินเทอร์เน็ต เพื่อที่จะสามารถตัดสินใจในการเปิดระบบทำความเย็นได้”

ซึ่งประโยคสุดท้าย So that… คือประโยชน์ของสิ่งที่ต้องการนะครับ

ต่อไปจะเป็นส่วนของ Scenario (เหตุการณ์) มีรูปแบบเป็น

Title ชื่อเหตุการณ์ หรือสถานการณ์ที่มีการใช้ Feature นี้

Given เงื่อนไขเริ่มต้นของเหตุการณ์

When เมื่อผู้ใช้ทำอะไร

Then จะเกิดอะไรขึ้น

ตัวอย่างเช่น……

2. การทำ Phototype

พอได้ Feature มาแล้วผมก็จะมาออกแบบ Prototype ออกมาให้เห็นหน้าตาคร่าวๆ ว่าเป็นลักษณะไหน เพื่อที่จะทำให้เขียนโค้ดได้สะดวกและเร็วขึ้น ซึ่งผมก็เลยลองวาดในกระดาษดู เป็นวิธีที่เร็วและประหยัดที่สุด สำหรับตัวผม 555 แต่การออกแบบบนกระดาษมันก็มีข้อเสียคือ เราไม่เห็นผลลัพธ์ที่มันชัดเจน

ตอนหลังก็เลยหาโปรแกรมที่ทำ Prototypeing Tools เลยได้รู้จักจากพี่ๆที่เขียนบทความรีวิวกันไว้ เช่น

มีหลายตัวที่น่าใช้มาก ผมก็เลยลองโหลด Skecth มาเล่นดู แต่มันทำงานได้บน Mac เท่านั้นเนี่ยสิ(แอบใช้ Mac ของคณะก็ได้ แฮ่รๆ)

และที่สำคัญมันไม่ฟรีนะจร๊ ก็เลยได้ทดลองใช้ 30 วัน ซึ่งก็โอเครเลยละ ถ้ามีตังต้องซื้อเก็บเป็นไอเทมสักชิ้นละ แต่……. Mac เราก็ยังไม่มีนะ T^T

ตัวต่อมาก็เป็นเจ้า JUSTIMIND ซึ่งก็รองรับทั้ง Mac และ Windows เย้ๆ โหลดมาเล่นสิครับ รออะไร…

และก็ยังมีอีกหลายๆตัวที่น่าสนใจนะครับ สามารถเลือกใช้ได้ตามความชอบ ซึ่งทั้งสองตัวนี้สามารถเข้าไปทดลองใช้ได้ที่

3. การตั้งชื่อไฟล์และตัวแปร

การตั้งชื่อไฟล์และตัวแปรนั้นก็สำคัญมากกกกกกกกกก!! ต้องตั้งให้สื่อความหมาย เพื่อที่จะได้ให้คนอื่นเข้าใจ และตัวเราเองเมื่อย้อนกลับมาดูโค้ดที่เคยทำไว้ จะได้ไม่มานั่ง งง ไล่โค้ดไปไล่โค้ดมาเพื่อหาว่ามันมีไว้ทำอะไร ดังนั้นหลักการของผมคือตั้งชื่อยาวและสามารถเข้าใจได้ หรืออย่างที่พี่ Ake ได้บอกไว้ว่า “ ชื่อยาวและเข้าใจ สำคัญกว่าชื่อย่อสั้นๆแต่เข้าใจยาก” และพยายามเลี่ยงการตั้งชื่อตัวแปร เช่น a1, dog, t เป็นต้น ไม่งั้นละก็จะเป็นแบบนี้ …

มันเกิดจากการที่เรายอมเพื่อนที่ทำด้าน End device ซึ่งทำมาก่อนหน้าและเสร็จแล้ว บาปเลยตกมาอยู่ที่เรา 555 ขอแค่ครั้งนี้พอเลย มึนกันเลยละครับ ถ้าไม่ comment ไว้

ไฟล์ Java ก็จะใช้หลักการตั้งชื่อแบบ CamelCase

ถ้าเป็นชื่อไฟล์จะมีลักษณะการตั้งชื่อแบบ UpperCamelCase คือขึ้นต้นด้วยตัวใหญ่ไม่มีการคั่นด้วยสัญญลักษณ์ — และ_ พร้อมทั้งระบุชื่อคลาสตามหลังเสมอ เช่น LoginActivity, MainFragment เป็นต้น

ส่วนถ้าเป็นตัวแปร Java จะเป็นแบบ lowerCamelCase คือ คำแรกเป็นตัวเล็กต่อไปขึ้นต้นด้วยตัวใหญ่ เช่น tempIncome, tvAddress เป็นต้น

ถ้าเป็นตัวแปรแบบ ค่าคงที่ ( Constant) จะมีลักษณะแบบ uppercase characters separated by underscores ตัวใหญ่และมีสัญลักษณ์ _ คั่น เช่น PI = 3.14, KEY_ITEM = “ATyU5” เป็นต้น

ถ้าเป็นไฟล์ XML ก็จะมีรูปแบบเป็น Underscrore ตัวอักษรเล็กและมีเครื่องหมาย _ คั่น มีการระบุประเภทไฟล์ XML นำหน้าเสมอ เช่น activity_setting_greenhouse, fragment_account_greenhouse เป็นต้น

บางทีก็เผลอตัวตั้งชื่อผิดเหมือนกัน แฮ่รๆ ^^ ก็คงต้องฝึกและมีสติในการตั้งชื่อเสมอ จนทำให้ชิน เพื่อที่โค้ดจะได้เข้าใจง่ายเนอะ……

4. Ctrl + Alt + L โคตร!!! สำคัญ

เป็น Shortcuts ของคำสั่ง Reformat code ถ้าเป็น mac จะใช้ Command + Option + L ซึ่งจะช่วยให้โค้ดของเราจัดอยู่ในรูปแบบที่ถูกต้อง จัดการย่อหน้าโค้ด จัดโค้ดที่มีความยาวเกิน

เมื่อทำการกด Ctrl + Alt + L

โค้ดก็จะจัดอยู่ในรูปที่สวยงาม การจัดโค้ดที่เป็นระเบียบจะทำให้เราเข้าใจง่าย และที่สำคัญเพิ่มความสุขในการเขียนโค้ดอีกด้วย

5. จัดการกับ Dimension แล้วชีวิตจะสบาย

Dimension ทุกๆตัวควรเก็บไว้ในโฟลเดอร์ Values ในไฟล์ Dimension.xml เพื่อที่จะได้จัดการกับขนาดส่ิ่งต่างๆได้ง่าย การกำหนดค่าไว้ใน Layout นั้นถือว่าเริ่มเป็นคนเทาๆแล้วละครับ อาจถึงกับมืดเลยทีเดียว เพราะไฟล์ Layout มีหน้าที่แค่บอกว่าลักษณะหน้าตาแอปพลิเคชันนั้นเป็นอย่างไร ไม่ควรกำหนดค่าสิ่งต่างๆเข้าไปตรงๆ

ดังนั้นจึงควรแยก Dimension ออกมาให้เป็นส่วนเล็กๆ และต้องแยกตั้งแต่ เราทำการสร้าง Layout นั้นทันที เพราะว่าถ้ามานั่งแยกทีหลังจะเป็นอะไรที โอ้ยยยยย… ฆ่าผมเถอะ อย่างที่พี่ๆหลายคนบอกจริงๆ ผมลองมาแล้ววว ซึ่งไม่ใช่แค่ Dimension อย่างเดียวที่ต้องแยกออกมาเป็นหมวดหมู่นะครับ ไม่ว่าจะเป็น Color และ String ก็ควรแยกออกมาเก็บไว้ในโฟลเดอร์ Values ให้เป็นหมวดหมู่เช่นเดียวกัน แล้วชีวิตจะสบายครับ

6. ทำแอปให้รองรับหลายภาษา

การแยก String ออกจาก Layout จะมีประโยชน์ก็งานนี้ละครับ ถ้าเราไม่ทำการแยก String ออกมา แล้วเราต้องการให้ข้อความดังรูป แสดงเป็นภาษาไทยในเครื่องที่เป็นภาษาไทยแล้วละก็ ชีวิตมืดอีกแล้วครับบบ

แต่ถ้าเราแยก String ออกมาเก็บไว้ใน values/strings.xml แล้วเชื่อมด้วย @string/….

ข้อความก็จะไปอยู่ในไฟล์ strings.xml ทั้งหมด ชีวิตเริ่มมีแสงสว่างขึ้นมาละครับ เพราะว่าในระบบแอนดรอยด์มีการแยก Configuration Qualifier ของแต่ละเครื่อง ซึ่งจะทำให้ข้อความ “Humidity” ของเราแสดงผลในเครื่องที่เป็นภาษาไทยว่า “ความชื้นสัมพัทธ์”

โดยทั้งสองไฟล์นั้นชื่อของ string ต้องเหมือนกัน โดยการสร้าง values-th นั้นทำได้โดยการคลิ๊กเมาส์ขวาที่ res ->New -> Android resource directory

ทำการเลือก Locale และเลือกภาษาที่เราต้องการแยก อย่างในที่นี้ผมต้องการภาษาไทย ก็จะได้เป็น

สุดท้ายก็กด OK ก็จะได้โฟลเดอร์ values-th ขึ้นมาแล้วละครับ จากนั้นก็ทำการก็อปปี้ไฟล์ strings.xml มาไว้โฟลเดอร์ที่เราสร้างขึ้นใหม่ ทำการแก้ภาษาให้เรียบร้อย เท่านี้แอปพลิเคชันของเราจะแสดงผลเป็นภาษาไทยได้ในเครื่องที่ตั้งค่าไว้เป็นภาษาไทยนั่นเอง

ซึ่งสิ่งหนึ่งที่ได้เรียนรู้จากวิธีนี้คือการเปลี่ยนภาษาของแอปพลิเคชันจะต้องเข้าไปที่การตั้งค่าของเครื่องเสมอ อ๋อยยยย….. ลำบากแล้วไหมครับ ดังนั้นถ้าจะให้ดี ควรจะเปลี่ยนภาษาของแอปพลิเคชันได้ภายในตัวแอปเลย ซึ่งเดี๋ยวจะมาบอกต่อในภายหลังนะครับ แฮ่รๆ ………….^^=

7. Library มีให้เลือกใช้

Library ของแอนดรอยด์นั้นมีให้เลือกใช้เยอะแยะมากมาย แต่ก็ต้องเลือกใช้ให้เหมาะสมกับงานด้วย ซึ่งแหล่งที่รวม Library ที่ผมเข้าบ่อยก็คงจะเป็น

เป็นแหล่งที่มี Library เยอะมากกกก มีตั้งแต่สากกะบือ ยันเรือรบ!!! อันนี้ก็เวอร์ไป ตัวอย่างเช่น Toast

ก็มีขึ้นมาเพียบบบบ

ซึ่ง Library หลักๆที่ใช้ในงาน ก็มี…

8. Smart Greenhouse

ทำมาเรื่อยๆในที่สุดแอปพลิเคชัน Smart Greenhouse ก็เสร็จ ซึ่งก็เก็บงานหลักๆอย่างที่ตั้งใจไว้ก็คือ การแสดงค่าสถานะสภาพแวดล้อม การควบคุมอุปกรณ์ และการทำรายรับ รายจ่ายและบันทึกผลผลิตที่โรงเรือนผลิตได้

ในส่วนแรกก็จะเป็นการแสดงรายการโรงเรือนต่างๆ ที่มีอยู่ในฐานข้อมูล เมื่อเข้าไปแต่ละโรงเรือนก็จะแสดงผลสภาพแวดล้อมภายใน และอุณหภูมิภายนอกโรงเรือน ซึ่งอีกส่วนก็จะเป็นส่วนของการเปิดและปิดอุปกรณ์นั่นเอง

การเปิดและปิดอุปกรณ์ไฟฟ้านั้น จะมีทั้งหมดสามโหมดการทำงาน ได้แก่

Normal mode เป็นการควบคุมอุปกรณ์ไฟฟ้าผ่านแอปพลิเคชัน

Manual mode เป็นการควบคุมอุปกรณ์ จากการเปิดและปิดสวิตช์ที่ตัวโรงเรือนเอง

Automatic mode เป็นการใช้ตรรกศาสตร์คลุมเครือในการควบคุมอุปกรณ์ไฟฟ้าทั้งหมด

Normal mode | Manual mode | Automatic mode

ส่วนสุดท้ายจะเป็นการบันทึกรายรับ รายจ่ายและผลผลิต

9. ตัวอย่างการใช้งาน

วีดีโอการทำงานเบื้องต้นของระบบตรวจวัดตามเวลาจริงและควบคุมอัจฉริยะสำหรับโรงเรือนเพาะปลูกพืช

10. สอบจบกันเถอะ

เมื่องานทั้งหมดเสร็จโรงเรือนทำงานได้ ระบบเซิร์ฟเวอร์ดี แอปพลิเคชันพร้อม ก็ถึงเวลาสอบจบกันละครับ ซึ่งการสอบจบนั้นจะต้องประกอบด้วยคณะกรรมการสามท่าน ผมและเพื่อนก็จะต้องทำการพีเซนงานที่ทำ และผลการทำงานที่ได้นั้นเป็นอย่างไร ดังนั้นจึงต้องมีสไลด์ในการนำเสนอ

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

ตัวอย่างสไลด์ที่ใช้ในการนำเสนอ……

ไอคอนที่ใช้สามารถเข้าไปได้ที่ ……. →

เมื่อสไลด์พร้อมก็ถึงเวลาการนำเสนอ น่าเสียดายที่ไม่ได้ถ่ายรูปตอนนำเสนอไว้เลย T^T แต่การนำเสนอก็ผ่านไปได้ด้วยดี…….มีข้อเสนอแนะที่ทางคณะกรรมการแนะนำเพิ่มเติมเยอะเหมือนกัน ซึ่งตรงนี้ผมและเพื่อนก็จะนำไปปรับปรุงในการทำงานต่อไปครับ

11. สิ่งที่สามารถพัฒนาต่อไป

ในการพัฒนาโครงงานระบบตรวจวัดตามเวลาจริงและควบคุมอัจฉริยะสำหรับโรงเรือนเพาะปลูกพืช ซึ่งคำว่าการควบคุมอัจฉริยะในที่นี้คือการนำตรรกศาสตร์คลุมเครือมาใช้ในการควบคุมสภาพแวดล้อม ซึ่งจะต้องเขียนในลักษณะรูปแบบของกฏ ข้อเสียคือมันไม่สามารถเรียนรู้และปรับตัวมันเองได้

ดังนั้นก็คงจะต้องนำปัญญาประดิษฐ์เข้ามาใช้ร่วมกับตรรกศาสตร์คลุมเครือ เช่น โครงข่ายประสาทเทียม ที่เลียนแบบการทำงานของสมองมนุษย์และสามารถปรับตัวมันเองได้ เพื่อให้สามารถปรับการควบคุมสภาพแวดล้อมภายในโรงเรือนให้เหมาะสมต่อสถานการณ์ต่างๆมากยิ่งขึ้น

ที่มา : https://mmlind.github.io/images/neuralnetwork.gif

ในส่วนของแอปพลิเคชันจะเป็นส่วนของการเข้าสู่ระบบ การเพิ่มโรงเรือนและการจัดการ การแสดงข้อมูลสภาพแวดล้อมแบบกราฟ และเพิ่มส่วนการแสดงภาพถ่ายภายในโรงเรือนแบบ Realtime นั่นเอง

สรุป

ในการเขียนแอปพลิเคชันครั้งนี้ ก็ได้เรียนรู้สิ่งต่างๆ ไม่ว่าจะเป็นการตั้งชื่อตัวแปร การจัดโค้ดให้ดูมีระเบียบเรียบร้อยขึ้น ซึ่งตอนเริ่มเขียนแรกๆนี้โค้ดดูยากมากกกก ชีวิตเป็นคนเทาๆ ฮ่าๆ ซึ่งในงานครั้งนี้ก็ยังคงมีจุดที่ผิดอยู่ วางของผิดโฟลเดอร์บ้าง หลังจากนี้ก็คงต้องเรียนรู้และพัฒนาอีกเยอะ ดังคำพูดที่ว่า

“ความผิดพลาด คือหนทางของความสำเร็จ”

จบละครับการทำ Senior Project ของผม และ 4 ปีในรั้วมหาลัยนเรศวรแห่งนี้ ประสบการณ์ตลอดการเรียนที่นี้เป็นอะไรที่คุ้มค่ามาก

ขอบคุณท่านอาจารย์ทุกท่านที่ให้คำแนะนำและสอนสิ่งดีๆ ขอบคุณรุ่นพี่วิศวกรรมคอมพิวเตอร์ที่ให้กำลังใจและเป็นแนวทางที่ดีในการทำงาน ขอบคุณเพื่อนๆทุกคนที่คอยช่วยกันเสมอมา และขอบคุณเพื่อนมาร์คคู่หู่การทำ Senior Project ในครั้งนี้ ขอบคุณแฟนที่คอยให้กำลังใจ และครอบครัวที่คอยสนับสนุนครับ

สถานีต่อไป สมัครงานนนนนน ^^

ขอบคุณทุกท่านที่เข้ามาอ่านนะครับ ถ้าหากมีคำติชม แนะนำสิ่งต่างๆ สามารถ Comment ไว้ด้านล่างได้เลยนะครับ ขอบคุณครับ

--

--

Phiraphong Lamun

Android Developer at Dek-D Interactive. Interesting programming, UX/UI, Firebase and music