아두이노 LED 지연 없이 깜박임
아두이노가 두 가지 작업을 수행해야 한다고 상상해 봅시다: LED를 깜박이는 것과 언제든 눌릴 수 있는 버튼의 상태를 확인하는 것입니다. 만약 delay() 함수(아두이노 - LED - 블링크에서 설명된)를 사용한다면, 아두이노는 일부 누르기 이벤트를 놓칠 수 있습니다. 다시 말해서, 아두이노는 두 번째 작업을 완전히 수행할 수 없습니다.
이 튜토리얼에서는 아두이노가 LED를 깜빡이며 버튼의 상태를 확인하여 어떤 누르는 이벤트도 놓치지 않는 방법을 배워보겠습니다.
아래의 세 가지 예시를 살펴보며 그 차이를 비교할 것입니다.
Arduino는 delay() 함수를 사용하여 LED를 깜박입니다.
Arduino는 millis() 함수를 사용하여 LED를 깜박입니다.
Arduino는 ezLED 라이브러리를 사용하여 LED를 깜박입니다.
1 | × | 아두이노 우노 R3 | 쿠팡 | 아마존 | |
1 | × | USB 2.0 케이블 타입 A/B | 쿠팡 | 아마존 | |
1 | × | LED | 아마존 | |
1 | × | 220Ω 저항기 | 아마존 | |
1 | × | 버튼 키트 | 쿠팡 | 아마존 | |
1 | × | 패널 장착 푸시 버튼 | 아마존 | |
1 | × | 브레드보드 | 쿠팡 | 아마존 | |
1 | × | 점퍼케이블 | 아마존 | |
1 | × | (추천) 아두이노 우노용 스크루 터미널 블록 쉴드 | 쿠팡 | 아마존 | |
1 | × | (추천) 아두이노 우노용 브레드보드 쉴드 | 쿠팡 | 아마존 | |
1 | × | (추천) 아두이노 우노용 케이스 | 쿠팡 | 아마존 | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
LED와 버튼(핀배열, 작동 방식, 프로그래밍 방법 등)에 대해 모른다면, 다음 튜토리얼에서 배워보세요:
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
const int LED_PIN = 3;
const int BUTTON_PIN = 7;
const long BLINK_INTERVAL = 1000;
int ledState = LOW;
int previousButtonState = LOW;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
}
void loop() {
ledState = (ledState == LOW) ? HIGH : LOW;
digitalWrite(LED_PIN, ledState);
delay(BLINK_INTERVAL);
int currentButtonState = digitalRead(BUTTON_PIN);
if(currentButtonState != previousButtonState) {
Serial.println(currentButtonState);
previousButtonState = currentButtonState;
}
}
아두이노를 USB 케이블을 통해 PC에 연결합니다.
아두이노 IDE를 열고, 올바른 보드와 포트를 선택합니다.
위의 코드를 복사하고 아두이노 IDE로 엽니다.
아두이노 IDE에서 Upload 버튼을 클릭하여 코드를 아두이노에 업로드합니다.
시리얼 모니터에서 몇 번의 누름 시간이 누락되었습니다. 딜레이 시간 동안 아두이노는 아무것도 할 수 없기 때문입니다. 따라서, 누름 이벤트를 감지할 수 없습니다.
const int LED_PIN = 3;
const int BUTTON_PIN = 7;
const long BLINK_INTERVAL = 1000;
int ledState = LOW;
int previousButtonState = LOW;
unsigned long previousMillis = 0;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= BLINK_INTERVAL) {
ledState = (ledState == LOW) ? HIGH : LOW;
digitalWrite(LED_PIN, ledState);
previousMillis = currentMillis;
}
int currentButtonState = digitalRead(BUTTON_PIN);
if(currentButtonState != previousButtonState) {
Serial.println(currentButtonState);
previousButtonState = currentButtonState;
}
}
위의 코드를 실행하고 버튼을 4번 누르세요.
LED를 확인하세요: LED가 매초마다 ON/OFF 사이를 주기적으로 전환합니다.
시리얼 모니터에서 출력을 확인하세요.
모든 긴급 사건이 감지되었습니다.
위의 아두이노 코드의 주석 라인에서 설명을 찾을 수 있습니다.
아래 코드는 두 개의 LED를 다른 간격으로 깜박이며 버튼의 상태를 확인합니다.
const int LED_PIN_1 = 3;
const int LED_PIN_2 = LED_BUILTIN;
const int BUTTON_PIN = 7;
const long BLINK_INTERVAL_1 = 1000;
const long BLINK_INTERVAL_2 = 500;
int ledState_1 = LOW;
int ledState_2 = LOW;
int previousButtonState = LOW;
unsigned long previousMillis_1 = 0;
unsigned long previousMillis_2 = 0;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis_1 >= BLINK_INTERVAL_1) {
ledState_1 = (ledState_1 == LOW) ? HIGH : LOW;
digitalWrite(LED_PIN_1, ledState_1);
previousMillis_1 = currentMillis;
}
if (currentMillis - previousMillis_2 >= BLINK_INTERVAL_2) {
ledState_2 = (ledState_2 == LOW) ? HIGH : LOW;
digitalWrite(LED_PIN_2, ledState_2);
previousMillis_2 = currentMillis;
}
int currentButtonState = digitalRead(BUTTON_PIN);
if(currentButtonState != previousButtonState) {
Serial.println(currentButtonState);
previousButtonState = currentButtonState;
}
}
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
이 방법은 아두이노가 서로를 방해하지 않고 동시에 여러 작업을 수행할 수 있게 해줍니다. 예를 들어, 인터넷에 요청을 보내고 응답을 기다리는 동안, LED 표시등을 깜박이고 취소 버튼을 확인합니다.