ESP32는 Espressif Systems사에서 개발한 마이크로컨트롤러로, Wi-Fi와 Bluetooth를 내장한 저전력 칩셋임. 저렴한 가격 대비 성능이 뛰어나며, IoT 기반 프로젝트나 네트워크 연동형 디바이스 개발에 많이 사용되고 있음.
주요 특징은 다음과 같음:
• 듀얼 코어 프로세서 (최대 240MHz)
• 약 520KB SRAM
• 2.4GHz Wi-Fi 및 Bluetooth 4.2 (BLE 포함)
• GPIO 핀, PWM, ADC, DAC, SPI, I2C, UART 등 다양한 I/O 기능 내장
ESP32는 아래와 같은 분야에서 폭넓게 활용됨:
• 스마트홈 디바이스 (조명, 도어락 제어 등)
• 환경 모니터링 센서 (온습도, 미세먼지 등)
• MQTT 기반 IoT 통신
• BLE 기반 웨어러블 기기
• 실시간 스트리밍 (ESP32-CAM 사용 시)
ESP32는 Arduino IDE에서 지원되며, 기존 아두이노 코드와 유사한 구조를 가짐. setup()과 loop() 함수를 사용하는 C++ 기반 프로그래밍으로 입문자가 빠르게 접근 가능함. 대부분의 아두이노 함수가 호환되어 기존 아두이노 경험이 있다면 전환이 용이함.
ESP32 보드를 실물로 구입하지 않아도 코드를 작성하고 테스트할 수 있는 시뮬레이터가 존재함. 대표적인 사이트는 Wokwi임.
• Arduino, ESP32, Raspberry Pi Pico 등 다양한 보드 지원
• 웹 브라우저 상에서 회로 구성 및 코드 실행 가능
• 여러 센서, 디스플레이, 입력 장치를 가상으로 구성할 수 있음
• 별도 프로그램 설치 없이 사용 가능
• 시리얼 모니터, Wi-Fi 기능, MQTT 통신까지 테스트 가능
#define LED_PIN 15
void setup() {
Serial.begin(115200); // 시리얼 통신 초기화 (속도: 115200bps)
Serial.println("Hello, ESP32!"); // 시리얼 모니터에 메시지 출력
pinMode(LED_PIN, OUTPUT); // GPIO 15번 핀을 출력 모드로 설정
}
void loop() {
digitalWrite(LED_PIN, HIGH); // LED ON
delay(500); // 0.5초 대기
digitalWrite(LED_PIN, LOW); // LED OFF
delay(500); // 0.5초 대기
}

위 예제는 GPIO 15번 핀에 연결된 LED를 0.5초 간격으로 켜고 끄는 코드이다
Serial.begin()으로 시리얼 통신을 초기화하고, digitalWrite()와 delay() 함수를 이용해 LED를 깜빡이게 한다.
딜레이를 조절하여 깜빡이는 속도를 변경할 수 있다
#define LED_PIN 15
#define BUTTON_PIN 2
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // 내부 풀업 저항 활성화
}
void loop() {
int buttonState = digitalRead(BUTTON_PIN); // 버튼 상태 읽기
Serial.println(buttonState); // 시리얼 출력
if (buttonState == LOW) {
digitalWrite(LED_PIN, HIGH); // 버튼이 눌리면 LED ON
} else {
digitalWrite(LED_PIN, LOW); // 버튼이 떨어지면 LED OFF
}
}

풀업 저항을 사용하는 입력 방식으로, 눌림 상태는 LOW로 판정된다
#include <WiFi.h>
#include <PubSubClient.h>
// 네트워크 정보
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
// MQTT 설정
WiFiClient espClient;
PubSubClient client(espClient);
const int ledPin = 15;
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) message += (char)payload[i];
if (String(topic) == "codingpen/led") {
if (message == "1") digitalWrite(ledPin, HIGH);
else if (message == "0") digitalWrite(ledPin, LOW);
}
}
void setup_wifi() {
WiFi.begin(ssid, password, 6);
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void reconnect() {
while (!client.connected()) {
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) client.subscribe("codingpen/led");
else delay(5000);
}
}
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
}

Wokwi에서도 MQTT 시뮬레이션이 가능함. 토픽
"codingpen/led"로 1 또는 0을 보내면 LED 상태가 변경된다.
from machine import Pin
import time
led = Pin(15, Pin.OUT)
while True:
led.on()
time.sleep(0.5)
led.off()
time.sleep(0.5)

MicroPython 문법으로 작성한 LED 점멸 코드로, Pin 클래스를 사용해 GPIO 15번 핀을 출력으로 설정하고 on(), off() 메서드를 통해 LED를 주기적으로 켜고 끄는 구조이다.
from machine import Pin
import time
button_pin = Pin(2, Pin.IN, Pin.PULL_UP)
led_pin = Pin(15, Pin.OUT)
while True:
button_state = button_pin.value()
if button_state == 0:
led_pin.value(1)
else:
led_pin.value(0)
time.sleep(0.1)

이 코드는 풀업 입력 방식을 사용하여 버튼 상태를 읽고, 눌림 상태(LOW)일 때 LED를 켜는 구조이다.
Pin.IN, Pin.PULL_UP 설정을 통해 외부 풀업 저항 없이도 버튼 입력을 안정적으로 감지할 수 있다
버튼이 눌리면 value() 값이 0이 되므로, 이때 LED를 켜고 그렇지 않으면 끄도록 설계됐다
time.sleep(0.1)을 통해 루프가 너무 빠르게 반복되는 것을 방지한다.
from machine import Pin
from time import sleep
LED_PIN = 15
BUTTON_PIN = 2
SEG_PINS = [4, 16, 17, 5, 18, 19, 0, 13]
seven_seg_digits = [
[1,1,1,1,1,1,0,0], [0,1,1,0,0,0,0,0], [1,1,0,1,1,0,1,0],
[1,1,1,1,0,0,1,0], [0,1,1,0,0,1,1,0], [1,0,1,1,0,1,1,0],
[1,0,1,1,1,1,1,0], [1,1,1,0,0,0,0,0], [1,1,1,1,1,1,1,0],
[1,1,1,1,0,1,1,0]
]
led = Pin(LED_PIN, Pin.OUT)
button = Pin(BUTTON_PIN, Pin.IN, Pin.PULL_UP)
seg_pins = [Pin(pin, Pin.OUT) for pin in SEG_PINS]
def write_number(num):
num %= 10
for i in range(len(SEG_PINS)):
seg_pins[i].value(0 if seven_seg_digits[num][i] else 1)
count = 0
while True:
if button.value() == 0:
led.value(1)
else:
led.value(0)
write_number(count)
count += 1
sleep(1)


버튼 상태에 따라 LED를 켜고, 7세그먼트로 숫자를 출력한다. 숫자는 0~9까지 1초 간격으로 증가한다.
예제를 직접 실습해보는 것이 이해에 큰 도움이 되므로, Wokwi 시뮬레이터를 활용해 회로를 구성하고 코드를 실행해보는 과정을 추천한다.
향후에는 센서, 디스플레이 등 다양한 부품을 활용한 예제를 계속해서 정리할 예정이다.