ESP32 버튼 긴 누름 짧은 누름
이 튜토리얼은 ESP32를 사용하여 긴 누름과 짧은 누름을 감지하는 방법을 지시합니다. 구체적으로, 우리는 배울 것입니다:
버튼의 짧은 누름을 감지하는 방법
버튼의 긴 누름을 감지하는 방법
긴 누름과 짧은 누름을 모두 감지하는 방법
1 | × | ESP32 ESP-WROOM-32 개발 모듈 | 쿠팡 | 아마존 | |
1 | × | USB 케이블 타입-C | 쿠팡 | 아마존 | |
1 | × | 버튼 키트 | 쿠팡 | 아마존 | |
1 | × | 패널 장착 푸시 버튼 | 아마존 | |
1 | × | 브레드보드 | 쿠팡 | 아마존 | |
1 | × | 점퍼케이블 | 아마존 | |
1 | × | (옵션) DC 커넥터 전원 연결 잭 플러그 소켓 | 쿠팡 | 아마존 | |
1 | × | (추천) ESP32용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
1 | × | (추천) ESP32용 전원 분배기 | 쿠팡 | 아마존 | |
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.
우리는 버튼에 관한 구체적인 튜토리얼을 가지고 있습니다. 각 튜토리얼은 하드웨어 핀아웃, 작동 원리, ESP32에 대한 배선 연결, ESP32 코드에 대한 자세한 정보와 단계별 지침을 포함하고 있습니다. 다음 링크에서 자세히 알아보십시오:
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32를 구동하는 방법.
이 튜토리얼은 내부 풀업 저항을 사용할 것입니다. 버튼의 상태는 정상일 때 HIGH이고 눌렸을 때는 LOW입니다.
한 단계씩 살펴봅시다:
짧게 누르기의 최대 지속 시간을 정의하세요.
#define SHORT_PRESS_TIME 500
버튼이 눌렸는지 감지하고 눌린 시간을 저장하세요.
if(lastState == HIGH && currentState == LOW)
pressedTime = millis();
버튼이 놓여졌는지 감지하고 놓인 시간을 저장하세요.
if(lastState == LOW && currentState == HIGH)
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
누르는 시간을 정의된 짧은 누름 시간과 비교하여 짧은 누름을 판단합니다.
if( pressDuration < SHORT_PRESS_TIME )
Serial.println("짧은 누름이 감지되었습니다");
#define BUTTON_PIN 21
#define SHORT_PRESS_TIME 500
int lastState = LOW;
int currentState;
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
currentState = digitalRead(BUTTON_PIN);
if (lastState == HIGH && currentState == LOW)
pressedTime = millis();
else if (lastState == LOW && currentState == HIGH) {
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if ( pressDuration < SHORT_PRESS_TIME )
Serial.println("짧은 누름이 감지됨");
}
lastState = currentState;
}
A short press is detected
※ 주의:
시리얼 모니터는 단일 클릭에 대해 여러 번의 짧은 클릭을 출력할 수 있습니다. 이는 버튼의 정상적인 동작입니다. 이러한 동작은 "차터링 현상"이라고 불립니다. 이 문제를 해결하는 방법은 이 튜토리얼에서 나중에 배우게 됩니다.
길게 누르기를 감지하기 위한 사용 사례가 두 가지가 있습니다.
In the first case: - 첫 번째 경우:
두 번째 경우: 버튼이 눌리는 동안, 아래 과정을 반복적으로 수행하십시오:
누르는 시간을 측정하세요.
시간이 사전에 정해진 시간보다 길면, 길게 누르기 이벤트가 감지됩니다.
그렇지 않으면, 버튼이 놓일 때까지 과정을 반복하세요.
#define BUTTON_PIN 21
#define LONG_PRESS_TIME 1000
int lastState = LOW;
int currentState;
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
currentState = digitalRead(BUTTON_PIN);
if(lastState == HIGH && currentState == LOW)
pressedTime = millis();
else if(lastState == LOW && currentState == HIGH) {
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if( pressDuration > LONG_PRESS_TIME )
Serial.println("A long press is detected");
}
lastState = currentState;
}
#define BUTTON_PIN 21
#define LONG_PRESS_TIME 1000
int lastState = LOW;
int currentState;
unsigned long pressedTime = 0;
bool isPressing = false;
bool isLongDetected = false;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
currentState = digitalRead(BUTTON_PIN);
if(lastState == HIGH && currentState == LOW) {
pressedTime = millis();
isPressing = true;
isLongDetected = false;
} else if(lastState == LOW && currentState == HIGH) {
isPressing = false;
}
if(isPressing == true && isLongDetected == false) {
long pressDuration = millis() - pressedTime;
if( pressDuration > LONG_PRESS_TIME ) {
Serial.println("A long press is detected");
isLongDetected = true;
}
}
lastState = currentState;
}
#define BUTTON_PIN 21
#define SHORT_PRESS_TIME 1000
#define LONG_PRESS_TIME 1000
int lastState = LOW;
int currentState;
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
currentState = digitalRead(BUTTON_PIN);
if (lastState == HIGH && currentState == LOW)
pressedTime = millis();
else if (lastState == LOW && currentState == HIGH) {
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if ( pressDuration < SHORT_PRESS_TIME )
Serial.println("짧은 누름이 감지되었습니다");
if ( pressDuration > LONG_PRESS_TIME )
Serial.println("긴 누름이 감지되었습니다");
}
lastState = currentState;
}
※ 주의:
시리얼 모니터는 길게 누를 때 여러 번의 짧은 누름 감지를 보여줄 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이 동작은 "채터링 현상"이라고 불립니다. 이 문제는 이 튜토리얼의 마지막 부분에서 해결될 것입니다.
누를 때
#define BUTTON_PIN 21
#define SHORT_PRESS_TIME 1000
#define LONG_PRESS_TIME 1000
int lastState = LOW;
int currentState;
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
bool isPressing = false;
bool isLongDetected = false;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
currentState = digitalRead(BUTTON_PIN);
if (lastState == HIGH && currentState == LOW) {
pressedTime = millis();
isPressing = true;
isLongDetected = false;
} else if (lastState == LOW && currentState == HIGH) {
isPressing = false;
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if ( pressDuration < SHORT_PRESS_TIME )
Serial.println("짧은 누름이 감지되었습니다");
}
if (isPressing == true && isLongDetected == false) {
long pressDuration = millis() - pressedTime;
if ( pressDuration > LONG_PRESS_TIME ) {
Serial.println("긴 누름이 감지되었습니다");
isLongDetected = true;
}
}
lastState = currentState;
}
많은 응용 프로그램에서 버튼을 디바운스하는 것이 매우 중요합니다.
디바운싱은 여러 버튼을 사용할 때 특히 조금 복잡합니다. 초보자를 위해 간단하게 만들기 위하여, 우리는 ezButton이라 불리는 라이브러리를 만들었습니다.
아래 코드에서 이 라이브러리를 사용할 것입니다.
#include <ezButton.h>
#define SHORT_PRESS_TIME 1000
#define LONG_PRESS_TIME 1000
ezButton button(21);
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
void setup() {
Serial.begin(9600);
button.setDebounceTime(50);
}
void loop() {
button.loop();
if (button.isPressed())
pressedTime = millis();
if (button.isReleased()) {
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if ( pressDuration < SHORT_PRESS_TIME )
Serial.println("A short press is detected");
if ( pressDuration > LONG_PRESS_TIME )
Serial.println("A long press is detected");
}
}
#include <ezButton.h>
#define SHORT_PRESS_TIME 1000
#define LONG_PRESS_TIME 1000
ezButton button(21);
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
bool isPressing = false;
bool isLongDetected = false;
void setup() {
Serial.begin(9600);
button.setDebounceTime(50);
}
void loop() {
button.loop();
if (button.isPressed()) {
pressedTime = millis();
isPressing = true;
isLongDetected = false;
}
if (button.isReleased()) {
isPressing = false;
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if ( pressDuration < SHORT_PRESS_TIME )
Serial.println("A short press is detected");
}
if (isPressing == true && isLongDetected == false) {
long pressDuration = millis() - pressedTime;
if ( pressDuration > LONG_PRESS_TIME ) {
Serial.println("A long press is detected");
isLongDetected = true;
}
}
}
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
버튼 수와 디지털 입력 핀을 절약하기 위해. 단일 버튼으로 두 가지 이상의 기능을 수행할 수 있습니다. 예를 들어, 짧게 누르면 불을 켜고, 길게 누르면 팬을 켭니다.
우연히 누르는 것을 피하기 위해 짧게 누르는 대신 길게 누르기를 사용합니다. 예를 들어, 일부 기기는 공장 초기화를 위해 버튼을 사용합니다. 버튼이 우연히 눌리면 위험합니다.