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
회로도
(좌) 회로도, (우) 연결 방법 예시
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
본 예제의 추가 코드 설명은 아래의 이전 포스트를 참고해주세요. 끝까지 읽어 주셔서 감사합니다.😄
'Embedded > Arduino' 카테고리의 다른 글
아두이노 코딩 스위치 입력 인터럽트(Interrupt) 방식으로 LED 제어 (0) | 2020.07.20 |
---|---|
아두이노 코딩 스위치 입력 폴링 방식 (Switch Polling) 으로 LED 제어 (0) | 2020.07.19 |
아두이노 팁 #4. Visual Studio Code로 아두이노 디버깅 환경 설정 및 실행 (8) | 2020.07.18 |
아두이노 팁 #3. Visual Studio Code로 아두이노 코딩 사용법과 나노팁 (0) | 2020.07.16 |
아두이노 팁 #2. Visual Studio Code로 아두이노 프로그래밍 장점 (feat. Arduino IDE 불편해) (1) | 2020.07.15 |