Wednesday, August 27, 2014

RGB LED using arduino by C++ class

RGB LED using arduino by C++ class

    จากโจทย์กำหนดให้ใช้ arduino ร่วมกับ rgb led โดยใช้ push button ในการรับอินพุตสำหรับเพิ่มความสว่างของแต่ละสีโดยเขียนเป็น class RGB_LED

ออกแบบวงจร


  การออกแบบวงจร จากโจทย์กำหนดให้ใช้วงจรปุ่มกดแบบ Pull-Up (Active low) เพื่อรับค่าการกดแล้วส่งค่าไปยังบอร์ด Arduino เพื่อเปลี่ยนแปลงค่า duty cycle เพื่อปรับความสว่างของ RGB led แต่ละสี

ออกแบบโค้ด

//RGB_LED Libraly
#ifndef RGB_LED_h
#define RGB_LED_h
#include "Arduino.h"
class RGB_LED {
  public:
    RGB_LED( byte red_pin, byte green_pin, byte blue_pin);
    void add_dc( byte color );
  private:
    void update();
    byte pins[3], rgb[3];
};
#endif

  สร้าง RGB_LED.h เป็น  Abtract class กำหนดตัวแปรอาเรย์ pin[3] สำหรับเก็บค่าขาต่อใช้ RGB led แต่ละสีและ rgb[3] สำหรับเก็บค่าความสว่าง (duty cycle) ของ RGB led แต่ละสีโดยใส่เมธอดดังต่อไปนี้
  RGB_LED( byte red_pin, byte green_pin, byte blue_pin);
    เป็นคอนสตรัคเตอร์สำหรับสร้างตัวแปรคลาสโดยรับค่าเป็นขาต่อใช้งานของ  RGB led แต่ละสี
  void add_dc( byte color );
    สำหรับเรียกใช้เพื่อเพิ่มค่าความสว่าง RGB led แต่ละสีโดยรับค่าเป็น 1 สำหรับสีแดง 2 สำหรับสีเขียว 3 สำหรีบสีฟ้า
  void update();
    สำหรับเปลี่ยนแปลงค่าความสว่างที่ได้จากเมธอด add_dc เพื่อนำค่าที่ถูกปรับไปใช้เปลี่ยนแปลงความสว่างถูกเรียกใช้ใน add_dc

#include "RGB_LED.h"

RGB_LED::RGB_LED( byte red_pin, byte green_pin, byte blue_pin) {
  pins[0] = red_pin;
  pins[1] = green_pin;
  pins[2] = blue_pin;
  for ( int i=0; i < 3; i++ ) {
    pinMode( pins[i], OUTPUT ); // use this pin as output
  }
  rgb[0] = 0;
  rgb[1] = 0;
  rgb[2] = 0;
}

void RGB_LED::add_dc( byte color ) {
  if( rgb[color]<255 ){
    rgb[color] = rgb[color]+8;
  }
  else{
    rgb[color] = 0;
  }
  update();
}

void RGB_LED::update() {
  for ( int i=0; i < 3; i++ ) {
    analogWrite( pins[i], rgb[i] );
  }
}

  ใส่รายละเอียดของแต่ละเมธอด

Arduino Code

#include "RGB_LED.h"

RGB_LED rgb(9,10,11);

void setup() {
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
}

void loop() {

  delay(100);
  if(digitalRead(2)==0){rgb.add_dc(0);}
  if(digitalRead(3)==0){rgb.add_dc(1);}
  if(digitalRead(4)==0){rgb.add_dc(2);}
}
**แก้ไขโค้ด**
#include "RGB_LED.h"
int count_startR = 0;
int count_startG = 0;
int count_startB = 0;
int count_stopR = 0;
int count_stopG = 0;
int count_stopB = 0;
int stateR = 0;
int stateG = 0;
int stateB = 0;
RGB_LED rgb(9,10,11);
void setup() {
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
  Serial.begin(9600);
}
void loop() {
  delay(100);
  switch(stateR){ //defult stateR = 0
    case 0 : if(digitalRead(2)==0){ //เมื่อกดปุ่มจะนับเวลาเริ่มต้นและเปลี่ยน state เป็น 1
                count_startR=millis(); 
                stateR = 1;
             } 
             break;
    case 1 : if(digitalRead(2)==0){ //เมื่อ state = 1 จะนับเวลาเพื่อเทียบกับเวลาเริ่มต้น
                count_stopR=millis(); 
                if((count_stopR-count_startR) > 100){  //เมื่อเวลาเทียบกับเวลาเริ่มต้นต่างกัน 100ms
                    stateR = 2; //เปลี่ยน state = 2
             }} 
                break;
    case 2 : rgb.add_dc(0); // เมื่อ state = 2 จะเพิ่มค่าความสว่างหรือ duty cycle
             if(digitalRead(2)==1){ // เมื่อปล่อยปุ่มกดจะเปลี่ยน state เป็น 0 เพื่อเริ่มใหม่
                stateR =0;
             } 
             break;
  }
  
    switch(stateG){ //defult stateG = 0
    case 0 : if(digitalRead(3)==0){ //เมื่อกดปุ่มจะนับเวลาเริ่มต้นและเปลี่ยน state เป็น 1
                count_startG=millis(); 
                stateG = 1;
             } 
             break;
    case 1 : if(digitalRead(3)==0){ //เมื่อ state = 1 จะนับเวลาเพื่อเทียบกับเวลาเริ่มต้น
                count_stopG=millis(); 
                if((count_stopG-count_startG) > 100){ //เมื่อเวลาเทียบกับเวลาเริ่มต้นต่างกัน 100ms
                    stateG = 2; //เปลี่ยน state = 2
             }} 
             break;
    case 2 : rgb.add_dc(1); // เมื่อ state = 2 จะเพิ่มค่าความสว่างหรือ duty cycle
             if(digitalRead(3)==1){ // เมื่อปล่อยปุ่มกดจะเปลี่ยน state เป็น 0 เพื่อเริ่มใหม่
                stateG =0;
             } 
             break;
    }
    
    switch(stateB){ //defult stateฺB = 0
    case 0 : if(digitalRead(4)==0){ //เมื่อกดปุ่มจะนับเวลาเริ่มต้นและเปลี่ยน state เป็น 1
                count_startB=millis(); 
                stateB = 1;
             } 
             break;
    case 1 : if(digitalRead(4)==0){ //เมื่อ state = 1 จะนับเวลาเพื่อเทียบกับเวลาเริ่มต้น
                count_stopB=millis(); 
                 if((count_stopB-count_startB) > 100){ //เมื่อเวลาเทียบกับเวลาเริ่มต้นต่างกัน 100ms
                    stateB = 2; //เปลี่ยน state = 2
             }} 
             break;
    case 2 : rgb.add_dc(2); // เมื่อ state = 2 จะเพิ่มค่าความสว่างหรือ duty cycle
             if(digitalRead(4)==1){ // เมื่อปล่อยปุ่มกดจะเปลี่ยน state เป็น 0 เพื่อเริ่มใหม่
                stateB =0;
             } 
             break;
    }

}

  สร้างตัวแปร RGB_LED rgb(9,10,11) โดยใส่อินพุตเป็นขาต่อใช้งานของ LED แต่ละสี
  สร้างโค้ดเก็บข้อมูลจากปุ่มกดแต่ละปุ่มและเรียกใช้เมธอด rgb.add_dc(0) โดยใส่อินพุตเป็น 1, 2, 3 เพื่อเปลี่ยนแปลงความสว่างของสีที่เราต้องการ
  

ผลการทดลอง



source code :')

>> Schematic <<

No comments:

Post a Comment