LED 컬러 변경하기 (2)

by 김도현 | 2017-06-27 18:10

재료

  • 캐릭보드 1개

LED 컬러 변경에 익숙해졌다면 이제 본격적으로 최종 목표인 파티 분위기 무드등을 만들 차례입니다.


1. 랜덤 컬러 만들어보기

1.1 random 함수란?

정해진 색상이 아니라 시간에 따라 색상을 변경하고 싶다면 random() 함수를 사용하면 됩니다.

random() 함수는 인자로 들어간 상수의 범위까지 난수를 발생시키는 함수입니다. 예를 들어 random(100)이라면 0 부터 99 까지의 숫자 중 무작위의 값을 발생시킵니다.

여기서 중요한 점은 현재 모든 컴퓨터들은 입력된 값에 따라 고정 값을 출력하기 때문에 임의의 수를 생성하는 것이 아닙니다. 그래서 random() 에서도 계산에 의해 난수표에서 하나를 골라 난수를 생성하는 방식을 취하는데, 이러한 경우 프로그램을 종료했다가 재 실행하면 이전과 같은 수열이 발생합니다.


따라서 이를 방지하기 위해 randomSeed()라는 함수를 사용합니다. randomSeed()는 무작위의 숫자 중 어느 수부터 난수를 발생시키는지를 결정합니다.

analogRead()는 아날로그 핀의 값을 읽어오는 함수입니다. 만약 analogRead(A0)라고 작성을 한다면, A0(0번 핀)에 연결된 것이 없을 경우 0~1023 사이의 난수를 반환합니다.

결과적으로 아래와 같이 프로그램 시작 전에 코드가 작성되면 시드의 값이 무작위로 변경이되어 random함수에서도 매 번 임의의 수를 발생시킬 수 있습니다.

 randomSeed(analogRead(A0))


1.2 random 함수 응용

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
#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;
  randomSeed(analogRead(A0));
}
void make_color() {
    red = random(256);
    blue = random(256);
    green = random(256);
}
void loop() {
  make_color();
  for (int i = 0; i < 5; i++) {
    strip.setPixelColor(i, strip.Color(red, green, blue));
    strip.show();
  }
  delay(100);
}

위의 코드와 같이  make_color()라는 함수를 작성해 봅시다.

make_color는 red, blue, green의 값을 0~255 사이의 임의의 수로 변경해주는 함수입니다. 함수 작성 후, make color 함수를 호출하면 loop를 돌 때마다 색상이 변경됩니다. (delay() 함수는 1000에 1초씩 지연시켜 줍니다.)


코드를 실행시켜보면 반짝반짝 빛나는 LED를 확인할 수 있습니다.



2. 돌아가는 무지개

2.1 코드 작성

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
#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;
int colors[5][3];
 
void setup() {
  strip.begin();
  Serial.begin(9600);
  red = 255;
  green = 255;
  blue = 255;
  
  //color initializing
  rainbow();
}
 
void rainbow() {
  colors[0][0= 255; colors[0][1= 0; colors[0][2= 0//빨
  colors[1][0= 255; colors[1][1= 255; colors[1][2= 0//노
  colors[2][0= 0; colors[2][1= 255; colors[2][2= 0//초
  colors[3][0= 0; colors[3][1= 0; colors[3][2= 255//파
  colors[4][0= 253; colors[4][1= 0; colors[4][2= 255//보  
}
 
void loop() {
  int tmp[3= {colors[0][0], colors[0][1], colors[0][2]};
  for (int i = 0; i < 4; i++) {
    int idx = i+1;
    for (int j = 0; j < 3; j++)
      colors[i][j] = colors[idx][j];
  }
  for (int j = 0; j < 3; j++)
      colors[4][j] = tmp[j];
      
  for (int i = 0; i < 5; i++) {
    strip.setPixelColor(i, strip.Color(colors[i][0], colors[i][1], colors[i][2]));
    strip.show();
  }
  delay(100);
}

무지개 색상을 미리 배열에 정의해 둡니다. 우리는 LED가 5개이므로 colors[5][3]라는 배열을 생성합니다.

rainbow() 함수 설정이 끝났다면, loop() 함수 내용을 수정해줍니다. 가장 처음 LED의 RGB값을 tmp에 복사해두고, 0번은 1번 LED 값, 1번은 2번 LED값, ... 해서 3번이 4번 LED 값을 복사하도록 합니다.

4번째 LED는 0번 LED 값을 복사해야 하므로, 42번째줄 코드를 보시면 아까 저장해두었던 tmp의 정보를 가져갑니다.

마지막으로, 해당 번호의 LED의 RGB값을 45번째줄과 같이 출력해줍니다.

완성되었습니다!

이제 이 LED를 캐릭보드와 합체시키면 됩니다.


2.2 캐릭보드와 합치기

조립을 하고 코드를 실행시키면 다음과 같이 빛납니다.


완성! 크리스마스에도 좋을 것 같습니다.






댓글 0

MADE BY

김도현

프로그래밍