CAT LoRa Starter Kit ตอนที่ 3 มาสร้าง Library หลอดไฟ LED RGB ไว้ใช้งานกันเองเถอะ

Choonewza
3 min readDec 4, 2019

--

จากในบทความที่แล้ว ผมได้แสดงการเชื่อมต่อ CAT LoraWAN ผ่านการใช้ AcSIP S76S Commands จะเห็นว่าการนำไปใช้งานยุ่งยากมาก ดังนั้นในบทความนี้เราจะนำ Code จากบทความที่แล้วมาสร้างเป็น Library เพื่อให้ง่ายต่อการนำไปใช้ในโปรเจคอื่น ๆ ต่อไป

ก่อนที่เราจะมาทำ Library ภาษา C++ ใช้เองบน Arduino ของ CAT LoraWAN เราต้องทำความเข้าใจในการสร้าง Library เบื้องต้นก่อน โดย Library นั้นจะประกอบด้วยไฟล์ 2 ไฟล์

  1. ไฟล์นามสกุล .h เป็นไฟล์ header เก็บเฉพาะชื่อฟังชั่นและค่าตัวแปรต่าง ๆ
  2. ไฟล์นามสกุล .cpp เป็นไฟล์ resource เก็บการทำงานของฟังชั่นโดยจะต้องสอดคล้องกับไฟล์ Header ด้วย

เพื่อให้เข้าใจง่ายจะขอแสดงตัวอย่าง การสร้าง Library ของหลอดไฟ LED RGB โดยหลอด RGB LED มีอยู่สองแบบ คือ
1. common cathode ลบร่วม
2. common anode บวกร่วม

ดังนั้น RGB LED Library ของเราจะต้องรองรับ 2 การทำงานนี้ จึงออกแบบ Attribute และ Method ได้ดังนี้

ทำการสร้างโฟลเดอร์ชื่อ LedRGB ไว้ที่ตำแหน่งเก็บไฟล์ Libraries ของ Arduino (C:\Users\<username>\Documents\Arduino\libraries) และสร้าง Text File จำนวน 2 ไฟล์ชื่อ RgbLED.h และ RgbLED.cpp

ทำการแก้ไขไฟล์ RgbLED.h แล้วพิมพ์โค๊ดดังนี้

#ifndef RgbLED_h
#define RgbLED_h
#include "Arduino.h"class RgbLED{
private:
uint8_t redPin;
uint8_t greenPin;
uint8_t bluePin;
bool isCathode;
void setColor(uint8_t redValue, uint8_t greenValue, uint8_t blueValue);

public:
~RgbLED();
RgbLED(uint8_t redPin, uint8_t greenPin, uint8_t bluePin, bool isCathode);
void begin();
void turnOff();
void turnOn(uint8_t redValue, uint8_t greenValue, uint8_t blueValue);
void turnOnWhite();
void turnOnRed();
void turnOnGreen();
void turnOnBlue();
};
#endif

ทำการแก้ไขไฟล์ LedRGB.cpp พิมพ์โค๊ดดังนี้

#include "RgbLED.h"RgbLED::~RgbLED(){
Serial.println(F("Debug: RgbLED is destroyed."));
}
RgbLED::RgbLED(uint8_t redPin, uint8_t greenPin, uint8_t bluePin, bool isCathode){
this->redPin = redPin;
this->greenPin = greenPin;
this->bluePin = bluePin;
this->isCathode = isCathode;
}
void RgbLED::begin(){
pinMode(this->redPin, OUTPUT);
pinMode(this->greenPin, OUTPUT);
pinMode(this->bluePin, OUTPUT);
turnOff();
}
void RgbLED::setColor(uint8_t redValue, uint8_t greenValue, uint8_t blueValue) {
analogWrite(this->redPin, redValue);
analogWrite(this->greenPin, greenValue);
analogWrite(this->bluePin, blueValue);
}
void RgbLED::turnOff(){
if(this->isCathode){
setColor(0,0,0);
}else{
setColor(255,255,255);
}
}
void RgbLED::turnOn(uint8_t redValue, uint8_t greenValue, uint8_t blueValue){
if(this->isCathode){
setColor(redValue, greenValue, blueValue);
}else{
setColor(255-redValue, 255-greenValue, 255-blueValue);
}
}
void RgbLED::turnOnWhite(){
if(this->isCathode){
setColor(255, 255, 255);
}else{
setColor(0, 0, 0);
}
}
void RgbLED::turnOnRed(){
if(this->isCathode){
setColor(255, 0, 0);
}else{
setColor(0, 255, 255);
}
}
void RgbLED::turnOnGreen(){
if(this->isCathode){
setColor(0, 255, 0);
}else{
setColor(255, 0, 255);
}
}
void RgbLED::turnOnBlue(){
if(this->isCathode){
setColor(0, 0, 255);
}else{
setColor(255, 255, 0);
}
}

อธิบายโค๊ด

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

//เช็คว่าไม่มี macro ชื่อนี้ใช่ไหม ถ้าไม่มีก็ให้ทำงานบรรทัดต่อไป
#ifndef LedRGB_h
//ในส่วนนี้จะทำงานก็ต่อเมื่อมีการเช็คแล้วว่าไม่เคยมี macro ตัวนี้อยู่ ก็ให้ทำการสร้าง macro ออกมาใหม่
#define LedRGB_h
//Codding#endif

ต่อมาทำการ include ไฟล์ Arduino library

#ifndef LedRGB_h
#define LedRGB_h
#include "Arduino.h"//Codding#endif

ต่อมาในส่วนของไฟล์ .cpp นั้นเราต้องทำการ include ไฟล์ Header เข้ามาด้วย เพื่อทำการระบุว่ามี method อะไรบ้างที่เราต้องทำการใส่วิธีการทำงานให้มัน

#include "RgbLED.h"//Codding

เพียงเท่านี้เราก็จะได้ Library ที่เป็นของเราเองมาใช้งานได้แล้ว

วิธีใช้งาน

สามารถเรียกใช้ได้เหมือน Library ทั่ว ๆ ไปเลยครับ

#include "RgbLED.h";#define IS_CATHODE_LED trueRgbLED led1(5, 6, 9, IS_CATHODE_LED);void setup() {
Serial.begin(115200);
delay(500);

led1.begin();
}
void loop() {
led1.turnOn(100,150,255);
delay(1000);
led1.turnOff();
delay(1000);
led1.turnOnWhite();
delay(1000);
led1.turnOff();
delay(1000);
led1.turnOnRed();
delay(1000);
led1.turnOff();
delay(1000);
led1.turnOnGreen();
delay(1000);
led1.turnOff();
delay(1000);
led1.turnOnBlue();
delay(1000);
led1.turnOff();
delay(1000);
}

ในบทความต่อไปเราจะมาเริ่มลงมือสร้าง CAT LoraWAN Library กันนะครับ

--

--