สร้างไลบรารี่ให้กับ Arduino อย่างง่าย

                บทความนี้เจ้าของบล็อกคิดว่าน่าจะช่วยใครหลาย ๆ คนได้บ้างนะ เพราะบทความนี้จะพูดถึงการสร้างไลบรารี่แบบง่าย ๆ ให้กับ Arduino เพื่อที่จะช่วยประหยัดโค้ดและประหยัดเวลาในการเขียน ก็อย่าให้เสียเวลา มาเริ่มกันเบยย
                
                ในการสร้างไลบรารี่นั้นจำเป็นต้องมีไฟล์อยู่อย่างน้อย 2 ไฟล์ขึ้นไป นั่นก็คือจะมีไฟล์ในส่วนของ header หรือ .h และไฟล์ในส่วนของ resource หรือ .cpp ในส่วนของ .h จะคล้าย ๆ เป็นการกำหนด prototype ต่าง ๆ ของไลบรารี่ เจ้าของบล็อกจะยกตัวอย่างไลบรารี่ที่เจ้าของบล็อกได้ทำขึ้นมาสำหรับ LM35 ตัวเซนเซอร์วัดอุณหภูมิ



ตัวอย่างของไฟล์ใน .h 

                ต่อมาก็จะเป็นในส่วนของไฟล์ resource หรือ .cpp ในไลบรารี่ LM35 ที่เจ้าของบล็อกสร้างขึ้น


ตัวอย่างของไฟล์ใน .cpp

                นี่ก็จะเป็นโครงสร้างคร่าว ๆ ในการสร้างไลบรารี่อย่างง่าย ๆ กันนะครับ!! เอาละ.. ต่อมาก็จะมาเริ่มเขียนกันใหม่เลยเพื่อจะได้ทำความเข้าใจกับการสร้าง ไลบรารี่

                1. อันดับแรกให้สร้างไฟล์เตรียมไว้ก่อนเป็นนามสกุล .h กับ .cpp ชื่อไฟล์ของ .h กับ .cpp เจ้าของบล็อกขอใช้ชื่อเดียวกันเพื่อไม่ให้เกิดความสับสน


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



               ทำไมต้องเช็ค macro คงจะมีคนสงสัยน่าดู จาก -> ifndef ย่อมาจาก if not define ก็น่าจะพอเดาออกกันบ้างมั้ย ถ้าเกิดว่ามี macro ตัวนี้อยู่แล้ว โค้ดทั้งหมดของเราก็จะไม่ทำงานไงละ ไว้ป้องกันเรียก ไลบรารี่ ซ้ำซ้อนกัน หรือการสร้าง macro ซ้ำกันต้องดูกันดี ๆ นะเออเพราะไลบรารี่ส่วนใหญ่เขาจะเช็คในส่วนนี้กัน


อธิบายเพิ่มเติมนิดนึง

               #ifndef LM35_H <- ตัวนี้จำเช็คว่าไม่มี macro ชื่อนี้ใช่ไหม ถ้าไม่มีก็ให้ทำงานบรรทัดต่อไป
               #define LM35_H<- ในส่วนนี้จะทำงานก็ต่อเมื่อมีการเช็คแล้วว่าไม่เคยมี macro ตัวนี้อยู่ ก็ให้ทำการสร้าง macro ออกมาใหม่ซะ 
**สังเกตุ ถ้าเกิดว่ามี #ifndef แล้วก็อย่าลืมปิดซะละ -> #endif มีเปิดต้องมีปิดนะเออ**

              3. ต่อมาก็ยังอยู่ในส่วนของ preprocessor กันอยู่ ก็คือในส่วนของ #include เราก็จะทำการเพิ่มเข้าไปดังนี้



              ก็ตามที่เห็นนั่นแหละฮะ บรรทัดที่ 4-8 นี่คือการเช็คเวอร์ชั่นของ Program Arduino เรา เพราะบางเครื่องนั้นยังใช้ตัว IDE  (ก็ตัวโปรแกรม Arduino ที่เราเขียนอะแหล่ะ) version เก่า ๆ อยู่ จึงจะต้องใส่เงื่อนไขนี้เช็คลงไปด้วยเพื่อความยืดหยุ่นในการเรียกใช้งานไลบรารี่จะได้ไม่มีการ error เกิดขึ้นระหว่าง compile หรือ burn ข้อมูลลงบอร์ด

**ในส่วนของ #include นี้ไม่เรียกไม่ได้นะ จะเออเร่อนะเออ แต่เจ้าของบล็อกจำไม่ได้ว่าตัวไหน ระหว่าง Arduino.h กับ WProgram.h สำหรับ IDE version ใหม่ แต่น่าจะเป็น Arduino.h ที่ใช้สำหรับ version ใหม่ก็ต้องขออภัยด้วย**

***UPDATE 5/17/2017 *** ในตอนนี้ถ้าผู้อ่านใช้งาน Arduino IDE Version ใหม่อยู่ ให้เขียนเป็น #include "Arduino.h" ได้เลย ไม่ต้องมีเงื่อนไขตอนเช็คเวอร์ชั่น เพราะ WProgram.h ใน Arduino IDE Version ใหม่จะไม่รู้จักแล้ว

              4. มาเริ่มส่วนของการกำหนด function และ attribute ต่าง ๆ ในไลบรารี่กันเลยแล้วกัน


              เอาละจากรูปก็จะเห็นว่าเพิ่มโค้ดมาในช่วงบรรทัดที่ 10-22 การกำหนด function หรือ attribute ทุกอย่างจะอยู่ภายใต้ class เพื่อจะได้ใช้ได้กับในไฟล์ .cpp ในส่วนของโค้ดนั่นเอง เอาละมาดูกันว่าใน class นั้นประกาศอะไรไว้บ้าง

              ที่สังเกตุเลยคือมี public: กับ private: มันก็คือ modifier จะกำหนดสิทธิ์ในการเข้าถึง function หรือ attribute ต่าง ๆ 
              
              มาดูภายใน public: ก็จะมี function ตามที่อยู่ในรูป สังเกตุดู function แรก ชื่อ function กับชื่อ class จะเหมือนกัน function นี้จะเรียกว่า constructor ยกตัวอย่างการใช้งาน 

LM35 temp(A0);

              หมายความว่าเมื่อประกาศชื่อตัวแปรของไลบรารี่ก็จะเข้าที่ฟังชั่นนี้เลยเป็นฟังชั่นแรกตั้งแต่ประกาศ ไม่จำเป็นต้องประกาศแล้วค่อยมาเรียกใช้ทีหลัง

              ส่วน function อื่น ๆ ก็จะเหมือนกับการสร้าง function ในไลบรารี่ธรรมดาเพียงแค่ไม่มี body ของ function เท่านั้น 

              ในส่วน private: เจ้าของบล็อกก็จะให้เป็นการกำหนด attribute ต่าง ๆ หรือตัวแปรต่าง ๆ ที่จำเป็นต้องใช้งานในไลบรารี่

              5. เสร็จในส่วนของ header แล้ว.. เราก็มาดูต่อกันในส่วนของ resource กันเลย (ใน .cpp นั่นแหละ) สิ่งแรกที่เราจะทำเลยก็คือทำการ include header file ที่พึ่งเขียนเสร็จไปเมื่อซักครู่เข้ามาอยู่ในโปรแกรมซะ


              6. เมื่อ #include มาเสร็จแล้วก็ทำการ Coding พวก function ที่เราประกาศไว้ซะ


เอามาให้เปรียบเทียบกัน

              มาดูที่ฟังชั่นแรกเลยแล้วกัน นั่นก็คือ LM35(int pin); ที่เราตั้งไว้ คือให้มีการรับค่า pin เข้ามาเป็น integer หรือตัวแปรที่เป็นตัวเลขด้วย


              จากในรูปนี่ก็จะเป็น function แรก วิธีการสร้าง function ก็จะเป็นดังนี้ 

ชนิดการรีเทิร์น ชื่อคลาส::ชื่อฟังชั่น(ค่าอากิวเม้นต์);

              ใน function แรกจะประกาศแค่ LM35::LM35(int pin){ ... } ฟังชั่นนี้ไม่มีการรีเทิร์นค่า ก็ไม่ต้องใส่ชนิดการรีเทิร์น จริง ๆ พวก constructor จะไม่สามารถรีเทิร์นค่ากลับมาได้อยู่แล้วที่เหลือก็น่าจะเดากันออก ก็คือพวก attribute ต่าง ๆ ที่เรากำหนดไว้ที่ header ไฟล์ยังไม่ถูกกำหนดค่าให้กับตัวแปร ดังนั้นเราจึงต้องกำหนดในฟังชั่นนี้ เพื่อจะได้สามารถเรียกใช้ตัวแปรได้อย่างถูกต้อง

              7. มาดูโค้ดรวม ๆ ในส่วนของ .cpp กันเลยละกันค่อยอธิบายทีเดียว


              ก็อย่างที่ว่าการจะสร้าง function นั้นจะต้องมี 
returnType  ClassName::functionName(argument);

              ถ้าเกิดฟังชั่นไหนใส่ returnType ด้วยละก็อย่าลืม return ค่าละกันเดี๋ยว error การคำนวณต่าง ๆ ก็จะเป็นไปตามรูปนั่นแหละครับ

              เอาละเอาเป็นว่าตอนนี้ไลบรารี่เราก็เสร็จเรียบร้อยแล้ว เราลองมาเรียกใช้กันดูเถอะ ก่อนอื่นก็ยัดไฟล์ไลบรารี่ของเราที่เป็น .h กับ .cpp ไว้ในโฟล์เดอร์แล้ว import มาไว้ในโปรเจคซะ ทีนี้ก็จะมาลองเรียกดูกัน


              เท่านี้ก็สำเร็จแล้วสำหรับการสร้างไลบรารี่ ลองสร้างใช้เล่นดูกันได้เน้อออ จะเริ่มทำบทความออกมาให้อ่านกันเรื่อย ๆ แล้วนะครับหลังจากที่ห่างหายไปนานหลายเดือนเลยย :)

Download library hear 

ความคิดเห็น

Unknown กล่าวว่า
5555 ไม่เข้า

โพสต์ยอดนิยมจากบล็อกนี้

ว่าด้วยเรื่องหน่วยความจำ สิ่งที่หลายคนมองข้าม : รู้จักกับ Memory

คณิตศาสตร์กับโปรแกรมมิ่งมันเป็นยังไงนะ ตอนที่ 1 เกริ่นพีทาโกรัส

Pointer กับตัวแปร Array นะจ๊ะ.. [Back to basic แต่ไม่ basic]