ESP32 - GPIO 인터럽트 | ESP32 - GPIO Interrupt

이 튜토리얼에서는 ESP32에서 GPIO 인터럽트를 사용하는 방벸를 배워보겠습니다. ESP32의 GPIO 인터럽트는 외부 이벤트를 효율적이고 민감하게 처리할 수 있게 해주어 IoT 및 내장 시스템에서 실시간 애플리케이션에 필수적입니다. 이러한 인터럽트를 이해하고 적절하게 설정함으로써, 환경에 즉시 반응하는 강력하고 민감한 프로젝트를 만들 수 있습니다.

ESP32 GPIO 인터럽트

Hardware Preparation

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

GPIO 인터럽트란 무엇인가요?

GPIO 인터럽트는 프로세서가 현재 실행을 중지하고 인터럽트 서비스 루틴(ISR)이라고 알려진 특정 코드로 이동하게 하는 신호입니다. 이를 통해 ESP32는 GPIO 핀을 지속적으로 폴링할 필요 없이 고우선 순위 작업을 즉시 처리할 수 있습니다.

ESP32에서의 인터럽트

ESP32는 다양한 유형의 GPIO 인터럽트를 지원합니다:

  • 상승 에지: GPIO 핀이 LOW에서 HIGH로 전환될 때 트리거됩니다.
  • 하강 에지: GPIO 핀이 HIGH에서 LOW로 전환될 때 트리거됩니다.
  • 양쪽 에지: LOW에서 HIGH 또는 HIGH에서 LOW로의 상태 변경 시 트리거됩니다.
  • 레벨 로우: GPIO 핀이 LOW 상태를 유지할 때 트리거됩니다.
  • 레벨 하이: GPIO 핀이 HIGH 상태를 유지할 때 트리거됩니다.

ESP32에서 GPIO 인터럽트를 구성하는 방법

ESP32에서 GPIO 인터럽트를 구성하려면 다음 단계를 따라야 합니다:

GPIO 초기화: 필요에 따라 GPIO 핀 모드를 입력 또는 출력으로 설정하십시오. 예를 들어:

pinMode(GPIO_Pin, INPUT_PULLUP);

인터럽트 연결: attachInterrupt() 함수를 사용하여 GPIO 핀을 ISR에 연결하세요.

attachInterrupt(GPIO_Pin, ISR_function, mode);

이 함수는 세 개의 인자를 받습니다:

  • GPIO_Pin: 인터럽트 핀으로 사용될 GPIO 핀을 지정하며, ESP32가 모니터링해야 할 핀을 나타냅니다.
  • ISR_function: 인터럽트 발생 시 호출될 함수의 이름입니다.
  • mode: 인터럽트를 발생시키는 조건을 정의합니다. 사용할 수 있는 다섯 가지 미리 정의된 상수가 있습니다:
    • RISING: 핀이 LOW에서 HIGH로 전환될 때 트리거 (상승 에지에서).
    • FALLING: 핀이 HIGH에서 LOW로 전환될 때 트리거 (하강 에지에서).
    • CHANGE: 핀의 상태가 변경될 때 어떤 변경에서도 트리거 (양방프 에지에서).
    • HIGH: 핀이 HIGH일 때 트리거 (레벨 하이에서).
    • LOW: 핀이 LOW일 때 트리거 (레벨 로우에서).

    ISR 함수 정의: 인터럽트가 발생했을 때 실행될 인터럽트 서비스 루틴을 작성하세요.

    인터럽트 서비스 루틴(ISR)은 GPIO 핀에서 인터럽트가 발생할 때마다 호출되는 함수입니다. 그 구문은 아래와 같습니다.

    void IRAM_ATTR ISR_function() { Statements; }

    ESP32의 GPIO 핀에 연결된 버튼을 사용하여 인터럽트 사용의 실제 예를 살펴봅시다.

Wiring Diagram

ESP32 버튼 배선도

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

ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.

ESP32 인터럽트 코드

#define BUTTON_PIN 21 // The ESP32 pin GPIO21 connected to the button void IRAM_ATTR handleButtonPress(); void setup() { Serial.begin(9600); // Initialize the GPIO pin as an input pinMode(BUTTON_PIN, INPUT_PULLUP); // Attach interrupt to the GPIO pin attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonPress, FALLING); } void loop() { // Main code here } // Interrupt Service Routine (ISR) void IRAM_ATTR handleButtonPress() { Serial.println("Button pressed!"); }

이 예에서:

  • BUTTON_PIN은 GPIO21로 정의됩니다.
  • pinMode() 함수는 내부 풀업 저항이 있는 입력으로 GPIO 핀을 설정합니다.
  • attachInterrupt() 함수는 하강 에지에서 트리거되도록 구성된 BUTTON_PIN에 ISR handleButtonPress를 연결합니다.
  • handleButtonPress 함수는 버튼이 눌렸을 때 실행되는 ISR입니다.

위의 코드는 인터럽트 코드가 어떻게 보이는지를 보여주지만, 인터럽트 서비스 루틴에서 허용하는 것보다 더 긴 처리 시간이 필요한 Serial.println() 함수를 사용하기 때문에 실제로 작동하지 않을 수 있습니다.

인터럽트 작동 방식을 테스트하려면 아래의 실제 코드 예를 참조하세요:

#define BUTTON_PIN 21 // The ESP32 pin GPIO21 connected to the button volatile bool buttonPressed = false; // use volatile for variable that is accessed from inside and outside ISR void IRAM_ATTR handleButtonPress(); void setup() { Serial.begin(9600); // Initialize the GPIO pin as an input pinMode(BUTTON_PIN, INPUT_PULLUP); // Attach interrupt to the GPIO pin attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), handleButtonPress, FALLING); } void loop() { // Main code here if (buttonPressed) { Serial.println("Button pressed!"); buttonPressed = false; // Reset the flag } // Other code here } // Interrupt Service Routine (ISR) void IRAM_ATTR handleButtonPress() { // Serial.println("Button pressed!"); // do NOT use function that takes long time to execute buttonPressed = true; }

Detailed Instructions

  • ESP32를 처음 사용하는 경우, Arduino IDE에서 ESP32 환경 설정 방법을 참조하세요.
  • 위 이미지와 같이 배선하세요.
  • ESP32 보드를 마이크로 USB 케이블을 사용하여 PC에 연결하세요.
  • PC에서 Arduino IDE를 엽니다.
  • 올바른 ESP32 보드(예: ESP32 Dev Module)와 COM 포트를 선택하세요.
  • 위의 코드를 복사하고 Arduino IDE로 엽니다.
  • Arduino IDE에서 Upload 버튼을 클릭해 ESP32에 코드를 업로드하세요.
  • 버튼을 여러 번 눌러보세요.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
Button pressed! Button pressed! Button pressed! Button pressed!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

시리얼 모니터에서 버튼을 한 번 눌렀을 때 여러 번 눌린 것처럼 보이는 현상을 확인할 수 있습니다. 이것은 인터럽트 문제가 아니라 버튼 자체의 문제입니다. 이 문제를 해결하는 방범을 알고 싶다면 ESP32 - 버튼 - 디바운스 튜투리얼을 참조하십시오.

다른 예제는 이 ESP32 - 로터리 엔코더 자습서에서 인터럽트를 사용하는 방법을 볼 수 있습니다.

중요한 고려 사항

  • 매개변수나 반환값 없음: ISR 함수는 매개변수를 가질 수 없으며 반환값도 없어야 합니다.
  • ISR 실행 시간: ISR 코드를 가능한 짧고 효율적으로 유지하세요. 긴 ISR은 시스템이 다른 인터럽트를 놓치거나 전반적인 성능이 저하될 수 있습니다.
  • 동시성: ISR 내에서 접근하는 공유 자원에 주의하세요. 경쟁 상태를 피하기 위해 필요하다면 원자적 연산을 사용하거나 인터럽트를 비활성화하세요. 특히, ISR 함수 내부와 외부에서 접근하는 변수에 대해 volatile 키워드를 사용하세요.
  • IRAM_ATTR: IRAM_ATTR 속성을 사용하여 ISR 코드를 IRAM에 배치하여 플래시 메모리에서 가져오지 않고 빠르게 실행되도록 하세요.

Video Tutorial

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

관련 튜토리얼

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