สำหรับในบทนี้ เราก็จะพูดถึงการพัฒนาโปรแกรมโดยใช้เครื่องมือที่เราได้พูดถึงในบทก่อนๆนะครับ
ซึ่งตามคอนเซปของคอนเทนนี้ ก็คือ ไม่มีการต่ออุปกรณ์เพิ่ม ใช้แค่บอร์ด กับ usb ก็สามารถเรียนรุ้ได้ ดังนั้น การรับค่า และแสดงผลของเราจึงมีเพียง Serial monitor และ led 13 เท่านั้น
ปรับปรุงการรับค่าจาก Serial monitor
โดยปกติ การใช้ฟังก์ชัน Serial.read() จะได้รับค่าเป็น char ซึ่งทำให้นำไปใช้ได้ไม่หลากหลาย โดยเราจะต้องปรับปรุงให้มีการรับค่าเป็นสตริง เพื่อให้สามารถทำงานที่ซับซ้อนขึ้นได้
แนวคิด
อันดับแรก เราจะต้องแยกข้อความที่ส่งมาแต่ละครั้งออกจากกัน โดยใช้ตัวที่พ่วงมากับการส่ง นั่นคือ '\r' และ '\n' เพราะเป็นตัวที่คั่นกลางระหว่างข้อมูลแต่ละชุด โดยเราจะประกาศตัวแปรสตริงที่มีค่า "" แล้วเมื่ออ่านค่าจากซีเรียล ก็จะเพิ่มตัวอักษรที่อ่านได้ ยกเว้นเมื่ออ่านเจอ \r หรือ \n ก็จะเอาข้อความที่ได้จากการบวกกันก่อนหน้า ไปประมวลผลบางอย่าง จากนั้นก็จะเคลียค่าของสตริงที่ใช้เก็บข้อมูลเป็น "" เพื่อใช้ในการบวกครั้งต่อไป
สร้างฟังก์ชั่น getStr
สำหรับฟังก์ชัน getStr เป็นฟังก์ชั่นที่เราเขียนขึ้นเพื่อความง่ายในการรับค่าข้อความ โดยโปรแกรมจะวนลูป รอจนกว่าจะได้รับค่า \n หรือ \r แล้วจะส่งข้อความที่ได้รับกลับมา ก็เหมือนกับเอาตัวอย่างด้านบนมาสรุปในรูปฟังก์ชั่น
ตัวอย่างการประยุกต์ 1 : ไฟกระพริบปรับระยะเวลา
คงยังจำเรื่องไฟกระพริบและดีเลย์ได้นะครับ ถ้าดีเลย์มาก ไฟจะกระพริบช้า แต่ครั้งที่แล้วเราไม่สามารถเปลี่ยนระยะเวลาการดีเลย์ได้ แต่ในครั้งนี้เราสามารถรับข้อมูลผ่านซีเรียลได้แล้ว เราจะเอาข้อมูลนี้มากำหนดค่าใหม่ให้กับดีเลย์ ตามตัวอย่างเลยครับ
ในส่วนของฟังก์ชั่น getStr นั้นจะยังเหมือนเดิม แต่เราเอาความรู้เรื่อง toInt() ไปรวมกับโปรแกรมไฟกระพริบ และตั้งเวลาสูงสุดไว้ไม่เกิน 5000 ms หรือไม่เกิน 5 วินาที เพราะการ delay จะทำให้โปรแกรมทั้งหมดหยุดรอเวลา ทำให้อาดุยโน่จะไม่ตอบสนองคำสั่งในช่วงเวลานั้นๆ แต่ก็ยังมีวิธีที่จะทำให้ไม่เกิดการหยุดแบบนี้ ซึ่งจะพูดในบทต่อๆไป
ตัวอย่างการประยุกต์ 2 : การรับค่าโฟลทผ่านซีเรียล
โดยปกติ เราไม่สามารถแปลงจากสตริงเป็นโฟลทได้โดยตรง และด้วยข้อจำกัดของ toInt() ซึ่งจะตัดเครื่องหมายพิเศษทิ้งหมด จึงต้องเขียนโปรแกรมขึ้นมานิดหน่อย ถ้าไม่เข้าใจก็ข้ามไปก่อนก็ได้ครับ
อันดับแรกเราจะต้องหาว่า จุด (.) นั้นอยู่ตำแหน่งไหนของข้อความ โดยค่าตั้งต้นนั้นจะเป็นตำแหน่งสุดท้าย แปล 123 ที่ไม่มีจุด ก็เหมือน 123.
ขั้นต่อมา เราจะเอาจุดออกจากข้อความ เพราะถ้า toInt พบจุดในสตริง มันจะตัดตัวหลังทิ้ง ซึ่งเราไม่ต้องการเช่นนั้น
จากนั้นเราเอาข้อมูลที่ไม่มีจุดแล้วไปแปลงเป็น int เช่น 1234.56 ก็จะได้เป็น 123456 ทีนี้ให้รับนับว่าจุดอยู่ตำแหน่งไหน จากหลังไปหน้า ซึ่งก็คือสอง นั้นก็คือ เราต้องเอา 123456 หารด้วย 10^2 หรือก็คือหารด้วย 100 เป็นหลักการพื้นฐานสำหรับทศนิยม
สำหรับการยกกำลังนั้น จะต้องใช้ฟังก์ชัน pow ช่วย ซึ่งเป้นฟังก์ชันที่ทำงานกับ float อยู่แล้ว ถ้าเราใส่ข้อมูลแบบ int มันจะแปลงเป็นโฟลทให้เอง และให้ค่าโฟลทกับมา สำหรับฟังก์ชัน pow ใช้ดังนี้
pow(เลขฐาน , เลขชี้กำลัง)
ข้อระวัง
จะต้องแปลงเป็นข้อมูลชนิดเดียวกันก่อนจะทำการคูณหรือหาร เพราะถ้าเอา int จะไม่สนใจเศษ แต่ float จะสนใจเศษ
ข้อสังเกต
บางครั้งเลขที่ได้อาจจะไม่เหมือนกับเลขที่เราใส่เป๊ะ แต่มีความใกล้เคียง เพราะตัวแปรประเภทโฟลท จะมีความคลาดเคลื่อนเล็กน้อยเมื่อคำนวณ เพื่อแลกกับความละเอียด และช่วงที่กว้างมากของข้อมูล
แบบฝึกหัดสุดท้าย
จากความรู้ทั้งหมดในบทต่างๆ ผมก็อยากจะทิ้งโจทย์สุดท้ายไว้ว่า ให้ออกแบบโปรแกรมเครื่องคิดเลข โดยใช้ซีเรียลมอนิเตอร์ สำหรับใครจะทำออกมาหน้าตาแบบไหน ผมไม่ขอบังคับในส่วนนั้น เพราะผมก็อยากเห็นความคิดสร้างสรรค์ของทุกๆคน
สุดท้ายนี้ขอบคุณที่ติดตามกันมาถึงจุดนี้ ผมคงจะมาถึงจุดนี้ไม่ได้เลยถ้าขาดกำลังใจจากทุกๆคน และผมก็จะตั้งใจเขียนบทความดีๆต่อไปครับผม ^___^
ชอบมากครับ ขอบคุณครับ อิอิ
ตอบลบขอบคุณที่ติดตามนะครับผม คอนเท้นใหม่จะออกเร็วๆนี้ครับ
ลบขอบคุณครับ
ลบขอบคุณครับ
ลบ