달력

5

« 2024/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
문제:
LED 6개를 이용해서, 빛이 지나가면서 뒤에 꼬리가 생기게 하고 싶어요.
 
회로:
아두이노에서 PWM을 지원하는 3,5,6,9,10,11번 핀에 각각 LED를 연결합니다.
 
코드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
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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문에 의하여 선택적으로 켜지게 됩니다. 

선택적으로 켜지는 것은 각자가 생각해 봅시다~ 


:
Posted by youjin.A