3주차 ‐ ESP32 GPIO 입출력 실습 - boguuu/SmartDevice_2025-1 GitHub Wiki

🖥️ESP32의 GPIO


GPIO (General Purpose Input Output)

  • 다목적 입출력 핀으로, 디지털 신호를 입력받거나 출력할 수 있음
  • ESP32는 최대 34개의 GPIO 핀을 제공

GPIO 핀의 역할

  • 디지털 입력/출력 (HIGH, LOW)

  • 아날로그 입력 (ADC)

    • ADC(Analog-to-Digital Converter)?

    ADC(아날로그-디지털 변환기)는 아날로그 신호(전압)를 디지털 값으로 변환하는 장치입니다. ESP32는 최대 18개의 ADC 입력 채널을 제공하며, 센서 데이터 측정, 신호 처리, 전압 감지 등에 활용

  • PWM 출력 (LED 밝기 조절, 모터 속도 조절)

    • PWM(Pulse Width Modulation)?

    PWM(펄스 폭 변조)은 디지털 신호를 사용하여 아날로그 출력처럼 보이도록 하는 기법 ESP32는 최대 16채널의 PWM 출력을 지원하며, 주로 LED 밝기 조절, 모터 속도 제어, 오디오 신호 생성 등에 활용

image1

ESP32의 GPIO 핀 구성

  • 사용 가능한 핀
    • 대부분의 GPIO 핀은 자유롭게 사용가능
    • 단, 일부 핀은 특정 기능이 예약
  • 입력 전용 핀: GPIO 34, 35, 36, 39
  • PWM/DAC 출력 가능 핀
    • PWM: GPIO 0-19, 21-23, 25-27, 32-33
    • DAC: GPIO 25, 26
  • Wi-Fi 사용 시 제한되는 핀: ADC2 핀 (GPIO 4, 0, 2, 15, 13, 12, 14, 27, 25, 26)

GPIO 핀 개요

  • 5V: USB 또는 외부 전원 공급 가능
  • 3.3V (3V3): 내부 레귤레이터에서 출력된 안정된 전원
  • 디지털 입출력(GPIO): 기본적인 HIGH/LOW 신호 출력 및 입력
  • ADC (아날로그-디지털 변환): ADC1(0~4095 범위), ADC2(Wi-Fi와 충돌 가능)
  • DAC (디지털-아날로그 변환): GPIO25(DAC1), GPIO26(DAC2)
  • 터치 센서: GPIO4, 0, 2, 15, 13, 12, 14, 27, 33, 32
  • PWM 출력: 모든 GPIO에서 사용 가능 (GPIO34~39 제외)

ESP32의 DAC 특징

  • 내장 DAC 채널: 2개 (DAC1, DAC2)
  • DAC1: GPIO25DAC2: GPIO26
  • 분해능: 8비트 (0 ~ 255 값 출력, 0V ~ 3.3V 범위)
  • 출력 전압 범위: 0V ~ 3.3V (VDD에 따라 달라짐)
  • 단순한 아날로그 신호 생성 가능 (파형 생성, 전압 제어)
  • PWM 방식과 비교하여 출력이 부드러움
항목 DAC (Digital-to-Analog Converter) PWM (Pulse Width Modulation)
출력 방식 순수 아날로그 전압 출력 고속 ON/OFF로 평균 전압 생성(디지털 출력)
해상도 8비트 (0~255 단계) 최대 16비트 (0~65535 단계)
주파수 제한 제한 없음 1Hz ~ 40MHz 가능
신호 품질 부드러운 아날로그 신호 고주파 성분 포함 (필터 필요)
전압 범위 0V ~ 3.3V 0V ~ VDD (평균 전압)
사용 예 오디오 출력, 정밀 신호 생성 모터 속도 제어, LED 밝기 조절
필터 필요 여부 불필요 저역통과 필터 필요
💡
  • DAC 사용 → 부드러운 아날로그 출력이 필요한 경우 (오디오, 정밀 전압 조절)
  • PWM 사용 → 스위칭 방식이 효율적인 경우 (모터, LED 제어)

디지털 출력 – LED 켜고 끄기


ESP32를 이용하여 LED를 제어

✔️

디지털 출력 - GPIO 핀을 HIGH(1) 또는 LOW(0)로 설정하여 전자 장치를 제어하는 방식.

📌회로 연결 방법

  • ESP32 GPIO 4 → LED 모듈 S
  • ESP32 GND → LED 모듈 G
  • ESP32 3.3V → LED 모듈 V

📌필요한 부품 ✅ ESP32 보드 ✅ LED 모듈 ✅ 점퍼 케이블

image2

디지털 출력 코드


#define LED_PIN 4

void setup() {
  pinMode(LED_PIN, OUTPUT); // LED 핀을 출력으로 설정
}

void loop() {
  digitalWrite(LED_PIN, HIGH); // LED 켜기
  delay(1000); // 1초 대기
  digitalWrite(LED_PIN, LOW); // LED 끄기
  delay(1000); // 1초 대기
}

결과


Digital.Output.LED.on.and.off.mp4

아날로그 출력(PWM) – LED 밝기 조절


PWM(Pulse Width Modulation) LED 밝기 조절, 모터 속도 제어 등에 사용된다. ESP32의 PWM 기능 0~255 값 범위 설정 가능 (LED 밝기 조절)

✔️

아날로그 출력(PWM) - 디지털 신호를 일정한 비율로 조절하여 아날로그처럼 동작하게 하는 방식.

📌 회로 연결 방법

  • ESP32 GPIO 4 → LED 모듈 S
  • ESP32 GND → LED 모듈 G
  • ESP32 3.3V → LED 모듈 V

📌 필요한 부품 ✅ ESP32 보드 ✅ LED 모듈 ✅ 점퍼 케이블

image3

아날로그 출력 코드


#define LED_PIN 4

void setup() {
  pinMode(LED_PIN, OUTPUT);  // LED 핀을 출력 모드로 설정
}

void loop() {
  // LED 밝기를 0부터 255까지 점점 증가시키는 루프
  for (int brightness = 0; brightness <= 255; brightness++) {
    analogWrite(LED_PIN, brightness);  // 현재 밝기 값으로 LED 출력
    delay(10);  // 10ms 대기하여 부드럽게 변화하도록 함
  }

  // LED 밝기를 255부터 0까지 점점 감소시키는 루프
  for (int brightness = 255; brightness >= 0; brightness--) {
    analogWrite(LED_PIN, brightness);  // 현재 밝기 값으로 LED 출력
    delay(10);  // 10ms 대기하여 부드럽게 변화하도록 함
  }
}

결과


Analog.Output.LED.Brightness.Adjustment.mp4

디지털 입력 – 버튼을 이용한 LED 제어(버튼을 눌렀을 때 소등)


✔️

디지털 입력 - 버튼, 스위치와 같은 장치에서 HIGH(1) 또는 LOW(0)를 감지하는 방식.

📌 회로 연결 방법

  • ESP32 GPIO 4 → LED 모듈 S
  • ESP32 GND → LED 모듈 G
  • ESP32 GPIO 33 → 버튼 모듈 S
  • ESP32 GND → 버튼 모듈 G

📌필요한 부품 ✅ ESP32 보드 ✅ LED 모듈 ✅ 버튼 모듈 ✅ 점퍼 케이블

image4

디지털 입력 코드


#define LED_PIN 4
#define BUTTON_PIN 33

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
}

void loop() {
  if (digitalRead(BUTTON_PIN) == HIGH) { // 풀업 저항 사용❗
    digitalWrite(LED_PIN, HIGH); // LED 끄기
  } else {
    digitalWrite(LED_PIN, LOW); // LED 켜기
  }
}

결과


LED.control.with.buttons.-.LED.off.mp4

(응용)디지털 입력 – 버튼을 이용한 LED 제어(버튼을 눌렀을 때 점등)


✔️

버튼을 눌렀을 때 LED가 켜지게 하려면 버튼이 LOW일 때 LED를 HIGH로 설정

디지털 입력 코드


#define LED_PIN 4
#define BUTTON_PIN 33

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);
}

void loop() {
  if (digitalRead(BUTTON_PIN) == LOW) { // 풀다운 저항을 사용❗
    digitalWrite(LED_PIN, HIGH); // LED 켜기
  } else {
    digitalWrite(LED_PIN, LOW); // LED 끄기
  }
}

결과


LED.control.with.button.-.LED.on.mp4

풀업 저항과 풀다운 저항


ESP32의 GPIO 핀은 기본적으로 내부 풀업( Pull-up ) 및 풀다운( Pull-down ) 저항을 지원

풀업(PULL UP) 풀다운(PULL DOWN)
ON: LOW(0) ON: HIGH(1)
OFF: HIGH(1) OFF: LOW(0)

풀업 저항 (Pull-up Resistor): 높은 전압(VCC)에 연결된 저항

풀다운 저항 (Pull-down Resistor): 낮은 전압(GND)에 연결된 저항

💡

이 두 개념은 디지털 회로에서 입력 신호가 불안정해지는 현상(플로팅 현상, Floating Issue)을 방지하기 위해 사용

플로팅(Floating) 현상이란?


  • 특정 노드가 어떠한 전압(0V 또는 VCC)에도 명확히 연결되지 않은 상태를 의미
  • 전압이 불안정하여 0V, 5V 또는 그 중간값이 될 수 있어 예측 불가능한 상태가 발생
  • 플로팅 상태에서는 노이즈에 취약하며, 회로의 동작이 불안정해질 가능성이 높음

플로팅 현상을 해결하는 방법


풀업 저항과 풀다운 저항을 사용하여 입력 신호를 항상 High(1) 또는 Low(0) 상태로 유지함으로써 안정적인 회로 동작을 보장 가능

⚠️ **GitHub.com Fallback** ⚠️