728x90
반응형

아두이노 LED 색깔 조절하기: https://jinho-study.tistory.com/241

 

아두이노 LED 색깔 조절하기(NeoPixel)

NeoPixel을 사용해서 빨간색, 초록색, 파란색, 노란색, 흰색을 켜보았다. (아두이노 extension board와 NeoPixel이 필요하고, Adafruit_NeoPixel 라이브러리를 설치해야 한다) #include //..

jinho-study.tistory.com

저번에는 NeoPixel로 빨강, 초록, 파랑, 노랑, 흰색을 켰었는데 똑같은 코드를 5번이나 넣는 식으로 구현을 했었다.

개인적으로 이런 코드는 비효율적이라고 생각하기에, 배열을 사용해서 코드를 짧게 구현해 보려고 한다.

그리고 버튼을 누르고 있어야 NeoPixel이 켜지는 기능과 색을 조금 더 추가하려고 한다.

우선 단순하게 코드를 짜면 아래와 같다. 

#include <Adafruit_NeoPixel.h>
#define LED 11 // LED Pin
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, LED, NEO_GRB + NEO_KHZ800);

const int SW = 10; // Button Pin
int led = 0; // LED의 상태를 저장해주는 변수

void setup() {
  pixels.begin();
  pixels.show();
  pinMode(SW, INPUT);
}

void loop() {  
  // 버튼을 누르고 있을 때 Led를 켬
  if (digitalRead(SW) == LOW) {
    if (led == 0) {
      pixels.setPixelColor(0, 100, 0, 0); // 빨강
      pixels.show(); 
      delay(1000);
    }    
    if (led == 1) {
      pixels.setPixelColor(0, 0, 100, 0); // 파랑
      pixels.show(); 
      delay(1000);
    }
    if (led == 2) {
      pixels.setPixelColor(0, 0, 0, 100); // 초록
      pixels.show(); 
      delay(50);
    }
    if (led == 3) {
      pixels.setPixelColor(0, 100, 100, 0); // 노랑
      pixels.show(); 
      delay(1000);
    }
    if (led == 4) {
      pixels.setPixelColor(0, 100, 0, 100); //  보라
      pixels.show(); 
      delay(1000);
    }
    if (led == 5) {
      pixels.setPixelColor(0, 0, 100, 100); // 하늘
      pixels.show(); 
      delay(1000);
    }
    if (led == 6) {
      pixels.setPixelColor(0, 100, 100, 100); // 하양
      pixels.show(); 
      delay(1000);
      led = -1;
    }
    led += 1;
  }
  // 버튼을 누르지 않았을 때는 정전 상태
  else {
    pixels.setPixelColor(0, 0, 0, 0);
    pixels.show();     
  }
}

버튼을 누르고 있을 때는 LED가 켜지면서 색깔이 계속 바뀌고, 누르지 않았을 때는 정전 상태이다.

구현이 되긴 했지만 코드가 쓸데없이 길다. 1차원 배열과 %(나머지 연산)을 사용하면 아래와 같이 짧게 구현할 수 있다.

#include <Adafruit_NeoPixel.h>
#define LED 11 // LED Pin
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, LED, NEO_GRB + NEO_KHZ800);

const int SW = 10; // Button Pin
int led = 0; // LED의 상태를 저장해주는 변수

int R[7] = {100, 0, 0, 100, 100, 0, 100}; // 빨간색 
int G[7] = {0, 100, 0, 100, 0, 100, 100}; // 초록색
int B[7] = {0, 0, 100, 0, 100, 100, 100}; // 파란색

void setup() {
  pixels.begin();
  pixels.show();
  pinMode(SW, INPUT);
}

void loop() {  
  // 버튼을 누르고 있을 때 Led를 켬
  if (digitalRead(SW) == LOW) {
    // 배열을 사용함으로써 코드를 엄청 짧게 만들수 있음
    pixels.setPixelColor(0, R[led%7], G[led%7], B[led%7]); 
    pixels.show(); 
    delay(1000); // 1초 주기
    led += 1;
  }
  // 버튼을 누르지 않았을 때는 정전 상태
  pixels.setPixelColor(0, 0, 0, 0); 
  pixels.show();     
}

위에 코드를 보면 R, G, B 3개의 배열에 빨강, 초록, 파랑, 노랑, 보라, 하늘, 하양의 RGB 값들이 순서대로 저장되어 있다.

(100, 0, 0) 같은 방식으로 여러 번 반복할 필요 없기 때문에 훨씬 코드가 짧아지게 된다. 

R[led%7], G[...], B[...]의 의미 -> 지금 led 변수는 led의 색깔(순서)을 가리키는데 예를 들면

led = 3 -> R[3%7] = R[3] = 100, 

led = 10 -> R[10%7] = R[3] = 100과 같은 방식이다.

%(나머지 연산)을 사용하지 않는다면 중간에 아래와 같이 조건문을 추가해야 되는데 위의 방법보다는 좋지 않은 방법 같다.

if (led == 6) { 
  led = -1; 
}

마지막으로 2차원 배열을 사용해보자.

#include <Adafruit_NeoPixel.h>
#define LED 11 // LED Pin
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, LED, NEO_GRB + NEO_KHZ800);

const int SW = 10; // Button Pin
int led = 0; // LED의 상태를 저장해주는 변수

// RGB 값이 저장되어 있는 2차원 배열(빨강, 파랑, 초록, 노랑, 보라, 하늘, 하양)
int RGB[7][3] = {{100,0,0}, {0,100,0}, {0,0,100}, {100,100,0}, {100,0,100}, {0,100,100}, {100,100,100}};

void setup() {
  pixels.begin();
  pixels.show();
  pinMode(SW, INPUT);
}

void loop() {  
  // 버튼을 누르고 있을 때 Led를 켬
  if (digitalRead(SW) == LOW) {
    // 배열을 사용함으로써 코드를 엄청 짧게 만들수 있음
    pixels.setPixelColor(0, RGB[led%7][0], RGB[led%7][1], RGB[led%7][2]); 
    pixels.show(); 
    delay(1000); // 1초 주기
    led += 1;
  }
  // 버튼을 누르지 않았을 때는 정전 상태
  pixels.setPixelColor(0, 0, 0, 0); 
  pixels.show();     
}

맨 위에 있는 한눈에 다 안 보이던 코드가 이제는 한눈에 다 보인다.

RGB[7][3]은 7행 3열인 행렬이라고 생각하면 될 것 같다.

첫 번째 행에는 빨간색의 RGB 값, 두 번째 행에는 초록색의 RGB 값이 들어있는 식이다. 

아래와 같이 잘 작동된다.

쉬운 예제더라도 다양한 방식으로 코드를 짜보는 게 처음 공부할 때는 도움이 되는 것 같다.

남이 짠 코드를 사용하더라도 그걸 그냥 사용하기만 하는 게 아니라, 자신의 것으로 만들고 사용하도록 하자. 그렇지 않으면 남는 게 정말 하나도 없다.  

728x90
반응형
728x90
반응형

저번엔 NeoPixel 가지고 빨강, 초록, 파랑, 노랑색을 켜보았다.

이번엔 빨강 Blink, 초록 Fade in, 파랑 Fade out을 구현해보았다.

#include <Adafruit_NeoPixel.h>

int led = 11; // 11번 Pin을 +로 사용

Adafruit_NeoPixel pixels(1, led, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
}

void loop() {
  // 빨간색 Blink(2초)
  for(int i = 0; i <= 20; i += 1)  {
    pixels.setPixelColor(0, 250, 0, 0);
    pixels.show(); 
    delay(50);  
    pixels.setPixelColor(0, 0, 0, 0);
    pixels.show(); 
    delay(50);  
  }  
  // 초록색 Fade in(2초)
  for(int brightness = 0; brightness <= 250; brightness += 5) {
    pixels.setPixelColor(0, 0, brightness, 0);
    pixels.show(); 
    delay(40);  
  }
  // 파란색 Fade out(2초)
  for(int brightness = 250; brightness >= 0; brightness -= 5) {  
    pixels.setPixelColor(0, 0, 0, brightness);
    pixels.show(); 
    delay(40);  
  }
}

빨강색 blink는 2초동안 총 20번 껐다 켜지도록 했다.

2초 동안 초록색이 천천히 켜지고, 2초 동안 파란색이 천천히 꺼진다. 

 

잘 됨

 

728x90
반응형
728x90
반응형

NeoPixel을 사용해서 빨간색, 초록색, 파란색, 노란색, 흰색을 켜보았다.

(아두이노 extension board와 NeoPixel이 필요하고, Adafruit_NeoPixel 라이브러리를 설치해야 한다)

#include <Adafruit_NeoPixel.h> // 사용하기 전 라이브러리 설치 필수

int led = 11; // 11번 Pin을 +로 사용           

// 첫 번째 led 사용, 11번 pin 사용
Adafruit_NeoPixel pixels(1, led, NEO_GRB + NEO_KHZ800); 

void setup() {
  pixels.begin();
}

void loop() {
  pixels.setPixelColor(0, 255, 0, 0);     // 빨간색
  pixels.show(); 
  delay(1000);                            // 1초간 딜레이
  pixels.setPixelColor(0, 0, 255, 0);     // 초록색
  pixels.show(); 
  delay(1000);                            // 1초간 딜레이
  pixels.setPixelColor(0, 0, 0, 255);     // 파란색
  pixels.show(); 
  delay(1000);                            // 1초간 딜레이
  pixels.setPixelColor(0, 255, 255, 0);   // 노란색
  pixels.show(); 
  delay(1000);                            // 1초간 딜레이
  pixels.setPixelColor(0, 255, 255, 255); // 흰색
  pixels.show(); 
  delay(1000);                            // 1초간 딜레이
}

 

회로는 아래와 같이 생겼다.

회로도

실행시키면 색이 예쁘게 잘 나오는 것을 확인할 수 있다.

그냥 보면 눈이 아픈 수준이라 밝기를 255에서 100으로 줄여야 될 것 같다. 

github: https://github.com/kimjinho1/Arduino

 

kimjinho1/Arduino

Contribute to kimjinho1/Arduino development by creating an account on GitHub.

github.com

728x90
반응형
728x90
반응형

이번엔 LED 2개를 동시에 blink 해봤다. 

LED1은 1초 주기로 깜빡이고, LED2는 2초 주기로 깜빡이도록 구현해봤다. 

int LED1 = 11; // 11번 Pin을 +로 사용
int LED2 = 10; // 10번 Pin을 +로 사용

void setup() {
  // LED는 입력을 받는게 아니라 그저 출력할 뿐이므로 OUTPUT으로 설정
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT); 
}

void loop() {
  digitalWrite(LED1, HIGH); // LED1 킴
  digitalWrite(LED2, HIGH); // LED2 킴
  delay(1000);             // 1초간 딜레이
  digitalWrite(LED1, LOW);  // LED1 끔
  delay(1000);             // 1초간 딜레이
  digitalWrite(LED1, HIGH); // LED1 킴
  digitalWrite(LED2, LOW);  // LED2 끔
  delay(1000);             // 1초간 딜레이
  digitalWrite(LED1, LOW); // LED1 킴
  delay(1000);             // 1초간 딜레이
}

 

회로는 아래와 같은 느낌이다.

회로도

github: https://github.com/kimjinho1/Arduino

 

kimjinho1/Arduino

Contribute to kimjinho1/Arduino development by creating an account on GitHub.

github.com

728x90
반응형
728x90
반응형

LED가 1초 동안 켜지고 1초 동안 꺼지도록 구현해보았다(blink).

int LED = 11; // 11번 Pin을 +로 사용

void setup() {
  // LED는 입력을 받는게 아니라 그저 출력할 뿐이므로 OUTPUT으로 설정
  pinMode(LED, OUTPUT); 
}

void loop() {
  digitalWrite(LED, HIGH); // LED를 킴
  delay(1000);             // 1초간 딜레이
  digitalWrite(LED, LOW);  // LED를 끔
  delay(1000);             // 1초간 딜레이
}

 

회로는 아래와 같은 느낌이다. 

저항이 꼭 필요한 것은 아니라서, 저항 빼버리고 11번 Pin 선을 LED에 직접 박아도 잘 실행된다. 

회로도

github: https://github.com/kimjinho1/Arduino

 

kimjinho1/Arduino

Contribute to kimjinho1/Arduino development by creating an account on GitHub.

github.com

728x90
반응형

+ Recent posts