// Hardware Platform — Wi-Fi SoC Microcontroller
ESP32 / ESP8266
$2짜리 Wi-Fi 칩이 IoT 시장을 뒤흔들다 — Espressif의 저가 고성능 무선 MCU 완전 정복
// Table of Contents
Espressif와 ESP 시리즈의 탄생
중국 상하이의 반도체 기업 Espressif Systems는 2014년 ESP8266을 출시하며 IoT 시장에 일대 충격을 가했습니다. 당시 Wi-Fi 모듈은 수십 달러였는데, ESP8266은 $2 이하의 가격에 완전한 Wi-Fi 스택을 내장한 MCU를 제공했습니다.
2016년 출시된 ESP32는 듀얼코어 CPU, Bluetooth, 더 많은 주변장치를 추가하며 ESP8266의 한계를 극복했습니다. 현재 ESP32 계열은 전 세계 IoT 기기에서 가장 많이 쓰이는 무선 MCU 플랫폼 중 하나입니다.
ESP32 vs ESP8266 — 핵심 비교
ESP32
ESP8266
ESP32 상세 하드웨어 스펙
CPU 코어
Xtensa LX6 × 2
PRO_CPU + APP_CPU
클럭
80 / 160 / 240 MHz
동적 주파수 조절
SRAM
520 KB
+ 4MB PSRAM 옵션
RTC 메모리
16 KB SRAM
딥슬립 중 유지
Wi-Fi
802.11 b/g/n
Station / AP / AP+STA
Bluetooth
BT Classic + BLE 4.2
A2DP, SPP, BLE GATT
ADC
12-bit SAR × 18ch
Wi-Fi 활성 시 ADC2 불가
DAC
8-bit × 2채널
GPIO25, GPIO26
Touch 센서
정전식 × 10채널
슬립 웨이크업 트리거
통신
UART×3, SPI×4
I²C×2, I²S×2
CAN, IR, PWM, PCNT
ESP32 변형 모델 라인업
| 칩/모듈 | CPU | 주요 특징 | 용도 |
|---|---|---|---|
| ESP32 원조 | LX6 듀얼 240MHz | BT 4.2, 범용, 가장 풍부한 예제 | 일반 IoT, 학습 |
| ESP32-S2 | LX7 싱글 240MHz | BT 제거, USB OTG 추가, 보안 강화 | USB HID, 보안 기기 |
| ESP32-S3 AI 추천 | LX7 듀얼 240MHz | BLE 5.0, 벡터 명령어(AI 가속), USB OTG | 엣지 AI, 카메라 |
| ESP32-C3 | RISC-V 싱글 160MHz | Wi-Fi 6, BLE 5.0, 초저가, 오픈소스 ISA | 단순 IoT 노드 |
| ESP32-C6 | RISC-V 싱글 160MHz | Wi-Fi 6, BLE 5, Zigbee, Thread(Matter) | 스마트홈 Matter 기기 |
| ESP32-H2 | RISC-V 싱글 96MHz | Wi-Fi 없음, BLE 5.3 + Zigbee + Thread | 저전력 메시 네트워크 |
| ESP32-P4 2024 신형 | RISC-V 듀얼 400MHz | 고성능, AI 가속기, MIPI CSI/DSI | HMI, 카메라, 미디어 |
개발 환경
| 환경 | 특징 | 난이도 | 추천 대상 |
|---|---|---|---|
| Arduino IDE + ESP32 보드팩 | 가장 쉬운 시작, Arduino 라이브러리 그대로 사용 | 쉬움 | 입문자, 빠른 프로토타입 |
| ESP-IDF (공식 SDK) | FreeRTOS 기반, 모든 기능 접근, C/C++ | 어려움 | 전문 개발, 상용 제품 |
| MicroPython | Python 문법, REPL 인터랙티브 쉘 | 쉬움 | Python 개발자, 교육 |
| PlatformIO | VS Code 통합, 의존성 관리, CI/CD | 보통 | 팀 개발, 프로젝트 관리 |
| Micropython + Thonny | 초보 친화적 IDE + Python | 쉬움 | 교육, 스크립팅 |
Wi-Fi와 Bluetooth 프로그래밍
Wi-Fi Station 모드 + HTTPS 요청
#include <WiFi.h> #include <HTTPClient.h> #include <ArduinoJson.h> const char* SSID = "YourSSID"; const char* PASSWORD = "YourPassword"; const char* API_URL = "https://api.open-meteo.com/v1/forecast?latitude=37.5&longitude=127.0¤t_weather=true"; void setup() { Serial.begin(115200); WiFi.begin(SSID, PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nConnected! IP: " + WiFi.localIP().toString()); } void loop() { HTTPClient http; http.begin(API_URL); int code = http.GET(); if (code == 200) { JsonDocument doc; deserializeJson(doc, http.getString()); float temp = doc["current_weather"]["temperature"]; Serial.printf("현재 기온: %.1f°C\n", temp); } http.end(); delay(60000); // 1분 간격 }
BLE 서버 (센서 데이터 전송)
#include <BLEDevice.h> #include <BLEServer.h> #include <BLEUtils.h> #define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define CHAR_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" BLECharacteristic *pChar; bool deviceConnected = false; class ServerCallbacks : public BLEServerCallbacks { void onConnect(BLEServer* s) { deviceConnected = true; } void onDisconnect(BLEServer* s) { deviceConnected = false; s->startAdvertising(); } }; void setup() { BLEDevice::init("ESP32-Sensor"); BLEServer *srv = BLEDevice::createServer(); srv->setCallbacks(new ServerCallbacks()); BLEService *svc = srv->createService(SERVICE_UUID); pChar = svc->createCharacteristic(CHAR_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY); svc->start(); BLEDevice::startAdvertising(); } void loop() { if (deviceConnected) { float temp = 25.3; // 실제 센서 값으로 대체 char buf[10]; sprintf(buf, "%.1f", temp); pChar->setValue(buf); pChar->notify(); } delay(1000); }
저전력 모드 완전 이해
ESP32의 가장 강력한 기능 중 하나는 세밀한 전력 관리입니다. 배터리 IoT 기기 설계의 핵심입니다.
#include <esp_sleep.h> #define uS_PER_S 1000000ULL #define SLEEP_SEC 30 // 30초 딥슬립 // RTC 메모리 — 딥슬립 중에도 유지! RTC_DATA_ATTR int bootCount = 0; void setup() { Serial.begin(115200); bootCount++; Serial.printf("Boot #%d\n", bootCount); // 센서 읽기, 데이터 전송 작업 수행 doWork(); // 타이머 웨이크업 설정 후 딥슬립 진입 esp_sleep_enable_timer_wakeup(SLEEP_SEC * uS_PER_S); Serial.println("Entering deep sleep..."); Serial.flush(); esp_deep_sleep_start(); // 이 아래 코드는 절대 실행되지 않음 } void loop() {} // 딥슬립 패턴에서 loop() 미사용
실전 예제 — MQTT IoT 센서 노드
#include <WiFi.h> #include <PubSubClient.h> #include <DHT.h> #include <ArduinoJson.h> const char* MQTT_HOST = "192.168.1.100"; const int MQTT_PORT = 1883; const char* TOPIC = "home/sensors/living"; WiFiClient wifiClient; PubSubClient mqtt(wifiClient); DHT dht(4, DHT22); void connectMQTT() { while (!mqtt.connected()) { if (mqtt.connect("ESP32-Living")) { Serial.println("MQTT connected"); } else { delay(5000); } } } void loop() { if (!mqtt.connected()) connectMQTT(); mqtt.loop(); static unsigned long prev = 0; if (millis() - prev >= 10000) { prev = millis(); JsonDocument doc; doc["temp"] = dht.readTemperature(); doc["humi"] = dht.readHumidity(); doc["rssi"] = WiFi.RSSI(); char payload[128]; serializeJson(doc, payload); mqtt.publish(TOPIC, payload); } }
장단점과 선택 가이드
// 장점
압도적 가성비
Wi-Fi+BT 내장 MCU를 $2~4에. 상용 IoT 기기 원가 절감의 핵심
// 장점
풍부한 생태계
Arduino, ESP-IDF, MicroPython, Tasmota, ESPHome 등 다양한 옵션
// 장점
강력한 저전력
딥슬립 10μA — AA 배터리로 수개월 동작하는 IoT 노드 구현 가능
// 주의
ADC 품질
Wi-Fi 동작 시 ADC2 사용 불가. ADC1도 Wi-Fi 노이즈 영향. 정밀 측정에는 외부 ADC 권장
// 주의
3.3V 로직
모든 GPIO 3.3V. 5V 신호 직결 금지. 일부 핀은 입력 전용 또는 부팅 시 특수 역할
// 주의
실시간성 한계
Wi-Fi 스택이 한 코어를 점유. 하드 실시간 요구에는 별도 MCU 병용 고려
댓글