ESP32 보드 실습 가이드 (온라인 시뮬레이터 / 초보 예제 포함)

조아·2025년 4월 22일
post-thumbnail

1. ESP32 보드란?

1-1) ESP32 보드의 개요

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 기능 내장

1-2) ESP32 보드의 활용처

ESP32는 아래와 같은 분야에서 폭넓게 활용됨:
• 스마트홈 디바이스 (조명, 도어락 제어 등)
• 환경 모니터링 센서 (온습도, 미세먼지 등)
• MQTT 기반 IoT 통신
• BLE 기반 웨어러블 기기
• 실시간 스트리밍 (ESP32-CAM 사용 시)

1-3) 아두이노와의 관계

ESP32는 Arduino IDE에서 지원되며, 기존 아두이노 코드와 유사한 구조를 가짐. setup()과 loop() 함수를 사용하는 C++ 기반 프로그래밍으로 입문자가 빠르게 접근 가능함. 대부분의 아두이노 함수가 호환되어 기존 아두이노 경험이 있다면 전환이 용이함.


2. 온라인 ESP32 시뮬레이터 소개 - Wokwi

ESP32 보드를 실물로 구입하지 않아도 코드를 작성하고 테스트할 수 있는 시뮬레이터가 존재함. 대표적인 사이트는 Wokwi임.

2-1) Wokwi 특징

•	Arduino, ESP32, Raspberry Pi Pico 등 다양한 보드 지원
•	웹 브라우저 상에서 회로 구성 및 코드 실행 가능
•	여러 센서, 디스플레이, 입력 장치를 가상으로 구성할 수 있음
•	별도 프로그램 설치 없이 사용 가능
•	시리얼 모니터, Wi-Fi 기능, MQTT 통신까지 테스트 가능

3. 기본 예제 코드 소개

#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를 깜빡이게 한다.
딜레이를 조절하여 깜빡이는 속도를 변경할 수 있다


예제 2 - 버튼으로 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로 판정된다


예제 3 - Wi-Fi + MQTT로 LED 제어

#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 상태가 변경된다.


예제 4 - MicroPython: 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를 주기적으로 켜고 끄는 구조이다.


예제 5 - MicroPython: 버튼 입력으로 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)을 통해 루프가 너무 빠르게 반복되는 것을 방지한다.


예제 6 - MicroPython: 7세그먼트 디스플레이 출력

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 시뮬레이터를 활용해 회로를 구성하고 코드를 실행해보는 과정을 추천한다.
향후에는 센서, 디스플레이 등 다양한 부품을 활용한 예제를 계속해서 정리할 예정이다.

profile
프론트엔드 개발자

0개의 댓글