สร้างไลบรารี่ให้กับ Arduino อย่างง่าย
บทความนี้เจ้าของบล็อกคิดว่าน่าจะช่วยใครหลาย ๆ คนได้บ้างนะ เพราะบทความนี้จะพูดถึงการสร้างไลบรารี่แบบง่าย ๆ ให้กับ Arduino เพื่อที่จะช่วยประหยัดโค้ดและประหยัดเวลาในการเขียน ก็อย่าให้เสียเวลา มาเริ่มกันเบยย
ในการสร้างไลบรารี่นั้นจำเป็นต้องมีไฟล์อยู่อย่างน้อย 2 ไฟล์ขึ้นไป นั่นก็คือจะมีไฟล์ในส่วนของ header หรือ .h และไฟล์ในส่วนของ resource หรือ .cpp ในส่วนของ .h จะคล้าย ๆ เป็นการกำหนด prototype ต่าง ๆ ของไลบรารี่ เจ้าของบล็อกจะยกตัวอย่างไลบรารี่ที่เจ้าของบล็อกได้ทำขึ้นมาสำหรับ LM35 ตัวเซนเซอร์วัดอุณหภูมิ
ต่อมาก็จะเป็นในส่วนของไฟล์ resource หรือ .cpp ในไลบรารี่ LM35 ที่เจ้าของบล็อกสร้างขึ้น
2. ต้องเริ่มในส่วนของ header ไฟล์ก่อนเลย เพราะในส่วนนี้อย่างที่บอกจะเป็นการกำหนดว่าในไลบรารี่เราจะต้องมี function อะไรบ้าง attribute อะไรบ้าง อันดับแรกให้เราทำการเช็ค macro ก่อนเลย ว่าภายในไลบรารี่เรามี macro ตัวนี้ไหม ถ้าไม่มีก็ให้ทำการสร้าง macro ขึ้นมาใหม่ซะ โดยโค้ดก็จะประมาณนี้
ทำไมต้องเช็ค macro คงจะมีคนสงสัยน่าดู จาก -> ifndef ย่อมาจาก if not define ก็น่าจะพอเดาออกกันบ้างมั้ย ถ้าเกิดว่ามี macro ตัวนี้อยู่แล้ว โค้ดทั้งหมดของเราก็จะไม่ทำงานไงละ ไว้ป้องกันเรียก ไลบรารี่ ซ้ำซ้อนกัน หรือการสร้าง macro ซ้ำกันต้องดูกันดี ๆ นะเออเพราะไลบรารี่ส่วนใหญ่เขาจะเช็คในส่วนนี้กัน
อธิบายเพิ่มเติมนิดนึง
#ifndef LM35_H <- ตัวนี้จำเช็คว่าไม่มี macro ชื่อนี้ใช่ไหม ถ้าไม่มีก็ให้ทำงานบรรทัดต่อไป
#define LM35_H<- ในส่วนนี้จะทำงานก็ต่อเมื่อมีการเช็คแล้วว่าไม่เคยมี macro ตัวนี้อยู่ ก็ให้ทำการสร้าง macro ออกมาใหม่ซะ
เท่านี้ก็สำเร็จแล้วสำหรับการสร้างไลบรารี่ ลองสร้างใช้เล่นดูกันได้เน้อออ จะเริ่มทำบทความออกมาให้อ่านกันเรื่อย ๆ แล้วนะครับหลังจากที่ห่างหายไปนานหลายเดือนเลยย :)
Download library hear
ตัวอย่างของไฟล์ใน .h
ต่อมาก็จะเป็นในส่วนของไฟล์ resource หรือ .cpp ในไลบรารี่ LM35 ที่เจ้าของบล็อกสร้างขึ้น
ตัวอย่างของไฟล์ใน .cpp
นี่ก็จะเป็นโครงสร้างคร่าว ๆ ในการสร้างไลบรารี่อย่างง่าย ๆ กันนะครับ!! เอาละ.. ต่อมาก็จะมาเริ่มเขียนกันใหม่เลยเพื่อจะได้ทำความเข้าใจกับการสร้าง ไลบรารี่
1. อันดับแรกให้สร้างไฟล์เตรียมไว้ก่อนเป็นนามสกุล .h กับ .cpp ชื่อไฟล์ของ .h กับ .cpp เจ้าของบล็อกขอใช้ชื่อเดียวกันเพื่อไม่ให้เกิดความสับสน
ทำไมต้องเช็ค 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
ความคิดเห็น
แสดงความคิดเห็น