아두이노가 두 가지 작업을 수행해야 한다고 상상해 봅시다: LED를 깜박이는 것과 언제든 눌릴 수 있는 버튼의 상태를 확인하는 것입니다. 만약 delay() 함수(아두이노 - LED - 블링크에서 설명된)를 사용한다면, 아두이노는 일부 누르기 이벤트를 놓칠 수 있습니다. 다시 말해서, 아두이노는 두 번째 작업을 완전히 수행할 수 없습니다.
이 튜토리얼에서는 아두이노가 LED를 깜빡이며 버튼의 상태를 확인하여 어떤 누르는 이벤트도 놓치지 않는 방법을 배워보겠습니다.
아래의 세 가지 예시를 살펴보며 그 차이를 비교할 것입니다.
Arduino는 delay() 함수를 사용하여 LED를 깜박입니다.
Arduino는 millis() 함수를 사용하여 LED를 깜박입니다.
Arduino는 ezLED 라이브러리를 사용하여 LED를 깜박입니다.
※ 주의:
이 방법은 LED를 깜박이고 버튼의 상태를 확인하는 것뿐만 아니라 일반적으로 여러 작업을 서로 방해하지 않고 동시에 수행할 수 있도록 합니다.
이 튜토리얼은 작동 원리를 이해하는 데 도움이 되는 심층적인 지식을 제공합니다. 쉽게 하기 위해 아두이노 - LED 라이브러리를 사용할 수 있습니다.
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-led-blink-without-delay */// constants won't change:constint LED_PIN = 3; // LED 핀의 번호입니다constint BUTTON_PIN = 7; // 버튼 핀의 번호입니다constlong BLINK_INTERVAL = 1000; // LED가 깜빡이는 간격 (밀리초)// Variables will change:int ledState = LOW; // ledState는 LED를 설정하는데 사용됩니다int previousButtonState = LOW; // 마지막으로 버튼이 업데이트된 시간을 저장합니다voidsetup() {Serial.begin(9600);// 디지털 핀을 출력으로 설정합니다:pinMode(LED_PIN, OUTPUT);// 디지털 핀을 입력으로 설정합니다:pinMode(BUTTON_PIN, INPUT);}voidloop() {// 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 버튼을 클릭하여 코드를 아두이노에 업로드합니다.
시리얼 모니터 열기
버튼을 4번 누르세요
LED 확인: LED가 매초마다 켜졌다 꺼졌다 합니다
시리얼 모니터에서 출력 확인
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
1
0
Ln 11, Col 1
Arduino Uno on COM15
2
시리얼 모니터에서 몇 번의 누름 시간이 누락되었습니다. 딜레이 시간 동안 아두이노는 아무것도 할 수 없기 때문입니다. 따라서, 누름 이벤트를 감지할 수 없습니다.
아두이노 코드 - 딜레이 없이
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-led-blink-without-delay */// constants won't change:constint LED_PIN = 3; // LED 핀의 번호constint BUTTON_PIN = 7; // 버튼 핀의 번호constlong BLINK_INTERVAL = 1000; // LED를 깜빡이는 간격 (밀리초)// Variables will change:int ledState = LOW; // LED를 설정하는데 사용되는 ledStateint previousButtonState = LOW; // 마지막으로 버튼이 업데이트된 시간을 저장할 것입니다unsignedlong previousMillis = 0; // 마지막으로 LED가 업데이트된 시간을 저장할 것입니다voidsetup() {Serial.begin(9600);// 디지털 핀을 출력으로 설정:pinMode(LED_PIN, OUTPUT);// 디지털 핀을 입력으로 설정:pinMode(BUTTON_PIN, INPUT);}voidloop() {// LED를 깜빡일 시간인지 확인하십시오. 즉, LED를 마지막으로 깜빡인 현재 시간과 시간의 차이가// LED를 깜빡이고 싶은 간격보다 큰 경우입니다.unsignedlong 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 사이를 주기적으로 전환합니다.
시리얼 모니터에서 출력을 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
1
0
1
0
1
0
1
0
Ln 11, Col 1
Arduino Uno on COM15
2
모든 긴급 사건이 감지되었습니다.
코드 설명
위의 아두이노 코드의 주석 라인에서 설명을 찾을 수 있습니다.
더 많은 작업 추가하기
아래 코드는 두 개의 LED를 다른 간격으로 깜박이며 버튼의 상태를 확인합니다.
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-led-blink-without-delay */// constants won't change:constint LED_PIN_1 = 3; // LED 1 핀의 번호constint LED_PIN_2 = LED_BUILTIN; // LED 2 핀의 번호constint BUTTON_PIN = 7; // 버튼 핀의 번호constlong BLINK_INTERVAL_1 = 1000; // LED 1을 깜박이는 간격 (밀리초)constlong BLINK_INTERVAL_2 = 500; // LED 2를 깜박이는 간격 (밀리초)// Variables will change:int ledState_1 = LOW; // LED 1을 설정하는데 사용되는 ledStateint ledState_2 = LOW; // LED 2를 설정하는데 사용되는 ledStateint previousButtonState = LOW; // 마지막으로 버튼 상태가 업데이트된 시간을 저장함unsignedlong previousMillis_1 = 0; // 마지막으로 LED 1이 업데이트된 시간을 저장함unsignedlong previousMillis_2 = 0; // 마지막으로 LED 2가 업데이트된 시간을 저장함voidsetup() {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);}voidloop() {unsignedlong currentMillis = millis();// check to see if it's time to blink the LED 1if (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 2if (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 changeint 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 표시등을 깜박이고 취소 버튼을 확인합니다.