ESP32: 블루투스를 이용한 와이파이 연결 설정
ESP32 마이크로컨트롤러의 무궁무진한 기능을 탐구하고 싶다면 제대로 찾아오셨습니다. 모든 ESP32 기반 보드에는 Wi-Fi와 블루투스가 내장되어 있습니다. Wi-Fi를 통해 ESP32는 인터넷에 연결하고 다른 장치와 통신할 수 있으며, 블루투스는 ESP32와 블루투스 지원 장치 간의 무선 통신을 가능하게 합니다.
이 단계별 튜토리얼에서는 블루투스를 사용하여 ESP32에서 Wi-Fi를 설정하는 방법을 알아보겠습니다. 초보자든 숙련자든 이 튜토리얼을 읽고 나면 ESP32를 인터넷에 손쉽게 연결하고 그 모든 잠재력을 활용할 수 있을 것입니다.

무엇을 배우게 될까요?
- ESP32에 내장된 블루투스를 이용한 데이터 전송.
- 블루투스 데이터를 사용하여 Wi-Fi를 설정합니다.
블루투스를 사용하여 ESP32 WiFi를 구성할 때의 이점
이 방식에는 여러 가지 장점이 있습니다. 첫째, 초기 Wi-Fi 설정을 위해 ESP32를 컴퓨터에 물리적으로 연결할 필요가 없습니다. (특히 ESP32가 기기에 내장되어 있거나 컴퓨터에 접근할 수 없는 경우에 유용합니다.) 또한 Wi-Fi 설정을 변경할 때 ESP32를 다시 프로그래밍할 필요가 없습니다.
이러한 유연성은 Wi-Fi 네트워크 환경이 자주 바뀌는 경우에 매우 중요합니다.
하드웨어 구성 요소
ESP32-WROOM × 1
안드로이드 휴대폰 × 1
소프트웨어 앱
아두이노 IDE
시리얼 블루투스 터미널(안드로이드)
블루투스를 이용한 ESP32 WiFi 제어
1단계: "시리얼 블루투스 터미널" 앱 설치
먼저 구글 플레이 스토어에서 Serial Bluetooth Terminal 앱을 설치해야 합니다.

2단계: ESP32에 코드 업로드
먼저, 아두이노 IDE에 ESP32 애드온 라이브러리를 설치하세요. 그런 다음, 아래 코드를 ESP32에 업로드하세요.
#include "BluetoothSerial.h"
#include <WiFi.h>
//#define USE_PIN // Uncomment this to use PIN during pairing. The pin is specified on the line below
const char *pin = "1218"; // Change this to more secure PIN.
String device_name = "ESP32-BT-WIFI-CONTROLLER";
BluetoothSerial SerialBT;
int i = 0;
String incoming_char;
String SSIDIN;
String PASSIN;
String header;
String ssids_array[50];
String network_string;
String connected_string;
int startchar;
int endchar;
long start_wifi_millis;
long wifi_timeout = 10000;
void setup() {
//pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
// Initialize the output variables as outputs
SerialBT.begin(device_name); //Bluetooth device name
Serial.printf("Device name: \"%s\"\n", device_name.c_str());
//Serial.printf("The device with name \"%s\" and MAC address %s is started.\nNow you can pair it with Bluetooth!\n", device_name.c_str(), SerialBT.getMacString()); // Use this after the MAC method is implemented
/*#ifdef USE_PIN
SerialBT.setPin(pin);
Serial.println("Using PIN");
#endif*/
while (!(SerialBT.available()));
SerialBT.println("Scanning Wi-Fi networks");
Serial.println("Scanning Wi-Fi networks");
scan_wifi_networks();
A:
SerialBT.println("Please enter the name of your WiFi.");
while (!(SerialBT.available()));
while (SerialBT.available()) {
char c = SerialBT.read();
incoming_char += c;
Serial.write(c);
}
if (incoming_char.indexOf("ssid:") >= 0)
{
startchar = incoming_char.indexOf('<') + 1;
endchar = incoming_char.indexOf('>', startchar);
for (int i = startchar; i < endchar; i++)
SSIDIN += incoming_char[i];
Serial.println(SSIDIN);
}
else
{
SerialBT.println("Error:Enter SSID with following format -> ssid:...");
goto A;
}
incoming_char = "";
SerialBT.println("Please enter the password of your WiFi.");
while (!(SerialBT.available()));
while (SerialBT.available()) {
char c = SerialBT.read();
incoming_char += c;
Serial.write(c);
}
if (incoming_char.indexOf("pass:") >= 0)
{
int startchar2 = incoming_char.indexOf('<') + 1;
int endchar2 = incoming_char.indexOf('>', startchar2);
for (int i = startchar2; i < endchar2; i++)
PASSIN += incoming_char[i];
Serial.println(PASSIN);
}
else
{
SerialBT.println("Error:Enter Pass with following format -> pass:...");
goto A;
}
delay(500);
SerialBT.println("Please wait for Wi-Fi connection...");
Serial.println("Please wait for Wi_Fi connection...");
//disconnect_bluetooth();
start_wifi_millis = millis();
const char* ssid = SSIDIN.c_str();
const char* password = PASSIN.c_str();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (millis() - start_wifi_millis > wifi_timeout) {
WiFi.disconnect(true, true);
SerialBT.println("Could't connect to Wi-Fi...");
Serial.println("Could't connect to Wi-Fi...");
}
}
SerialBT.println("Connected");
Serial.println("Connected");
SerialBT.print("ESP32 IP: ");
SerialBT.println(WiFi.localIP());
Serial.print("ESP32 IP: ");
Serial.println(WiFi.localIP());
incoming_char = "";
SSIDIN = "";
PASSIN = "";
//while (1);
}
void scan_wifi_networks()
{
WiFi.mode(WIFI_STA);
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
if (n == 0) {
SerialBT.println("no networks found");
} else {
SerialBT.println();
SerialBT.print(n);
SerialBT.println(" networks found");
delay(1000);
for (int i = 0; i < n; ++i) {
ssids_array[i + 1] = WiFi.SSID(i);
Serial.print(i + 1);
Serial.print(": ");
Serial.println(ssids_array[i + 1]);
network_string = i + 1;
network_string = network_string + ": " + WiFi.SSID(i) + " (Strength:" + WiFi.RSSI(i) + ")";
SerialBT.println(network_string);
}
}
}
void disconnect_bluetooth()
{
delay(1000);
Serial.println("BT stopping");
SerialBT.println("Bluetooth disconnecting...");
delay(1000);
SerialBT.flush();
SerialBT.disconnect();
SerialBT.end();
Serial.println("BT stopped");
delay(1000);
}
void loop() {
delay(1000);
}
저희 코드의 핵심 내용은 다음과 같습니다.
• ESP32와 안드로이드 스마트폰 간의 양방향 블루투스 통신 설정
• ESP32 블루투스에 연결된 사용자에게 SSID와 Wi-Fi 비밀번호 입력 요청
• ESP32가 블루투스를 통해 수신한 데이터 처리
• Wi-Fi 설정 및 연결
코드 살펴보기
먼저 ESP32 블루투스 및 와이파이용 라이브러리를 설치합니다.
#include "BluetoothSerial.h"
#include <WiFi.h>
아두이노
다음으로, (ESP32에서 생성된) 블루투스에 이름을 지정한 후, 해당 블루투스에 대한 "인스턴스"를 정의합니다.
String device_name = "ESP32-BT-WIFI-CONTROLLER";
BluetoothSerial SerialBT;
setup() 함수:
이 함수는 먼저 115200의 전송 속도로 직렬 통신을 설정합니다.
Serial.begin(115200);
다음으로 ESP32 블루투스를 활성화합니다.
SerialBT.begin(device_name);
이제 와이파이에 연결하고 주변 네트워크를 스캔하여 SSID 이름과 신호 강도를 시리얼 모니터에 표시하고 블루투스 모듈에 연결된 장치로 전송합니다.
scan_wifi_networks();
위 함수의 코드는 다음과 같습니다.
void scan_wifi_networks()
{
WiFi.mode(WIFI_STA);
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
if (n == 0) {
SerialBT.println("no networks found");
} else {
SerialBT.println();
SerialBT.print(n);
SerialBT.println(" networks found");
delay(1000);
for (int i = 0; i < n; ++i) {
ssids_array[i + 1] = WiFi.SSID(i);
Serial.print(i + 1);
Serial.print(": ");
Serial.println(ssids_array[i + 1]);
network_string = i + 1;
network_string = network_string + ": " + WiFi.SSID(i) + " (Strength:" + WiFi.RSSI(i) + ")";
SerialBT.println(network_string);
}
}
}
여기서는 ESP32 WiFi의 작동 모드를 선택합니다. 작동 모드에는 다음과 같은 것들이 있습니다.
• 스테이션 : ESP32가 액세스 포인트(예: 라우터)에 직접 연결됩니다.
• 액세스 포인트(핫스팟) : 다른 장치들이 WiFi를 통해 ESP32에 연결할 수 있습니다.
• 액세스 포인트 & 스테이션 : ESP32는 액세스 포인트 역할을 하면서 다른 액세스 포인트에 스테이션으로 연결됩니다.
ESP32 보드를 인터넷에 연결하여 로컬 네트워크를 통해 접속하려면 스테이션 모드를 사용합니다. 이 모드에서 라우터는 액세스 포인트 역할을 하고 ESP32는 스테이션 역할을 합니다.
마지막으로, "scan-wifi_networks" 함수는 검색된 WiFi 네트워크의 개수와 각 네트워크의 정보(SSID 및 신호 강도)를 시리얼 모니터에 출력합니다.
그런 다음 블루투스를 통해 사용자에게 WiFi 네트워크의 SSID를 입력하라는 메시지를 보냅니다.
SerialBT.print(""Please enter the name of your WiFi." ");
여기서는 ESP32를 사용하여 SSID와 PASS가 포함된 문자열을 수신한 다음, 이를 "incoming_char" 문자열에 저장합니다.
while (SerialBT.available()) {
char c = SerialBT.read();
incoming_char += c;
Serial.write(c);
}
다음으로 "incoming_char" 문자열의 형식이 올바른지 확인합니다.
if (incoming_char.indexOf("ssid:") >= 0)
{
startchar = incoming_char.indexOf('<') + 1;
endchar = incoming_char.indexOf('>', startchar);
for (int i = startchar; i < endchar; i++)
SSIDIN += incoming_char[i];
Serial.println(SSIDIN);
}
블루투스 메시지에 "SSID:"라는 단어가 포함되어 있으면, '<'와 '>' 문자 사이의 WiFi 네트워크 이름을 추출하여 SSIDIN 문자열에 저장합니다.
전송된 텍스트에 "SSID"가 포함되어 있지 않으면, 사용자에게 데이터 전송 형식을 따르도록 안내하고 프로그램을 A 지점으로 돌아가 해당 줄부터 다시 실행합니다.
else
{
SerialBT.println("Enter SSID with following format -> ssid:...");
goto A;
}
A 지점은 Wi-Fi 사양을 수신하기 시작하는 지점입니다.
그 후, 블루투스 포트를 통해 사용자에게 원하는 Wi-Fi 비밀번호를 입력하라는 메시지를 출력합니다.
SerialBT.println("Please enter the password of your WiFi.");
우리는 SSID에 했던 것과 동일한 방식으로 PASS에도 같은 작업을 수행합니다.
if (incoming_char.indexOf("pass:") >= 0)
{
int startchar2 = incoming_char.indexOf('<') + 1;
int endchar2 = incoming_char.indexOf('>', startchar2);
for (int i = startchar2; i < endchar2; i++)
PASSIN += incoming_char[i];
Serial.println(PASSIN);
}
else
{
SerialBT.println("Enter Pass with following format -> pass:...");
goto A;
}
이제 블루투스를 통해 수신한 데이터에 따라 ESP32 WiFi 네트워크를 구성할 차례입니다.
WiFi.begin(ssid, password);
이 코드는 10초 동안 연결 상태를 확인합니다. ESP32가 인터넷에 연결되지 않으면 시리얼 모니터에 오류 메시지가 출력되고, 이어서 블루투스 모듈 에 연결된 장치로 오류 메시지가 전송됩니다 .
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (millis() - start_wifi_millis > wifi_timeout) {
WiFi.disconnect(true, true);
SerialBT.println("Could't connect to Wi-Fi...");
Serial.println("Could't connect to Wi-Fi...");
}
}
연결이 성공적으로 이루어지면 "연결됨"이라는 단어가 출력됩니다.
SerialBT.println("Connected");
Serial.println("Connected");
마지막으로 ESP32 모듈의 IP 주소가 사용자에게 표시됩니다.
SerialBT.print("ESP32 IP: ");
SerialBT.println(WiFi.localIP());
Serial.print("ESP32 IP: ");
Serial.println(WiFi.localIP());
팁:
ESP32 기반 모듈에서는 블루투스와 와이파이 무선 시스템을 공유하기 때문에 두 연결을 동시에 활성화하면 오작동이 발생할 수 있습니다. 와이파이를 통해 데이터(예: 이미지)를 전송하려면 와이파이 네트워크에 연결한 후 블루투스 연결을 해제하십시오.
블루투스 연결을 해제하려면 코드의 88번째 줄 주석을 해제하세요.
//disconnect_bluetooth();
아래 함수를 사용하여 먼저 ESP32 보드와 사용자 간의 블루투스 통신을 끊은 다음 블루투스 모듈과의 통신도 끊습니다.
void disconnect_bluetooth()
{
delay(1000);
Serial.println("BT stopping");
SerialBT.println("Bluetooth disconnecting...");
delay(1000);
SerialBT.flush();
SerialBT.disconnect();
SerialBT.end();
Serial.println("BT stopped");
delay(1000);
}
3단계: 이제 실행해 봅시다!
ESP32에 앱을 업로드한 후, 휴대폰의 블루투스를 켜고 ESP32-BT-Slave에 연결하세요. 4번째 줄의 주석 처리를 해제했다면, 연결 설정에 필요한 코드 입력 창이 나타납니다. 이때 1218을 입력하세요.
이제 시리얼 블루투스 터미널 앱을 실행합니다. 아래 그림과 같이 1부터 3까지의 숫자를 순서대로 누르세요. ESP32 블루투스에 성공적으로 연결되면 4번째 줄에 표시된 텍스트가 나타납니다.

"연결됨"이라는 단어가 표시되면 ESP32로 문자를 전송하세요. 앱에 주변의 활성 Wi-Fi 네트워크가 표시됩니다.

이제 사용 가능한 네트워크 중 하나를 선택하고 다음 형식으로 SSID와 비밀번호를 각각 입력하세요.
ssid:<여기에 SSID를 입력하세요>
pass:<여기에 비밀번호를 입력하세요>
모든 단계를 정확하게 따라했다면 ESP32가 Wi-Fi 네트워크에 연결되고 시리얼 포트와 블루투스를 통해 IP 주소를 표시할 것입니다.


팁:
와이파이와 블루투스 신호는 서로 간섭을 일으킬 수 있습니다. 따라서 ESP32는 강력한 와이파이 또는 블루투스 신호를 방출하는 기기에서 멀리 떨어뜨려 놓는 것이 좋습니다.
다음 단계는 무엇인가요?
이 튜토리얼에서는 ESP32와 통신하고 블루투스를 통해 데이터를 송수신하는 과정, 그리고 초기 Wi-Fi 설정 방법을 다뤘습니다.
이 튜토리얼과 약간의 창의력을 활용하면 다음과 같은 기능을 추가하여 프로젝트를 더욱 발전시킬 수 있습니다.
1. 암호화 또는 인증과 같은 보안 통신 프로토콜을 구현하여 Wi-Fi 설정 정보를 보호합니다.
2. 도구 또는 자동화 스크립트를 활용하여 Wi-Fi 설정 과정을 자동화합니다.
3. Wi-Fi 설정 코드에 오류 처리 및 복구 메커니즘을 구현합니다 .
이 팁들을 활용하면 ESP32에서 Wi-Fi 설정 과정을 최적화할 수 있습니다.
또한, ESP32의 다른 Wi-Fi 모드인 액세스 포인트(Access Point)와 액세스 포인트 & 스테이션(Access Point & Station)도 살펴볼 수 있습니다. 액세스 포인트 모드를 사용하면 ESP32를 라우터로 활용하여 다른 ESP32 또는 안드로이드 스마트폰과 같은 기기에서 블루투스를 통해 SSID와 비밀번호를 설정할 수 있습니다.
또는, 액세스 포인트 & 스테이션 모드를 블루투스와 함께 사용하면 블루투스를 통해 광범위한 범위의 설정 가능한 Wi-Fi 네트워크를 구축할 수 있습니다.
세 가지 모드 모두에서 서버를 설정하고 다양한 모듈을 ESP32 보드에 연결하면 원하는 데이터를 업로드하고 원격으로 확인할 수 있습니다.
여기까지입니다. 고생하셨습니다.
위 문서의 원문 출처는 이 링크를 따라가세요. 원 저자에게 감사합니다.
'ESP32' 카테고리의 다른 글
| esp32 Super mini 터치 핀 (0) | 2026.06.25 |
|---|---|
| ESP32 뭔가 안 될 때 전문가가 알려주는 문제 해결 가이드 (0) | 2026.06.17 |
| 꼭 만들어 보고 싶어질 ESP32 프로젝트 4가지! (0) | 2026.06.10 |
| esp32 자동 타이머 스위치 (0) | 2026.06.08 |
| ESP32 슈퍼 미니 개발 보드 세부 사항 (0) | 2026.06.08 |
| esp32-c6과 s3 차이점 (0) | 2026.06.05 |
| ESP32-S3 배터리 사용과 배터리 전압 측정 (0) | 2026.06.03 |
| ESP32 및 ESP8266에 MicroPython 펌웨어를 플래싱하는 방법 (0) | 2026.06.03 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩