보드/아두이노기본코드

LED 2개로 0~3까지 표시하기

e코딩넷 블로그 2023. 5. 9. 21:10
숫자 LED2 LED1
0 OFF OFF
1 OFF ON
2 ON OFF
3 ON ON

 

LED 2개는 총 4가지 경우를 표시할 수 있습니다. 각각의 경우가 숫자에 대응한다고 생각하면 0~3까지 숫자를 표시할 수 있습니다.

int LED1 = 2; // 첫 번째 LED 핀
int LED2 = 3; // 두 번째 LED 핀

void setup() {
  pinMode(LED1, OUTPUT); // LED1 핀을 출력으로 설정
  pinMode(LED2, OUTPUT); // LED2 핀을 출력으로 설정
}

void loop() {
  // 0
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  delay(1000);
  
  // 1
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, LOW);
  delay(1000);
  
  // 2
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, HIGH);
  delay(1000);
  
  // 3
  digitalWrite(LED1, HIGH);
  digitalWrite(LED2, HIGH);
  delay(1000);
}


위 코드에서, int LED1 = 2;와 int LED2 = 3;는 각각 첫 번째 LED와 두 번째 LED가 연결된 핀 번호를 나타냅니다. void setup() 함수에서 pinMode() 함수를 이용하여 LED 핀을 출력으로 설정해줍니다. void loop() 함수에서는 각 2진수 값에 따라 LED를 켜고 끄는 동작을 반복적으로 수행합니다. digitalWrite() 함수를 이용하여 LED를 켜거나 끕니다. 각 LED를 켜는 시간은 delay() 함수를 이용하여 1초로 설정했습니다.

 

이것을 for문을 이용한 코드입니다.

 

int LED1 = 2; // 첫 번째 LED 핀
int LED2 = 3; // 두 번째 LED 핀

void setup() {
  pinMode(LED1, OUTPUT); // LED1 핀을 출력으로 설정
  pinMode(LED2, OUTPUT); // LED2 핀을 출력으로 설정
}

void loop() {
  for(int i = 0; i < 4; i++) {
    digitalWrite(LED1, i & 0x1); // 첫 번째 비트를 LED1에 출력
    digitalWrite(LED2, (i >> 1) & 0x1); // 두 번째 비트를 LED2에 출력
    delay(1000);
  }
}

위 코드에서 for문을 이용하여 0부터 3까지의 값을 순차적으로 출력합니다. digitalWrite() 함수에서는 첫 번째 LED에는 i 값의 첫 번째 비트를, 두 번째 LED에는 i 값의 두 번째 비트를 출력합니다. 이를 위해서 &와 >> 비트 연산자를 이용합니다. 마지막으로 delay() 함수를 이용하여 1초 동안 대기합니다.

 

digitalWrite(LED1, i & 0x1)는 i 값의 첫 번째 비트를 LED1에 출력하는 코드입니다. 여기서 & 비트 연산자는 두 비트를 비교하여 둘 다 1일 때만 1을 출력하는 기능을 합니다. 이를 이용하여 i 값을 2진수로 표현했을 때 첫 번째 비트가 1이면 1을 출력하고, 0이면 0을 출력합니다.

digitalWrite(LED2, (i >> 1) & 0x1)는 i 값의 두 번째 비트를 LED2에 출력하는 코드입니다. 여기서 >> 비트 연산자는 오른쪽으로 비트를 이동시키는 연산을 합니다. 이를 이용하여 i 값을 2진수로 표현했을 때 두 번째 비트를 첫 번째 비트로 이동시킨 후, 첫 번째 비트와 마찬가지로 & 비트 연산자를 이용하여 출력합니다.

코드를 이해하기 어려우면 다음과 같이 두 줄의 코드를 알기 쉽게 풀어서 코딩한 것을 참고하시면 됩니다.

 

if(i % 2 == 1) { // i가 홀수일 때
  digitalWrite(LED1, HIGH); // LED1을 켭니다.
} else { // i가 짝수일 때
  digitalWrite(LED1, LOW); // LED1을 끕니다.
}

if(i >= 2) { // i가 2 이상일 때
  digitalWrite(LED2, HIGH); // LED2를 켭니다.
} else { // i가 0 또는 1일 때
  digitalWrite(LED2, LOW); // LED2를 끕니다.
}