LED 컬러 변경하기(2)

by 강종구 | 2017-07-04 16:04
LED 아두이노 아두이노 led 캐릭보드


1) 랜덤함수를 이용하여 색을 변경하기

아두이노IDE에 Random() 이라는 함수가 있습니다. Random()이라는 함수는 괄호안에 어떤 값을 넣었을 때, 그 값보다 작은 수를 랜덤으로 뽑아주는 함수입니다. Random(A)일 경우, 0 ~ A-1까지의 값을 임의로 구해줍니다. 만약 어떤 범위 내의 수를 랜덤하게 구하기 원한다면, Random(A, B)의 형태로 설정해주면 A ~ B-1 사이의 값을 랜덤하게 얻을 수도 있습니다.


아래의 코드는 red, green, blue값에 각각 Random(256)을 설정해주어, 랜덤하게 LED를 만들었습니다.

또한 기존의 코드는 for(i=0; i<5; i++)을 사용하여 0부터 4번의 라이트를 순서대로 바꿔주었다면, 아래의 코드는 i = random(5)를 이용하여 네오픽셀을 하나 랜덤하게 골라, 그것의 색을 바꿔줍니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
 
#define PIN 6
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PIN, NEO_GRB + NEO_KHZ800);
 
int red = 0;
int green = 0;
int blue = 0;
 
void setup() {
  strip.begin();
  Serial.begin(9600);
  red = 255;
  green = 255;
  blue = 255;
}
 
void randcolor()
{
  red = random(256);
  green = random(256);
  blue = random(256);
}
void loop() 
{
  int i = random(5);
  randcolor();
  strip.setPixelColor(i, strip.Color(red, green, blue));
  strip.show();

  delay(100);
}                                                      Colored by Color Scripter
cs



위 코드를 통해 아래와 같은 결과를 얻을 수 있습니다.




2) 여러가지 LED를 만들어보자

- lightchase 함수 : LED가 2개씩 순서대로 켜지는 함수

- rainbow : 무지개빛 나는 LED를 만들어주는 함수


(1) lightchase 함수

random 함수를 이용해서 임의의 색을 구한 뒤, 이 값을 lightchase 함수로 보냅니다.

lightchase 함수의 경우,  j 값을 이용해서 총 5번의 색 변화를 나타납니다. j의 값의 범위를 변화시키면 적거나 많은 횟수의 변화를 얻을 수 있습니다.

q값의 경우, 몇번째 픽셀까지 light on을 해줄지를 정해줍니다. 이 코드의 경우 (0,4), (1,5), (3) 에 해당하는 픽셀을 켜줍니다. q<3으로 설정했기 때문에, 3번의 light on, off가 일어납니다.

마지막으로 i의 경우, i=i+3만큼 변화하기 때문에, (0,4), (1,5)번이 동시에 켜집니다. 만약 i+=2로 할 경우, (0,3,5)가 동시에 켜지게도 설정할 수 있습니다. 이는 프로그래머의 설정에 따라 동시에 켜지는 불의 갯수를 정할 수 있습니다.


(2) rainbow 함수

rainbow 함수는 255가지의 색을 최대한 표시하기 하여, 5개의 각각의 다른 LED를 출력합니다. 그리고 물결치는 효과를 얻을 수 있습니다.


k값을 통해서, 총 몇번의 물결효과(사실은 밀림효과)를 볼 것인지를 정할 수 있습니다.

또한 j값을 통해서 255개의 pixel값들을 모두 얻을 수 있고, i값을 통해서 네오픽셀이 가지고 있는 빛을 옆으로 전달할 수 있습니다.

strip.setPixelColor(i, rainbowcolor(((i * 256 / 5+ j*k) & 255)) 에서 255와 AND 연산을 하는 이유는, 255개의 pixel값 만을 얻기 위해서 입니다.  

또한 rainbowcolor(byte Pos) 함수를 통해 3개의 범위에 따라, color 배분을 다르게 함으로, 무지개빛 효과를 얻을 수 있습니다. 만약 더 많은 범위를 원할 경우, 프로그래머의 의도에 따라, 값의 구간을 다르게 나누고, RGB에 해당하는 값들을 마음대로 정하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
 
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(5, PIN, NEO_GRB + NEO_KHZ800);
 
int red = 0;
int green = 0;
int blue = 0;
 
void setup() {
  strip.begin(); 
  strip.show(); 
}
void randcolor()
{
  red = random(256);
  green = random(256);
  blue = random(256);
}
void loop() {
  
  randcolor();
  lightChase(strip.Color(red, green, blue));
  rainbow();
}
 
void rainbow() {
  uint16_t i, j, k;
  for(k=0; k<5; k++){
    for(j=0; j<256; j++){ 
      for(i=0; i< 5; i++){
        strip.setPixelColor(i, rainbowcolor(((i * 256 / 5+ j*k) & 255));
      }
      strip.show();
      delay(10);
    }
  }
}
 
void lightChase(uint32_t c) 
{
  for (int j=0; j<5; j++) {
    for (int q=0; q < 3; q++) {
      for (int i=0; i < 5; i=i+3) {
        strip.setPixelColor(i+q, c);   
      }
      
      strip.show();
      delay(10);
 
      for (int i=0; i < 5; i=i+3) {
        strip.setPixelColor(i+q, 0);   
      }
    }
  }
}
 
uint32_t rainbowcolor(byte Pos) {
  if(Pos < 85) {
   return strip.Color(Pos * 3255 - Pos * 30);
  } else if(Pos < 170) {
   Pos -= 85;
   return strip.Color(255 - Pos * 30, Pos * 3);
  } else {
   Pos -= 170;
   return strip.Color(0, Pos * 3255 - Pos * 3);
  }
}
 
cs


위의 코드를 실행해보자!
아래의 영상은 모든 함수의 delay를 10ms로 설정했을 때이다.


코드의 이해를 돕기 위해서 delay를 1초로 설정한 것의 영상은 아래와 같다.


이처럼 여러가지 함수를 실제로 구성해보면서, 자신의 스타일에 맞는 LED를 구성할 수 있습니다!


댓글 0