2장. LED 켜기 응용(여러개 LED 켜기)
Language | English |
---|
목적여러 개의 LED 제어하는 방법을 알아본다. 부품
회로도
이것은 공통 캐소드와 공통 애노드의 개념으로 닉시관이나 7 Segment에 적용된다. 소스
void setup() {
for(int i=3;i<11;i++) // D3 ~ D10 I/O 출력을 디지털 I/O 포트로 설정하기 위한 반복문
pinMode(i, OUTPUT); // I/O 포트를 출력으로 설정하는 함수
}
void loop() {
for(int i=3;i<11;i++)
{
digitalWrite(i, HIGH); // D3 ~ D10 디지털 I/O 출력을 HIGH로 설정
delay(50); // 시간지연 50ms
digitalWrite(i, LOW); // D3 ~ D10 디지털 I/O 출력을 LOW로 설정
delay(50); // 시간지연 50ms
}
}
/*===============================================
0x(High-low:10,9,8,7)(High-low:6,5,4,3)
Example
0x81:10000001
10번핀,9번핀,8번핀,7번핀,6번핀,5번핀,4번핀,3번핀
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
1 0 0 0 0 0 0 1
공통 캐소드 방식으로 연결한 형태이므로 LED의 모든 캐소드는 같이 연결한다. 출력이 1일때 ON, 0일때 OFF가 된다.
=================================================*/
long data[]=
{
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, //왼쪽에서 오른쪽으로 하나씩 켜진후 꺼진다.
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01, //오른쪽에서 왼쪽으로 하나씩 켜진후 꺼진다.
0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81, //양쪽에서 중간으로 중간에서 양쪽으로 켜진후 꺼진다.
0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff, //왼쪽에서 오른쪽으로 하나씩 켜진다.
0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01, //오른쪽에서 왼쪽으로 꺼진다.
};
void setup()
{
for(int x=3;x<11;x++)
{
pinMode(x,OUTPUT); // I/O핀을 출력으로 설정
}
}
void loop()
{
for(int x=0;x<40;x++) // 다른 LED 패턴을 읽는다.
{
leddisplay(data[x]); // leddisplay() 함수를 호출한다.
delay(200); // 각 상태마다 200ms 시간지연
}
leddisplay(0x00); // 한 싸이클이 완료되면 모든 LED를 끈다.
delay(200);
}
void leddisplay(int num) // 포트와 LED를 맵핑하는 함수
{
/*====================================================================
(num >> x)에서 x는 16진수 num을 x 비트만큼 오른쪽 쉬프트하라는 표현이다. 0 is the lowest bit, bit 7 is the highest bit.
0은 최하위비트이고 7은 최상위비트이다. 쉬프트된 데이터와 0x01과 AND 연산하여 0 또는 1의 임의의 값을 얻을 수 있다. 얻어진 값을
마이크로두이노의 I/O 포트에 출력한다.
====================================================================*/
digitalWrite(3, ((num>>0)&0x01)); // num값을 0 만큼 오른쪽 쉬프트하고 0x01과 AND 연산해서 얻어진 값을 I/O 포트 D3의 값으로 출력
digitalWrite(4, ((num>>1)&0x01)); // num값을 1 만큼 오른쪽 쉬프트하고 0x01과 AND 연산해서 얻어진 값을 I/O 포트 D4의 값으로 출력
digitalWrite(5, ((num>>2)&0x01));
digitalWrite(6, ((num>>3)&0x01));
digitalWrite(7, ((num>>4)&0x01));
digitalWrite(8, ((num>>5)&0x01));
digitalWrite(9, ((num>>6)&0x01));
digitalWrite(10,((num>>7)&0x01));
}
이 예제는 LED를 켜기위해 할당된 I/O 포트와 16진수 값을 맵핑하여 다양한 효과를 낼 수 있음을 보여준다. 0x18은 바이너리값으로 00011000으로 변환되며 여기서 '0'은 LED가 OFF되고, '1'은 LED가 ON 된다. 이것을 이용하면 많은 재미있는 효과를 만들어 낼수 있다.
결론
왼쪽에서 오른쪽으로 각각의 LED가 켜지고 꺼진다.
5가지의 패턴 효과를 구현할 수 있다. 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로, 가장자리에서 중앙으로 중앙에서 가장자리고, 왼쪽에서 오른쪽으로 켜지고 꺼지는 효과를 나타낼 수 있다.
비디오 |