취소

커뮤니티

가이드

서포트

전체

아두이노 기초 LED를 이용한 기초 TIP

이번에는 LED를 이용해서 아두이노의 정말 순수한 기초에 대해서 한 번 연습해보도록하자. 일단 먼저 회로도를 보고 따라서 구성해주길 바란다.

회로도

버튼 누르고 있으면 LED 켜기

조건 1 > 버튼 1을 누르고 있으면 6번 PIN의 LED가 켜진다.조건 2 > 버튼 2를 누르고 있으면 7번 PIN의 LED가 켜진다.

// 변수 정의 #define BUTTON1 2 // BUTTON1은 2번 PIN #define BUTTON2 3 // BUTTON2는 3번 PIN int LED[4] = {6,7,8,9}; // LED1~4는 6번 핀부터 9번 핀까지 순서대로 int val1 = 0; // 디지털 값 저장 1 int val2 = 0; // 디지털 값 저장 2      // 설정 void setup() {   Serial.begin(9600); // PC로 확인을 위한 시리얼 통신     pinMode(BUTTON1, INPUT); // 버튼1은 INPUT으로     pinMode(BUTTON2, INPUT); // 버튼2는 INPUT으로     for(char i=0;i<4;i++) pinMode(LED[i], OUTPUT); // LED는 핀 6번부터 9번까지 순서대로 OUTPUT   }        void loop() {  // 디지털 값 수신     val1 = digitalRead(BUTTON1);   val2 = digitalRead(BUTTON2);         if(val1 == LOW) { // 만약 1번 버튼이 눌러졌다면     Serial.println("BUTTON1"); // PC로 버튼 1 출력     digitalWrite(LED[0], HIGH); // LED 1번 켜기   }else digitalWrite(LED[0], LOW); // 눌러지지 않을 경우 LED 1번 끄기           if(val2 == LOW) { // 만약 2번 버튼이 눌러졌다면     Serial.println("BUTTON2"); // PC로 버튼 2 출력     digitalWrite(LED[1], HIGH); // LED 2번 켜기   }else digitalWrite(LED[1], LOW); // 눌러지지 않을 경우 LED 2번 끄기 }

버튼 누르고 있으면 1초간 LED 켜기

조건 1 > 버튼 1을 누르고 있으면 6번 PIN의 LED가 1초간 켜진다.조건 2 > 버튼 2를 누르고 있으면 7번 PIN의 LED가 1초간 켜진다.

void loop() {   // 디지털 값 수신   val1 = digitalRead(BUTTON1);   val2 = digitalRead(BUTTON2);     if(val1 == LOW) { // 만약 1번 버튼이 눌러졌다면     Serial.println("BUTTON1"); // PC로 버튼 1 출력     digitalWrite(LED[0], HIGH); // LED 1번 켜기     delay(1000); // 지연 1초   }else digitalWrite(LED[0], LOW); // 눌러지지 않을 경우 LED 1번 끄기     if(val2 == LOW) { // 만약 2번 버튼이 눌러졌다면     Serial.println("BUTTON2"); // PC로 버튼 2 출력     digitalWrite(LED[1], HIGH); // LED 2번 켜기     delay(1000); // 지연 1초   }else digitalWrite(LED[1], LOW); // 눌러지지 않을 경우 LED 2번 끄기 }

버튼 누르고 있으면 LED 켜기의 코드에서 delay(1000) 을 추가하는 것으로 끝난다. 이 이외에도 millis()를 이용하는 방법도 있고 for문 또는 while문을 통한 카운트 딜레이 방법도 있다.

버튼 동시에 눌러도 한 쪽 불만 켜지기

조건 1 > 예제 1과 똑같이 버튼을 누르면 LED가 켜져야 한다.조건 2 > 버튼 두 개를 동시에 눌렀을 경우 먼저 누른 쪽만 켜지고, 아닌 쪽은 불이 켜지지 않아야 한다.

int limit = 0; // 추가 버튼 입력 제한 ... void loop() {   // 디지털 값 수신   val1 = digitalRead(BUTTON1);   val2 = digitalRead(BUTTON2);     // 만약 1번 버튼이 눌러졌고, 리미트가 0이라면   if(val1 == HIGH && limit == 0) {     Serial.println("BUTTON1"); // PC로 버튼 1 출력     digitalWrite(LED[0], HIGH); // LED 1번 켜기   }   else if(val2 == HIGH) { // 만약 2번 버튼이 눌러졌다면     Serial.println("BUTTON2"); // PC로 버튼 2 출력     digitalWrite(LED[1], HIGH); // LED 2번 켜기     limit = 1; // 리미트를 1로 변경, 1번 버튼 방지   }else{     // 눌러지지 않을 경우 LED 0번과 2번 끄기     digitalWrite(LED[0], LOW);     digitalWrite(LED[1], LOW);     limit = 0; // 리미트를 0으로 변경, 초기화   } }

단순하게 else if 구문으로 변경하면 될 것이라 생각되는 경우가 있다. 실제로 단순히 else if 변경 하는 것 만으로도 동시 입력을 막을 수 있다. 하지만 그 경우 첫 번째 버튼 입력을 막을 수 없다는 단점이 있다. 이를 보안하기 위해서 임의 변수를 통해서 값이 없을 경우 1번 버튼이 작동되게 하며, 다른 버튼이 눌러졌을 경우 값을 집어넣어 작동되지 않게 막아야 한다.

LED 파도타기

조건 1 > 처음 시작했을 때 왼쪽에서 오른쪽으로 LED가 파도를 탄다.조건 2 > 2번 버튼을 누르면 방향을 바꾸어 반대로 오른쪽에서 왼쪽으로 LED가 파도를 탄다.조건 3 > 1번 버튼을 누르면 다시 방향을 바꾸어 정상적으로 왼쪽에서 오른쪽으로 LED가 파도를 탄다.

int limit = 0; // 추가 버튼 입력 제한 int way = 0; // 파도타기 방향 int way_LED = 0; // LED 지정   ...   void loop() {   // 디지털 값 수신   val1 = digitalRead(BUTTON1);   val2 = digitalRead(BUTTON2);     // 파도타기 방향 지정   if(val1 == HIGH && limit == 0) way = 0;   else if(val2 == HIGH) way = 1, limit = 1;   else limit = 0;     // LED 켜기   digitalWrite(LED[way_LED], HIGH); // way_LED 번의 LED를 켜라   if(way == 0){ // way가 0일 경우     digitalWrite(LED[way_LED-1], LOW); // LED보다 낮은 번호의 LED는 꺼라     way_LED++; // LED의 위치가 1 증가하라   }   else if(way == 1){ // way가 1일 경우     digitalWrite(LED[way_LED+1], LOW); // LED보다 높은 번호의 LED는 꺼라     way_LED--; // LED의 위치가 1 감소하라   }     if(way_LED > 4) way_LED = 0; // 4보다 커지면 0으로 돌아가라   if(way_LED < -1) way_LED = 3; // 3보다 커지면 1으로 돌아가라     delay(500); // 0.5초 지연 }

파도타기 응용

조건 1 > 파도타기 예제의 조건이 충족되어야 한다.조건 2 > 양 끝의 마지막 LED에 갔을 때 LED의 파도타기 방향을 반대로 다시 돌아가게 되어야 한다.

if(way_LED > 4) way_LED = 0; // 4보다 커지면 0으로 돌아가라 if(way_LED < -1) way_LED = 3; // 3보다 커지면 1으로 돌아가라   // ↓ 위의 코드를 아래의 코드처럼 변경하면 끝난다. ↓ //   if(way_LED > 4) way = 1; // 4보다 커지면 방향 전환 if(way_LED < -1) way = 0; // -1보다 작아지면 방향 전환

홀짝 LED 깜박이기

조건 1 > 아두이노에서 특정 값이 계속해서 증가한다.조건 2 > 특정 값이 홀수 일때는 6번 LED가 켜지고, 짝수 일때는 반대로 꺼져야 한다.조건 3 > 특정 갑싱 짝수 일때는 7번 LED가 켜지고, 홀수 일때는 반대로 꺼져야 한다.

int i = 0; while(i) {   if(i%2 == 0) {     digitalWrite(LED[0], HIGH); // LED 1번 켜기     digitalWrite(LED[1], LOW); // LED 2번 끄기   } else {     digitalWrite(LED[0], LOW); // LED 1번 끄기     digitalWrite(LED[1], HIGH); // LED 2번 켜기   }   Serial.println(i); // 확인을 위한 시리얼 출력   delay(1000); // 확인을 위한 시간 지연 }

소스코드에는 정답이 없다. 다양한 생각이 있듯 다양한 방법이 있다. 이 예제들은 그 중 하나일 뿐이다.