아두이노 - LED - 지연 없이 깜박임 | Arduino - LED - Blink Without Delay

아두이노가 두 가지 작업을 수행해야 한다고 상상해 봅시다: LED를 깜박이는 것과 언제든 눌릴 수 있는 버튼의 상태를 확인하는 것입니다. 만약 delay() 함수(이전 튜토리얼에서 설명된)를 사용한다면, 아두이노는 일부 누르기 이벤트를 놓칠 수 있습니다. 다시 말해서, 아두이노는 두 번째 작업을 완전히 수행할 수 없습니다.

이 튜토리얼에서는 아두이노가 LED를 깜빡이며 버튼의 상태를 확인하여 어떤 누르는 이벤트도 놓치지 않는 방법을 배워보겠습니다.

아래의 세 가지 예시를 살펴보며 그 차이를 비교할 것입니다.

※ NOTE THAT:

  • 이 방법은 LED를 깜박이고 버튼의 상태를 확인하는 것뿐만 아니라 일반적으로 여러 작업을 서로 방해하지 않고 동시에 수행할 수 있도록 합니다.
  • 이 튜토리얼은 작동 원리를 이해하는 데 도움이 되는 심층적인 지식을 제공합니다. 쉽게 하기 위해 아두이노 - LED 라이브러리를 사용할 수 있습니다.

준비물

1×Arduino Uno Amazon
1×USB 2.0 cable type A/B 쿠팡 | Amazon
1×LED Amazon
1×220 ohm resistor Amazon
1×Push Button Amazon
1×(Optional) Panel-mount Push Button Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Optional) 9V Power Adapter for Arduino Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

LED 및 버튼에 관하여

LED와 버튼(핀배열, 작동 방식, 프로그래밍 방법 등)에 대해 모른다면, 다음 튜토리얼에서 배워보세요:

선연결

Arduino LED Wiring Diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

아두이노 코드 - 지연 시간 포함

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-led-blink-without-delay */ // constants won't change: const int LED_PIN = 3; // LED 핀의 번호입니다 const int BUTTON_PIN = 7; // 버튼 핀의 번호입니다 const long BLINK_INTERVAL = 1000; // LED가 깜빡이는 간격 (밀리초) // Variables will change: int ledState = LOW; // ledState는 LED를 설정하는데 사용됩니다 int previousButtonState = LOW; // 마지막으로 버튼이 업데이트된 시간을 저장합니다 void setup() { Serial.begin(9600); // 디지털 핀을 출력으로 설정합니다: pinMode(LED_PIN, OUTPUT); // 디지털 핀을 입력으로 설정합니다: pinMode(BUTTON_PIN, INPUT); } void loop() { // LED가 꺼져 있다면 켜고, 그 반대의 경우도 실행합니다: ledState = (ledState == LOW) ? HIGH : LOW; // 변수의 ledState로 LED를 설정합니다: 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 버튼을 클릭하여 코드를 아두이노에 업로드합니다.
Arduino IDE - How to Upload Code
  • 시리얼 모니터 열기
  • 버튼을 4번 누르세요
  • LED 확인: LED가 매초마다 켜졌다 꺼졌다 합니다
  • 시리얼 모니터에서 출력 확인
COM6
Send
1 0
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

시리얼 모니터에서 몇 번의 누름 시간이 누락되었습니다. 딜레이 시간 동안 아두이노는 아무것도 할 수 없기 때문입니다. 따라서, 누름 이벤트를 감지할 수 없습니다.

아두이노 코드 - 딜레이 없이

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-led-blink-without-delay */ // constants won't change: const int LED_PIN = 3; // LED 핀의 번호 const int BUTTON_PIN = 7; // 버튼 핀의 번호 const long BLINK_INTERVAL = 1000; // LED를 깜빡이는 간격 (밀리초) // Variables will change: int ledState = LOW; // LED를 설정하는데 사용되는 ledState int previousButtonState = LOW; // 마지막으로 버튼이 업데이트된 시간을 저장할 것입니다 unsigned long previousMillis = 0; // 마지막으로 LED가 업데이트된 시간을 저장할 것입니다 void setup() { Serial.begin(9600); // 디지털 핀을 출력으로 설정: pinMode(LED_PIN, OUTPUT); // 디지털 핀을 입력으로 설정: pinMode(BUTTON_PIN, INPUT); } void loop() { // LED를 깜빡일 시간인지 확인하십시오. 즉, LED를 마지막으로 깜빡인 현재 시간과 시간의 차이가 // LED를 깜빡이고 싶은 간격보다 큰 경우입니다. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= BLINK_INTERVAL) { // LED가 꺼져 있으면 켜고 그 반대도 마찬가지입니다: ledState = (ledState == LOW) ? HIGH : LOW; // 변수의 ledState로 LED를 설정하십시오: digitalWrite(LED_PIN, ledState); // LED를 마지막으로 깜빡인 시간을 저장하십시오 previousMillis = currentMillis; } // 버튼 상태의 변경을 확인 int currentButtonState = digitalRead(BUTTON_PIN); if(currentButtonState != previousButtonState) { // 버튼의 상태를 출력하십시오: Serial.println(currentButtonState); // 버튼의 마지막 상태를 저장하십시오 previousButtonState = currentButtonState; } // 이곳에 다른 작업을 수행하세요 }

사용 방법

위의 코드를 실행하고 버튼을 4번 누르세요.

LED를 확인하세요: LED가 매초마다 ON/OFF 사이를 주기적으로 전환합니다.

시리얼 모니터에서 출력을 확인하세요.

COM6
Send
1 0 1 0 1 0 1 0
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

모든 긴급 사건이 감지되었습니다.

코드 설명

위의 아두이노 코드의 주석 라인에서 설명을 찾을 수 있습니다.

더 많은 작업 추가하기

아래 코드는 두 개의 LED를 다른 간격으로 깜박이며 버튼의 상태를 확인합니다.

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-led-blink-without-delay */ // constants won't change: const int LED_PIN_1 = 3; // LED 1 핀의 번호 const int LED_PIN_2 = LED_BUILTIN; // LED 2 핀의 번호 const int BUTTON_PIN = 7; // 버튼 핀의 번호 const long BLINK_INTERVAL_1 = 1000; // LED 1을 깜박이는 간격 (밀리초) const long BLINK_INTERVAL_2 = 500; // LED 2를 깜박이는 간격 (밀리초) // Variables will change: int ledState_1 = LOW; // LED 1을 설정하는데 사용되는 ledState int ledState_2 = LOW; // LED 2를 설정하는데 사용되는 ledState int previousButtonState = LOW; // 마지막으로 버튼 상태가 업데이트된 시간을 저장함 unsigned long previousMillis_1 = 0; // 마지막으로 LED 1이 업데이트된 시간을 저장함 unsigned long previousMillis_2 = 0; // 마지막으로 LED 2가 업데이트된 시간을 저장함 void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN_1, OUTPUT); pinMode(LED_PIN_2, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT); } void loop() { unsigned long currentMillis = millis(); // check to see if it's time to blink the LED 1 if (currentMillis - previousMillis_1 >= BLINK_INTERVAL_1) { // if the LED is off turn it on and vice-versa: ledState_1 = (ledState_1 == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN_1, ledState_1); // save the last time you blinked the LED previousMillis_1 = currentMillis; } // check to see if it's time to blink the LED 2 if (currentMillis - previousMillis_2 >= BLINK_INTERVAL_2) { // if the LED is off turn it on and vice-versa: ledState_2 = (ledState_2 == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN_2, ledState_2); // save the last time you blinked the LED previousMillis_2 = currentMillis; } // check button state's change int currentButtonState = digitalRead(BUTTON_PIN); if(currentButtonState != previousButtonState) { // print out the state of the button: Serial.println(currentButtonState); // save the last state of button previousButtonState = currentButtonState; } // DO OTHER WORKS HERE }

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

확장성

이 방법은 아두이노가 서로를 방해하지 않고 동시에 여러 작업을 수행할 수 있게 해줍니다. 예를 들어, 인터넷에 요청을 보내고 응답을 기다리는 동안, LED 표시등을 깜박이고 취소 버튼을 확인합니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!