2016. 2. 8. 22:43
아날로그 출력 밝기 이동시키기 아두이노/출력2016. 2. 8. 22:43
문제:
LED 6개를 이용해서, 빛이 지나가면서 뒤에 꼬리가 생기게 하고 싶어요.
회로:
아두이노에서 PWM을 지원하는 3,5,6,9,10,11번 핀에 각각 LED를 연결합니다.
코드1:
12345678910111213141516171819202122232425262728293031323334353637383940 const int ledpins[] = {3,5,6,9,10,11};const int SIZE = sizeof(ledpins) / sizeof(ledpins[0]);int wait = 500; void setup(){} void loop(){ //first case for(int i=0; i<4; i++) { for(int n=i, m=0; n>=0; n--, m++) analogWrite(ledpins[n], 255/pow(3,m)); delay(wait); } //second case for(int n=4, m=0; n>=0; n--, m++) {if(n>0) analogWrite(ledpins[n], 255/pow(3, m)); else analogWrite(ledpins[n], 0);} delay(wait); //third case for(int i=0; i<5; i++) { for(int limit=i+1, led=5, dark=i; n>=0; led--, dark++) {if(led>limit) analogWrite(ledpins[led], 255/pow(3, dark)); else analogWrite(ledpins[led], 0);} delay(wait); }}
코드1 설명:
loop()함수를보면 first case와 second case, third case로 나누어져 있습니다.
first case는 빛의 머리부분이 0~4까지 오는 부분으로
빛의 개수가 1개에서 4개로 증가하는 부분입니다.
second case는 빛의 머리부분이 5에 오는 부분입니다.
third case는 빛의 꼬리부분이 2~5를 지나 없으질 때까지의 부분으로
빛의 개수가 4개에서 0개로 줄어드는 부분입니다.
first case에서는
i=0일 때, for문의 초기화 부분에서 n=0이니까 ledpins[0]이 머리가 됩니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=1일 때, for문의 초기화 부분에서 n=1이니까 ledpins[1]이 머리가 되고,
증감연산에 의해 n=0이 되어 ledpins[0]은 밝기가 255/3으로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=2일 때, for문의 초기화 부분에서 n=2이니까 ledpins[2]가 머리가 되고,
증감연산에 의해 n=1이 되어 ledpins[1]의 밝기가 255/3으로 줄어들고,
다시 증감연산에 의해 n=0이 되어 ledpins[0]의 밝기가 255/9로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=3일 때, for문의 초기화 부분에서 n=3이니까 ledpins[3]이 머리가 되고,
증감연산에 의해 n=2가 되어 ledpins[0]의 밝기가 255/3으로 줄어들고,
다시 증감연산에 의해 n=1이 되어 ledpins[1]의 밝기가 255/9로 줄어들고,
다시 증감연산에 의해 n=0이 되어 ledpins[0]의 밝기가 255/27로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
second case에서는
4~1의 led까지 점점 어두워 지다가 ledpins[0]에서 꺼집니다.
third case에서는
i=0일 때, limit값이 1입니다.
limit이하의 led는 꺼집니다.
for문의 초기화 부분에서 led=5이고 dark=0이기 때문에
5번핀이 가장 밝고 다음 led로 갈수록 어두워 집니다.
그러다가 led가 1이되면 led는 꺼집니다.
i=1일 때, limit값은 2입니다.
for문의 초기화 부분에서 led=5이고 dark=1이기 때문에
5번 핀이 조금 어둡고 다음 led로 갈수록 더 어두워 집니다.
그러다가 led가 1이 되면 led는 limit값 이하이기때문에 꺼집니다.
이렇게 되다가 i=4일 때, limit값은 5가 됩니다.
for문의 초기화 부분에서 led=5이고 dark=4이지만
모든 led가 limit값 이하이기 때문에 꺼집니다.
코드2:
123456789101112131415161718192021222324 const int ledpins[10] = {3,5,6,9,10,11};const int SIZE = sizeof(ledpins) / sizeof(ledpins[0]);int wait = 500;void setup(){}void loop(){for(int i=0; i<10; i++){if(0<=i<=5)analogWrite(ledpins[i],255/ pow(3,0));if(1<=i<=6)analogWrite(ledpins[i-1], 255/pow(3,1));if(2<=i<=7)analogWrite(ledpins[i-2], 255/pow(3,2));if(3<=i<=8)analogWrite(ledpins[i-3], 255/pow(3,3));if(4<=i<=9)analogWrite(ledpins[i-4],0);delay(wait);}}
코드2 설명:
우선 9~6까지의 가상의 LED를 생각해서 총 LED가 10개 있다고 생각합니다.
그리고 for문의 i는 가장 밝은 머리부분의 LED를 나타냅니다.
for문의 증감연산에 의해서 led의 머리부분이 0~9까지 이동하게 됩니다.
이때 각각의 led는 if문에 의하여 선택적으로 켜지게 됩니다.
선택적으로 켜지는 것은 각자가 생각해 봅시다~
[출처] [아날로그 출력] - 이동|작성자 DEW
'아두이노 > 출력' 카테고리의 다른 글
LED 11개를 이용해서, 빛이 중심에서 갈라졌다 모였다 하기 (0) | 2016.02.08 |
---|---|
LED 6를 사용해서, 빛이 좌우로 움직이게 하기 (0) | 2016.02.08 |
RGB (0) | 2016.02.08 |
기본 1개짜리 아날로그 출력 (0) | 2016.02.08 |
기본 출력 digitalWrite() (0) | 2016.02.08 |