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