우리가 ESP8266이 LED를 깜박이는 일과 언제든 눌릴 수 있는 버튼의 상태를 모니터링하는 두 가지 작업을 수행해야 한다고 상상해 봅시다. 만약 delay() 함수를 사용한다면(이전 튜토리얼에서 설명한 것처럼 [BASE_URL/tutorials/esp8266/esp8266-led]), ESP8266은 일부 버튼 누름을 놓칠 수 있습니다. 다시 말해, ESP8266은 두 번째 작업을 완전히 수행할 수 없게 됩니다.
이 튜토리얼은 ESP8266이 LED를 깜박이게 하고 버튼의 상태를 놓치지 않고 모니터링하는 방법을 알려줍니다.
우리는 세 가지 예를 살펴보고 그들 사이의 차이점을 비교할 것입니다:
delay() 함수를 사용하여 ESP8266이 LED를 깜박이기
millis() 함수를 사용하여 ESP8266이 LED를 깜박이기
ezLED 라이브러리를 사용하여 ESP8266이 LED를 깜박이기
이 방법은 LED를 깜박이고 버튼의 상태를 확인하는 것에만 국한되지 않습니다. 일반적으로 ESP8266이 서로를 차단하지 않고 여러 작업을 동시에 수행할 수 있게 합니다.
/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-led-blink-without-delay */#define BUTTON_PIN D1 // ESP8266의 D1 핀이 버튼에 연결됩니다#define LED_PIN D7 // ESP8266의 D7 핀이 LED에 연결됩니다#define BLINK_INTERVAL 1000 // LED를 깜빡이는 간격 (밀리초)int led_state = LOW; // led_state는 LED를 설정하는 데 사용됩니다.int prev_button_state = LOW; // 버튼이 마지막으로 업데이트된 시간을 저장합니다.voidsetup() {Serial.begin(9600);// ESP8266 핀을 디지털 출력 핀으로 구성pinMode(LED_PIN, OUTPUT);// ESP8266 핀을 디지털 입력 핀으로 구성pinMode(BUTTON_PIN, INPUT);}voidloop() {// LED가 꺼져 있으면 켜고, 그렇지 않으면 끕니다: led_state == (led_state == LOW) ? HIGH : LOW;// 변수의 led_state로 LED를 설정:digitalWrite(LED_PIN, led_state);delay(BLINK_INTERVAL); // 이 시간 동안 버튼이 눌리면 ESP8266이 감지할 수 없습니다int button_state = digitalRead(BUTTON_PIN);if(button_state != prev_button_state) {// 버튼의 상태를 출력:Serial.println(button_state);// 버튼의 마지막 상태를 저장 prev_button_state = button_state; }// 이곳에서 다른 작업 수행}
사용 방법
Arduino IDE에서 ESP8266을 시작하는 방법은 다음과 같은 단계를 따르세요:
ESP8266을 Arduino IDE에서 설정하는 방법에 대해 처음인 경우 ESP8266 - 소프트웨어 설치 튜토리얼을 확인하세요.
다이어그램에 표시된 대로 구성 요소를 연결하세요.
USB 케이블을 사용하여 ESP8266 보드를 컴퓨터에 연결하세요.
컴퓨터에서 Arduino IDE를 엽니다.
올바른 ESP8266 보드를 선택하세요. 예를 들어, NodeMCU 1.0 (ESP-12E Module)과 해당 COM 포트를 선택하세요.
USB 케이블을 ESP8266과 PC에 연결하세요.
Arduino IDE를 실행하여 올바른 보드와 포트를 선택하세요.
코드를 복사하여 Arduino IDE에서 엽니다.
Arduino IDE에서 Upload 버튼을 클릭하여 코드를 컴파일하고 ESP8266에 업로드하세요.
시리얼 모니터를 엽니다.
버튼을 네 번 누릅니다.
LED를 확인하세요; 1초마다 켜졌다 꺼졌다 합니다.
시리얼 모니터에서 출력을 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
1
0
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2
시리얼 모니터에서, 몇몇 누름 시간이 등록되지 않았습니다. 이는 ESP8266이 지연 상태인 동안 어떠한 작업도 수행할 수 없기 때문입니다. 결과적으로, 누름 이벤트를 감지할 수 없습니다.
ESP8266 코드 - 지연 없이
/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-led-blink-without-delay */#define BUTTON_PIN D1 // 버튼에 연결된 ESP8266 핀 D1#define LED_PIN D7 // LED에 연결된 ESP8266 핀 D7#define BLINK_INTERVAL 1000 // LED를 깜박이는 간격 (밀리초)int led_state = LOW; // led 상태로 LED 설정int prev_button_state = LOW; // 마지막으로 버튼 상태가 업데이트된 시간을 저장합니다unsignedlong prev_time_ms = 0; // 마지막으로 LED가 업데이트된 시간을 저장합니다voidsetup() {Serial.begin(9600);// ESP8266 핀을 디지털 출력 핀으로 설정pinMode(LED_PIN, OUTPUT);// ESP8266 핀을 디지털 입력 핀으로 설정pinMode(BUTTON_PIN, INPUT);}voidloop() {// LED를 깜박이는 시간이 되었는지 확인합니다; 즉, 현재 시간과 마지막으로 LED를 깜박인 시간의 차이가// LED를 깜박이고 싶은 간격보다 큰지 확인합니다.unsignedlong time_ms = millis();if (time_ms - prev_time_ms >= BLINK_INTERVAL) {// LED가 꺼져 있으면 켜고 반대의 경우도 마찬가지입니다: led_state == (led_state == LOW) ? HIGH : LOW;// led_state 변수의 상태로 LED를 설정합니다:digitalWrite(LED_PIN, led_state);// 마지막으로 LED를 깜박인 시간을 저장합니다 prev_time_ms = time_ms; }// 버튼 상태의 변경을 확인합니다int button_state = digitalRead(BUTTON_PIN);if(button_state != prev_button_state) {// 버튼의 상태를 출력합니다:Serial.println(button_state);// 버튼의 마지막 상태를 저장합니다 prev_button_state = button_state; }// 여기에서 다른 작업을 수행합니다}
사용 방법
다이어그램에 표시된 대로 구성요소를 연결하세요.
USB 케이블을 사용하여 ESP8266 보드를 컴퓨터에 연결하세요.
컴퓨터에서 Arduino IDE를 엽니다.
올바른 ESP8266 보드를 선택하세요. 예를 들어, (NodeMCU 1.0 (ESP-12E Module))와 해당 COM 포트를 선택합니다.
코드를 실행하고 버튼을 4번 누르세요.
LED를 확인하세요. 1초 간격으로 규칙적으로 켜지고 꺼집니다.
시리얼 모니터에서 출력을 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
1
0
1
0
1
0
1
0
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2
모든 긴급한 문제들이 식별되었습니다.
코드 설명
소스 코드의 주석에 포함된 줄별 설명을 확인하세요!
더 많은 작업 추가하기
아래의 ESP8266 코드는 다음과 같습니다:
두 개의 LED를 다른 간격으로 깜빡입니다.
버튼의 상태를 확인합니다.
/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-led-blink-without-delay */#define BUTTON_PIN D1 // ESP8266 핀 D1이 버튼에 연결됨#define LED_PIN_1 D6 // ESP8266 핀 D7이 led에 연결됨#define LED_PIN_2 D7 // ESP8266 핀 D7이 led에 연결됨#define BLINK_INTERVAL_1 1000 // LED 1을 깜빡이는 간격 (밀리초)#define BLINK_INTERVAL_2 500 // LED 2를 깜빡이는 간격 (밀리초)int led_state_1 = LOW; // LED 1을 설정하는 데 사용되는 led_stateint led_state_2 = LOW; // LED 2를 설정하는 데 사용되는 led_stateint prev_button_state = LOW; // 버튼이 마지막으로 업데이트된 시간을 저장할 것unsignedlong prev_time_ms_1 = 0; // LED 1이 마지막으로 업데이트된 시간을 저장할 것unsignedlong prev_time_ms_2 = 0; // LED 2가 마지막으로 업데이트된 시간을 저장할 것voidsetup() {Serial.begin(9600);// ESP8266 핀을 디지털 출력 핀으로 구성pinMode(LED_PIN_1, OUTPUT);pinMode(LED_PIN_2, OUTPUT);// ESP8266 핀을 디지털 입력 핀으로 구성pinMode(BUTTON_PIN, INPUT);}voidloop() {unsignedlong time_ms = millis();// LED 1을 깜빡일 시간인지 확인if (time_ms - prev_time_ms_1 >= BLINK_INTERVAL_1) {// LED가 꺼져 있으면 켜고 그 반대의 경우도 마찬가지: led_state_1 == (led_state_1 == LOW) ? HIGH : LOW;// 변수의 led_state로 LED를 설정:digitalWrite(LED_PIN_1, led_state_1);// LED를 깜빡인 마지막 시간을 저장 prev_time_ms_1 = time_ms; }// LED 2를 깜빡일 시간인지 확인if (time_ms - prev_time_ms_2 >= BLINK_INTERVAL_2) {// LED가 꺼져 있으면 켜고 그 반대의 경우도 마찬가지: led_state_2 == (led_state_2 == LOW) ? HIGH : LOW;// 변수의 led_state로 LED를 설정:digitalWrite(LED_PIN_2, led_state_2);// LED를 깜빡인 마지막 시간을 저장 prev_time_ms_1 = time_ms; }// 버튼 상태의 변화를 확인int button_state = digitalRead(BUTTON_PIN);if(button_state != prev_button_state) {// 버튼의 상태를 출력:Serial.println(button_state);// 버튼의 마지막 상태를 저장 prev_button_state = button_state; }// 여기서 다른 작업을 하세요}
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
확장성
이 방법은 ESP8266이 여러 작업을 동시에 수행할 수 있게 해줍니다. 한 작업이 다른 작업을 차단하지 않고요. 예를 들어, 인터넷에 요청을 보내고 응답을 기다리는 동안 LED 표시등을 깜박이고 취소 버튼을 모니터링하는 것입니다.