03주차 ‐ ESP32 GPIO 입출력 실습 - gitjs523/SmartDevice2025 GitHub Wiki

1. ESP32의 GPIO

ESP32의 GPIO란?

  • GPIO (General Purpose Input Output) : 다목적 입출력 핀, 디지털 신호를 입력받거나 출력할 수 있다. ESP32는 최대 34개의 GIPO 핀을 제공한다.

  • GPIO의 주요 역할

    • 디지털 입력 : 버튼 등의 외부 신호를 읽는다.
    • 디지털 출력 : HIGH(1)이나 LOW(0) 신호를 출력한다.
    • 아날로그 입력(ADC) : 가변 저항 등의 아날로그 센서 값을 읽을 수 있다.
      • ADC(Analog to Digital Converter) : 아날로그-디지털 변환기. 아날로그 신호를 디지털 신호로 변환하는 주변장치이다.
    • 아날로그 출력 : PWM 출력 방식으로 LED의 밝기와 모터 속도를 조절한다.
      • PWM (Pulse Width Modulation) : 펄스 폭 변조. 디지털 출력으로 아날로그 회로를 제어하는 기법이다.
  • ESP32 GPIO 핀 구조

    • 대부분의 핀은 EN, VIN, 3V3, GND 핀과 입력 전용핀(34, 35, 36, 39)을 제외하고 자유롭게 사용 가능하다.
    • 입력 전용 핀 : GPIO 34, 35, 36, 39
    • PWM 출력 핀 : GPIO 0~19, 21, 22, 23, 25, 26, 27, 32, 33
    • DAC 출력 핀 : GPIO 25, 26
    • ADC 입력 핀 : ADC1핀 (GPIO 36~39), ADC2핀 (GPIO 0, 2, 4, 12, 13, 14, 15, 25, 26, 27)

단, ADC2 핀은 Wi-Fi 사용 시 제한된다.

2. 입출력 실습

(1) 디지털 출력 (LED 제어)

  • ESP32의 디지털 출력을 이용하여 LED를 켜고 끈다.
  • 회로 연결 : LED 모듈
    • S(신호) : D4
    • VCC(전원) : 3.3V
    • GND(접지) : GND

  • 연결된 LED의 점멸 상태 변환 주기 : 1초
  • 코드 내용

const int ledPin = 4; // D4 핀에 LED 연결

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);  // LED ON
  delay(1000); // 1초 동안 유지
  digitalWrite(ledPin, LOW);  // LED OFF
  delay(1000); 
}

https://github.com/user-attachments/assets/ac726097-c930-47de-88a1-e11dc127c04d

(2) 디지털 입력 (버튼 제어)

  • 버튼 입력을 통해 LED를 제어한다. 회로 연결
  • LED 모듈
    • S(신호) : D4
    • VCC(전원) : 3.3V
    • GND(접지) : GND
  • 버튼 모듈
    • S : D33
    • VCC : 3.3V
    • GND : GND

A. 버튼을 누르면 켜지게 만들기

  • 참고 할 점

const int ledPin = 4;
const int buttonPin = 33;
int buttonState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  digitalWrite(ledPin, buttonState);
}

깃허브 강의 자료에 나와 있는 이 코드를 적용하면 LED는 기본적으로 켜져 있고 버튼을 눌러야 꺼진다. 따라서 'digitalWrite(ledPin, buttonState);' 문장에서 'buttonState'에 느낌표를 추가하여 '!buttonState'로 바꾼다.

const int ledPin = 4;
const int buttonPin = 33;
int buttonState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  digitalWrite(ledPin, !buttonState);
}

https://github.com/user-attachments/assets/0b89e6e9-4361-4f59-b77a-7fdfd10678cf

B. 버튼을 눌러야 꺼지게 만들기

  • 아까 '!'를 추가하여 변형했던 강의자료의 코드를 이번에는 변형시키지 않고 그대로 작성한다.

코드 내용

const int ledPin = 4;
const int buttonPin = 33;
int buttonState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  digitalWrite(ledPin, buttonState);
}

https://github.com/user-attachments/assets/105b3fa9-d51b-4b51-9a3a-bb49beb93ab2