아두이노 나노 ESP32 - 버튼 | Arduino Nano ESP32 - Button

버튼은 기본적인 구성 요소이며 많은 Arduino Nano ESP32 프로젝트에서 널리 사용됩니다. 그것이 보이는 것처럼 간단하지는 않습니다(기계적, 물리적 특성 때문에). 초보자는 이것으로 많은 문제를 겪을 수 있습니다. 이 튜토리얼은 초보자가 쉽게 할 수 있도록 도와줍니다. 시작합시다!

※ NOTE THAT:

버튼에 대해 발표하기 전에, 초보자들이 보통 접하는 두 가지 흔한 실수에 대해 알려드리고자 합니다:

  1. 떠다니는 입력 문제:
    • 증상: 버튼을 Arduino Nano ESP32 입력 핀에 연결할 때, 입력 핀의 상태가 무작위이며 버튼의 누름 상태와 일치하지 않습니다.
    • 원인: 버튼 핀이 풀다운 저항이나 풀업 저항을 사용하지 않았습니다.
    • 해결법: ⇒ 입력 핀에 풀다운 저항 또는 풀업 저항을 사용하세요. 세부 사항은 이 튜토리얼에서 나중에 설명될 것입니다.
  • 채터링 현상
    • 증상: Arduino Nano ESP32의 코드가 버튼의 상태를 읽고 상태 변경(높음에서 낮음, 혹은 낮음에서 높음)을 감지함으로써 누름 이벤트를 식별합니다. 버튼이 실제로 한 번만 눌렸을 때, Arduino Nano ESP32 코드는 한 번이 아닌 여러 번 눌렸다고 감지합니다.
    • 원인: 기계적 및 물리적 특성으로 인해, 단추를 한 번 누르면 입력 핀의 상태가 한 번이 아니라 빠르게 여러 번 낮음과 높음 사이를 전환합니다.
    • 해결법: ⇒ 디바운스. 세부 사항은 Arduino Nano ESP32 - Button - Debounce 튜토리얼에서 설명될 것입니다.

    채터링 현상은 누름 횟수를 정확히 감지해야 하는 일부 애플리케이션에서만 오작동을 일으킵니다. 일부 애플리케이션에서는 무해합니다.

    준비물

    1×Arduino Nano ESP32 Amazon
    1×USB Cable Type-C 쿠팡 | Amazon
    1×Push Button 쿠팡 | Amazon
    1×(Optional) Panel-mount Push Button Amazon
    1×Breadboard 쿠팡 | Amazon
    1×Jumper Wires Amazon
    1×(Optional) DC Power Jack 쿠팡 | Amazon
    1×(Recommended) Screw Terminal Expansion Board for Arduino Nano 쿠팡 | Amazon
    공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

    버튼에 관하여

    푸시 버튼은 또한 푸시버튼, 촉각 버튼, 순간 스위치라고도 불리며, 눌렀을 때 닫히고 놓았을 때 열리는 스위치의 한 종류입니다. 다양한 종류의 푸시 버튼이 존재하며, 크게 두 그룹으로 분류됩니다:

    • PCB 마운트 푸시 버튼 (브레드보드 마운팅에 적합함)
    • 패널 마운트 푸시 버튼
    Arduino Nano ESP32 Push button

    버튼 핀배열

    PCB 마운트 버튼은 일반적으로 내부적으로 쌍으로 연결된 4개의 핀을 가지고 있습니다.

    Button Pinout

    네 개의 핀 중 같은 연결된 쌍에 속하지 않는 두 개만 사용하면 됩니다. 따라서 버튼으로 배선을 할 수 있는 방법은 네 가지가 있습니다(아래 이미지 참조).

    How To Use Button

    사실, 대칭 때문에 이 네 가지 방법은 두 가지 방법이 됩니다. 이 튜토리얼의 나머지 부분은 함께 연결되지 않은 두 개의 핀인 핀 A와 핀 B를 사용할 것입니다.

    왜 버튼에는 두 개의 핀만 필요한데 4개의 핀이 있죠?

    ⇒ 버튼은 사용자로부터 힘을 받습니다. PCB(회로판)에 안정적이고 견고하게 설치하기 위해, 버튼은 누르는 힘을 견디기 위한 네 개의 핀을 가지고 있습니다.

    패널 장착 버튼은 보통 두 개의 핀이 있습니다.

    two-pin push button Pinout
    image source: diyables.io

    버튼 작동 원리

    • 버튼을 누르면 핀 A가 핀 B와 연결됩니다
    • 버튼을 누르지 않으면 핀 A가 핀 B와 연결되지 않습니다
    How Button Works

    아두이노 나노 ESP32 - 버튼

    한 버튼의 핀은 아두이노 나노 ESP32의 디지털 입력 핀에 연결되어 있습니다. 다른 핀은 VCC 또는 GND에 연결됩니다. 아두이노 나노 ESP32 코드에서 입력 핀의 상태를 읽어 버튼이 눌렸는지 여부를 판단할 수 있습니다.

    입력 상태 및 누름 상태

    입력 핀의 상태와 버튼의 눌림 상태 사이의 관계는 우리가 버튼을 Arduino Nano ESP32와 어떻게 연결하고, ESP32의 핀 설정을 어떻게 하느냐에 따라 달라집니다. ESP32와 버튼을 사용하는 데는 두 가지 방법이 있습니다:

    1. 버튼 하나의 핀은 ESP32의 디지털 입력 핀에 연결되고, 다른 핀은 VCC에 연결됩니다:
      • 풀다운 저항이 반드시 사용되어야 합니다
      • 버튼이 눌리면, ESP32의 핀 상태는 HIGH입니다. 그렇지 않으면, ESP32의 핀 상태는 LOW입니다
  • 버튼 하나의 핀은 ESP32의 디지털 입력 핀에 연결되고, 다른 핀은 GND에 연결됩니다:
    • 풀업 저항이 반드시 사용되어야 합니다
    • 버튼이 눌리면, ESP32의 핀 상태는 LOW입니다. 그렇지 않으면, ESP32의 핀 상태는 HIGH입니다

    ※ NOTE THAT:

    풀다운 저항기나 풀업 저항기가 사용되지 않는 경우, 버튼이 눌리지 않았을 때 입력 핀의 상태는 HIGHLOW 사이에서 랜덤하게 변하며 (불안정하고, 고정되지 않음) 이를 “플로팅 입력 문제”라고 합니다. 이로 인해 오작동이 발생합니다.

    초보자들이 이해하기 쉽도록 이 튜토리얼은 새로운 사용자들이 아두이노 나노 ESP32 핀에 내부 풀업 저항을 사용하는 것을 강력히 권장합니다. 외부 저항은 필요하지 않습니다. 이는 하드웨어를 절약하고, 배선도를 단순화합니다.

    버튼과 아두이노 나노 ESP32 사이의 연결도

    아두이노 나노 ESP32와 PCB 마운트 버튼 간의 배선도

    Arduino Nano ESP32 Button Wiring Diagram

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

    아두이노 나노 ESP32와 패널 마운트 버튼 간의 배선도

    Arduino Nano ESP32 two-pin push button Wiring Diagram

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

    버튼 프로그래밍 방법

    pinMode() 함수를 사용하여 아두이노 나노 ESP32 핀을 내부 풀업 입력으로 초기화합니다. 예를 들어, 핀 D2:

    pinMode(D2, INPUT_PULLUP); // D2를 입력 핀으로 설정하고 내부 풀업 저항을 활성화합니다.

    digitalRead() 함수를 사용하여 입력 핀의 상태를 읽습니다.

    int button_state = digitalRead(BUTTON_PIN);

    ※ NOTE THAT:

    다음은 널리 사용되는 두 가지 사례입니다:

    • 첫 번째 사례: 입력 상태가 HIGH이면 어떤 작업을 수행합니다. 입력 상태가 LOW이면 다른 작업을 수행합니다.
    • 두 번째 사례: 입력 상태가 LOW에서 HIGH로 변경되면 어떤 작업을 수행합니다. 입력 상태가 HIGH에서 LOW로 변경되면 다른 작업을 수행합니다.

    응용 프로그램에 따라 둘 중 하나를 사용합니다. 예를 들어, 버튼을 사용하여 LED를 제어하는 경우:

    • 버튼을 누를 때 LED를 켜고 버튼을 누르지 않을 때 LED를 끄고 싶다면 첫 번째 사례를 사용해야 합니다.
    • 버튼을 누를 때마다 LED를 ON OFF 사이에서 토글하고 싶다면 두 번째 사례를 사용해야 합니다.

    아래 예제 코드는 상태가 LOW에서 HIGH로 변경되는 것을 감지하는 방법을 보여줍니다.

    #define BUTTON_PIN D2 // D2 핀이 버튼에 연결됨 int prev_state = HIGH; // 입력 핀에서의 이전 상태 int button_state; // 입력 핀에서의 현재 읽기 값 void setup() { Serial.begin(9600); // 풀업 입력으로 푸시버튼 핀 초기화 pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태 읽기: button_state = digitalRead(BUTTON_PIN); if(prev_state == LOW && button_state == HIGH) Serial.println("The state changed from LOW to HIGH"); // 마지막 상태 저장 prev_state = button_state; }

    아두이노 나노 ESP32 코드

    사용 방법

    아두이노 나노 ESP32를 사용하기 시작하기 위해 다음 단계를 따르세요:

    • 아두이노 나노 ESP32를 처음 사용하는 경우, 아두이노 IDE에서 아두이노 나노 ESP32 환경 설정 방법에 대한 자습서를 참조하세요.
    • 제공된 다이어그램에 따라 구성 요소를 연결하세요.
    • USB 케이블을 사용하여 아두이노 나노 ESP32 보드를 컴퓨터에 연결하세요.
    • 컴퓨터에서 아두이노 IDE를 실행하세요.
    • Arduino Nano ESP32 보드와 해당 COM 포트를 선택하세요.* 아래 코드를 복사하여 아두이노 IDE에 붙여넣으세요.
    #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 핀이 버튼에 연결됨 void setup() { // 직렬 통신을 이용하여 시리얼 모니터와 통신을 초기화합니다. Serial.begin(9600); // 버튼 핀을 내부 풀업 입력으로 초기화합니다(스위치가 열려 있을 때 HIGH, 닫혀 있을 때 LOW) pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: int button_state = digitalRead(BUTTON_PIN); // 버튼의 상태를 출력합니다 Serial.println(button_state); }

    아두이노 IDE에서 Upload 버튼을 클릭해 아두이노 나노 ESP32 보드에 코드를 컴파일하고 업로드하세요.

    How to upload Arduino Nano ESP32 code on Arduino IDE

    아두이노 IDE에서 시리얼 모니터 열기

    How to open serial monitor on Arduino IDE
    • 버튼을 여러 번 눌렀다 놓으세요.
    • 시리얼 모니터에서 결과를 확인하세요. 아래와 같습니다:
    COM6
    Send
    1 1 1 0 0 0 0 0 0 1 1 1
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    1은 HIGH입니다, 0은 LOW입니다.

    코드 줄별 설명

    위의 Arduino Nano ESP32 코드에는 줄마다 설명이 포함되어 있습니다. 코드의 주석을 읽어주세요!

    아두이노 나노 ESP32 코드 수정하기

    코드를 수정하여 누름 및 릴리스 이벤트를 감지하도록 합시다.

    사용 방법

    /* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-button */ #define BUTTON_PIN D2 // 아두이노 나노 ESP32의 D2 핀이 버튼에 연결됨 int prev_state = LOW; // 입력 핀의 이전 상태 int button_state; // 입력 핀에서의 현재 읽기 void setup() { // 시리얼 모니터와 통신하기 위해 Serial을 초기화합니다. Serial.begin(9600); // 버튼 핀을 pull-up 입력으로 초기화합니다(스위치가 열려 있을 때 HIGH이고 닫혀 있을 때는 LOW) pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // 스위치/버튼의 상태를 읽습니다: button_state = digitalRead(BUTTON_PIN); if (prev_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_state == LOW && button_state == HIGH) Serial.println("The button is released"); // 마지막 상태를 저장합니다 prev_state = button_state; }
    • 아두이노 IDE에서 Upload 버튼을 클릭하여 코드를 컴파일하고 아두이노 나노 ESP32 보드에 업로드하세요
    • 아두이노 IDE에서 시리얼 모니터를 엽니다
    • 버튼을 눌렀다가 놓으세요
    • 시리얼 모니터에서 결과를 확인하세요. 아래와 같이 보입니다:
    COM6
    Send
    The button is pressed The button is released
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ NOTE THAT:

    시리얼 모니터는 하나의 누름과 해제만 했음에도 불구하고 여러 번 눌림과 해제 이벤트를 출력할 수 있습니다. 이것은 버튼의 정상적인 동작입니다. 이러한 동작을 “버튼 드리벌 현상”이라고 합니다. 어떤 애플리케이션에서는 이를 제거하는 방법이 필요할 수 있습니다. 아두이노 나노 ESP32 - 버튼 디바운스 튜토리얼에서 더 배울 수 있습니다.

    초보자를 위해, 특히 여러 버튼을 사용할 때 간단하게 만들기 위해, ezButton이라는 라이브러리를 만들었습니다. ezButton 라이브러리에 대해 여기서 배울 수 있습니다.

    동영상

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

    추가 지식

    풀다운/풀업 저항을 사용해야 하고 사용해서는 안 되는 시기는 언제인가요?

    • 해야 할 것: 센서가 닫힘 상태와 열림 상태의 두 상태를 가지고 있다면, 이러한 상태를 LOW HIGH의 두 상태로 만들기 위해 풀업 또는 풀다운 저항이 필요합니다. 예를 들어, 푸시 버튼, 스위치, 자기 접촉 스위치(도어 센서) 등이 있습니다.
    • 하지 말아야 할 것: 센서가 두 가지 전압 수준(LOW와 HIGH)을 출력한다면, 풀업 또는 풀다운 저항이 필요하지 않습니다. 예를 들어, 모션 센서, 터치 센서 등이 있습니다.

    ※ 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!