티스토리 뷰

Embedded/Arduino

아두이노 코딩 LED Toggle (On/OFF) 여러 가지 방식

좁고 얕은 지식 Yongmini 2020. 7. 19. 01:32

아두이노 LED아두이노 LED

Arduino Uno LED Toggle with / without delay()

아두이노 우노 보드에서 delay(), millis() 함수와 MsTimer2 라이브러리를 사용한 LED Toggle 예제

입니다.

Hardware

준비물

  본 예제 구성품은 아래와 같습니다.

  • Arduino Uno x 1 EA
  • DIP LED x 1 EA
  • Resistor 1kΩ x 1 EA ( 200 Ω ~ 1 kΩ 무관)
  • Bread Board x 1 EA
  • Jumper Wires

회로도

LED Toggle 회로도(좌) 회로도, (우) 연결 방법 예시

회로 참고사항

LED 직렬 저항 크기 선정시 아래의 사항이 고려 되어야 합니다.

  • 아두이노 digital Pin 의 최대 출력 전류는 30mA 이하로 되도록 저항 값 결정
  • LED (일반적으로) 정방향 전류 IF가 20mA 를 초과 하지 않도록 저항 값 결정


Software

LED를 200ms 간격으로 토글되는 예제를 3가지로 준비하였습니다.

  • 예제1 : 시간 지연 함수를 사용하여 LED Toggle 구현
  • 예제2 : 시간 지연이 아닌 측정 하는 방식을 사용하여 LED Toggle 을 구현
  • 예제3 : 타이머 인터럽트를 사용하여 LED Toggle 을 구현
예제는 #define 구문에서 LED 핀 번호와, LED Toggle 되는 시간 간격을 조정할 수 있도록 작성하였습니다.

예제1 : delay() 함수 사용

delay() 함수를 사용하여 LED를 Toggle 하는 예제입니다.

USER CODE BEGIN ~ END 사이에 추가 코드를 작성 할 수 있지만, delay(200) 으로 200ms 지연되는 동안에는 아무 동작을 할 수 없습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define ledPin 13 // LED pin Number
#define ledPeriod 200 // Unit : milliseconds
 
void setup(){
    pinMode(ledPin, OUTPUT);
    /* USER CODE BEGIN */
 
    /* USER CODE END */
}
 
void loop(){
    digitalWrite(ledPin, !digitalRead(ledPin));
    delay(200);
    /* USER CODE BEGIN */
 
    /* USER CODE END */
}
cs


예제2 : millis() 함수 사용

millis() 함수를 사용하여 LED를 Toggle 하는 예제입니다. 

LED Toggle 되는 시간 사이에 USER CODE BEGIN ~ END 코드가 함께 실행 됩니다. 코드의 복잡성에 따라 200ms 에서 오차가 있을 수 있습니다.

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
#define ledPin 13 // LED pin Number
#define ledPeriod 200 // Unit : milliseconds
 
unsigned long past = 0;
int flag = 0;
 
void setup(){
    pinMode(ledPin, OUTPUT);
    /* USER CODE BEGIN */
 
    /* USER CODE END */
}
 
void loop(){
    unsigned long now = millis();
 
    if(now - past >= ledPeriod){ 
        past = now;
        flag = 1;
    }
 
    if(flag == 1){
        digitalWrite(ledPin, !(digitalRead(ledPin)));
        flag = 0;
    }
    /* USER CODE BEGIN */
 
    /* USER CODE END */
}
cs

예제3 : MsTimer2 라이브러리 사용

타이머 인터럽트를 사용하여 LED를 Toggle 하는 예제입니다.

LED Toggle 기능이 USER CODE BEGIN ~ END 보다 우선순위가 높아, LED Toggle 시간 간격을 200ms 로 정확히 지키면서 USER CODE 수행이 가능합니다.

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
#include <MsTimer2.h>
 
#define ledPin 13 // LED pin Number
#define ledPeriod 200 // Unit : milliseconds
 
volatile boolean state = true;
 
void setup(){
    pinMode(ledPin, OUTPUT);
    MsTimer2::set(200, ledBlink);
    MsTimer2::start();
    /* USER CODE BEGIN */
 
    /* USER CODE END */
}
 
void loop(){
    /* USER CODE BEGIN */
 
    /* USER CODE END */
}
 
void ledBlink(){
    digitalWrite(ledPin, state);
    state = !state;
}
cs

실행결과

예제 1,2,3 모두 실행 결과 동일합니다.


See Also

본 예제의 추가 코드 설명은 아래의 포스트를 참고해주세요.

관련포스트

digitalPin 출력

delay(), millis() 등의 아두이노 시간 함수

아두이노 타이머 인터럽트 MsTimer2 사용법


끝까지 읽어주셔서 감사합니다.^^


댓글
댓글쓰기 폼
최근에 올라온 글
«   2020/10   »
        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
Total
21,940
Today
165
Yesterday
595