아두이노 나노 ESP32 블루투스 슬라이더 예제 BLE를 통한 듀얼 슬라이더 제어 튜토리얼
개요
이 예제는 DIYables Bluetooth STEM 앱을 통한 BLE(블루투스 로우 에너지)를 사용하여 Arduino Nano ESP32에 듀얼 슬라이더 제어를 제공합니다. 스마트폰에서 설정 가능한 범위와 스텝으로 두 개의 독립적인 값을 제어하세요. LED 밝기, 모터 속도, 서보 위치 조정, 조절 가능한 숫자 입력이 필요한 모든 애플리케이션에 적합합니다.
참고: Arduino Nano ESP32는 BLE만 지원하며 클래식 블루투스는 지원하지 않습니다. DIYables 블루투스 앱은 BLE를 통해 Android와 iOS 모두에서 작동합니다.

기능
- 듀얼 슬라이더: 두 개의 독립적인 슬라이더 제어
- 설정 가능한 범위: 최솟값, 최댓값, 스텝 값 설정
- 실시간 업데이트: 변경 시 슬라이더 값 즉시 전송
- PWM 지원: 슬라이더 값을 PWM 출력에 직접 매핑
- Android 및 iOS 지원: BLE는 두 플랫폼 모두 호환
- 페어링 불필요: BLE는 수동 페어링 없이 연결
- 저전력: BLE는 클래식 블루투스보다 적은 전력 소비
필요한 하드웨어
| 1 | × | 아두이노 나노 ESP32 | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-A to 타입-C (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-C to 타입-C (USB-C PC용) | 아마존 | |
| 1 | × | 브레드보드 | 쿠팡 | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 브레이크아웃 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노 ESP32용 전원 분배기 | 쿠팡 | 아마존 |
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Arduino Nano ESP32 코드
빠른 시작
- Arduino Nano ESP32가 처음이신가요? 아두이노 나노 ESP32 - 소프트웨어 설치를 참조하세요.
- USB로 Arduino Nano ESP32를 컴퓨터에 연결하세요.
- Arduino IDE를 열어주세요.
- Arduino Nano ESP32 보드와 올바른 COM 포트를 선택하세요.
- 왼쪽 사이드바에서 라이브러리 아이콘을 클릭하세요.
- "DIYables Bluetooth"를 검색하고 DIYables의 DIYables Bluetooth 라이브러리를 선택하세요.
- 설치를 클릭하세요.

- 종속성 설치 메시지가 나타나면 모두 설치를 클릭하세요.

BLE 코드
- Arduino IDE에서 파일 예제 DIYables Bluetooth ArduinoBLE_Slider를 열거나, 코드를 편집기에 붙여 넣으세요.
/*
* DIYables Bluetooth Library - ESP32 BLE Slider Example
* Works with DIYables Bluetooth STEM app on Android and iOS
*
* This example demonstrates the Bluetooth Slider feature:
* - Control values using sliders (0-100)
* - Support for dual sliders
* - Configurable range and step
*
* Tutorial: https://diyables.io/bluetooth-app
* Author: DIYables
*/
#include <DIYables_BluetoothServer.h>
#include <DIYables_BluetoothSlider.h>
#include <platforms/DIYables_Esp32BLE.h>
// BLE Configuration
const char* DEVICE_NAME = "ESP32BLE_Slider";
const char* SERVICE_UUID = "19B10000-E8F2-537E-4F6C-D104768A1214";
const char* TX_UUID = "19B10001-E8F2-537E-4F6C-D104768A1214";
const char* RX_UUID = "19B10002-E8F2-537E-4F6C-D104768A1214";
// Create Bluetooth instances
DIYables_Esp32BLE bluetooth(DEVICE_NAME, SERVICE_UUID, TX_UUID, RX_UUID);
DIYables_BluetoothServer bluetoothServer(bluetooth);
// Create Slider app instance (min=0, max=100, step=1)
DIYables_BluetoothSlider bluetoothSlider(0, 100, 1);
// Variables to store current slider values
int currentSlider1 = 0;
int currentSlider2 = 0;
// PWM output pins
const int PWM_PIN_1 = D6;
const int PWM_PIN_2 = D7;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("DIYables Bluetooth - ESP32 BLE Slider Example");
// Initialize PWM pins
pinMode(PWM_PIN_1, OUTPUT);
pinMode(PWM_PIN_2, OUTPUT);
// Initialize Bluetooth server with platform-specific implementation
bluetoothServer.begin();
// Add slider app to server
bluetoothServer.addApp(&bluetoothSlider);
// Set up connection event callbacks
bluetoothServer.setOnConnected([]() {
Serial.println("Bluetooth connected!");
bluetoothSlider.send(currentSlider1, currentSlider2);
});
bluetoothServer.setOnDisconnected([]() {
Serial.println("Bluetooth disconnected!");
});
// Set up slider callback for value changes
bluetoothSlider.onSliderValue([](int slider1, int slider2) {
currentSlider1 = slider1;
currentSlider2 = slider2;
Serial.print("Slider 1: ");
Serial.print(slider1);
Serial.print(", Slider 2: ");
Serial.println(slider2);
// Map slider values (0-100) to PWM range (0-255)
int pwm1 = map(slider1, 0, 100, 0, 255);
int pwm2 = map(slider2, 0, 100, 0, 255);
analogWrite(PWM_PIN_1, pwm1);
analogWrite(PWM_PIN_2, pwm2);
// TODO: Add your control logic here
});
bluetoothSlider.onGetConfig([]() {
bluetoothSlider.send(currentSlider1, currentSlider2);
Serial.print("App requested values - Sent: Slider1=");
Serial.print(currentSlider1);
Serial.print(", Slider2=");
Serial.println(currentSlider2);
});
Serial.println("Waiting for Bluetooth connection...");
}
void loop() {
bluetoothServer.loop();
delay(10);
}
- 업로드를 클릭하여 스케치를 보드에 플래시하세요.
- 시리얼 모니터를 열어주세요.
- 시리얼 모니터 출력은 다음과 같아야 합니다:
8
Serial.println("Hello World!");
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
DIYables Bluetooth - Slider Example
Waiting for Bluetooth connection...
모바일 앱
참고: DIYables 블루투스 앱은 BLE를 통해 Android와 iOS 모두에서 작동합니다. 수동 페어링이 필요 없습니다.
- DIYables 블루투스 앱을 실행하세요.
- 처음 실행 시 다음 권한을 허용하세요:
- 근처 기기 (Android 12+) / 블루투스 (iOS) — 블루투스 기기 스캔 및 연결에 필요
- 위치 (Android 11 이하에만 해당) — 구형 Android 버전에서 BLE 스캔에 필요
- 기기에서 블루투스가 활성화되어 있는지 확인하세요.
- 홈 화면에서 연결을 탭하세요. 앱이 BLE 기기를 스캔합니다.

- 스캔 결과에서 "Arduino_Slider"를 탭하세요.
- 연결 후 홈 화면으로 돌아가 슬라이더 앱을 여세요.

홈 화면의 설정 아이콘을 탭하여 앱을 표시하거나 숨길 수 있습니다. 자세한 내용은 DIYables 블루투스 앱 사용 설명서를 참조하세요.
- 슬라이더를 드래그하여 값을 변경하세요.

Arduino IDE의 시리얼 모니터를 다시 확인하면 다음과 같이 표시됩니다:
8
Serial.println("Hello World!");
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
Bluetooth connected!
Slider 1: 50, Slider 2: 0
Slider 1: 75, Slider 2: 0
Slider 1: 100, Slider 2: 25
- 슬라이더를 조정하고 시리얼 모니터에서 실시간으로 값이 업데이트되는 것을 확인하세요.
창의적인 커스터마이징 - 프로젝트에 코드 적용하기
슬라이더 범위 설정
// Constructor: DIYables_BluetoothSlider(min, max, step)
DIYables_BluetoothSlider bluetoothSlider(0, 100, 1);
// Change range at runtime
bluetoothSlider.setRange(0, 255);
// Change step size
bluetoothSlider.setStep(5); // Coarser control
// Read configuration
int minVal = bluetoothSlider.getMin();
int maxVal = bluetoothSlider.getMax();
int step = bluetoothSlider.getStep();
슬라이더 변경 처리
bluetoothSlider.onSliderValue([](int slider1, int slider2) {
currentSlider1 = slider1;
currentSlider2 = slider2;
Serial.print("Slider 1: ");
Serial.print(slider1);
Serial.print(", Slider 2: ");
Serial.println(slider2);
// Map to PWM and control output
int pwm1 = map(slider1, 0, 100, 0, 255);
analogWrite(PWM_PIN_1, pwm1);
});
현재 값을 앱으로 전송
bluetoothSlider.onGetConfig([]() {
bluetoothSlider.send(currentSlider1, currentSlider2);
});
// Or send anytime:
bluetoothSlider.send(50, 75); // Set both sliders
연결 이벤트 처리
bluetoothServer.setOnConnected([]() {
Serial.println("Bluetooth connected!");
bluetoothSlider.send(currentSlider1, currentSlider2);
});
bluetoothServer.setOnDisconnected([]() {
Serial.println("Bluetooth disconnected!");
});
프로그래밍 예제
LED 밝기 제어
const int LED_PIN_1 = 9;
const int LED_PIN_2 = 10;
bluetoothSlider.onSliderValue([](int slider1, int slider2) {
int brightness1 = map(slider1, 0, 100, 0, 255);
int brightness2 = map(slider2, 0, 100, 0, 255);
analogWrite(LED_PIN_1, brightness1);
analogWrite(LED_PIN_2, brightness2);
Serial.print("LED 1: ");
Serial.print(brightness1);
Serial.print(", LED 2: ");
Serial.println(brightness2);
});
서보 제어
#include <Servo.h>
Servo servo1, servo2;
void setup() {
servo1.attach(9);
servo2.attach(10);
bluetoothSlider.onSliderValue([](int slider1, int slider2) {
int angle1 = map(slider1, 0, 100, 0, 180);
int angle2 = map(slider2, 0, 100, 0, 180);
servo1.write(angle1);
servo2.write(angle2);
Serial.print("Servo 1: ");
Serial.print(angle1);
Serial.print("°, Servo 2: ");
Serial.print(angle2);
Serial.println("°");
});
}
방향이 있는 모터 속도 제어
const int MOTOR_SPEED_PIN = 9;
const int MOTOR_DIR_PIN = 8;
bluetoothSlider.onSliderValue([](int slider1, int slider2) {
// Slider 1: speed (0-100%)
// Slider 2: direction threshold (below 50 = reverse, above 50 = forward)
int speed = map(slider1, 0, 100, 0, 255);
bool forward = (slider2 >= 50);
analogWrite(MOTOR_SPEED_PIN, speed);
digitalWrite(MOTOR_DIR_PIN, forward ? HIGH : LOW);
Serial.print("Speed: ");
Serial.print(slider1);
Serial.print("%, Direction: ");
Serial.println(forward ? "Forward" : "Reverse");
});
고급 프로그래밍 기법
데드존이 있는 슬라이더
bluetoothSlider.onSliderValue([](int slider1, int slider2) {
// Add dead zone around center (45-55 = stop)
if (slider1 >= 45 && slider1 <= 55) {
Serial.println("Center - stopped");
analogWrite(MOTOR_PIN, 0);
} else {
int speed = map(slider1, 0, 100, 0, 255);
analogWrite(MOTOR_PIN, speed);
}
});
속도 제한
unsigned long lastSliderAction = 0;
const unsigned long SLIDER_COOLDOWN = 50; // 50ms minimum
bluetoothSlider.onSliderValue([](int slider1, int slider2) {
if (millis() - lastSliderAction >= SLIDER_COOLDOWN) {
lastSliderAction = millis();
// Process slider value
analogWrite(PWM_PIN, map(slider1, 0, 100, 0, 255));
}
});
문제 해결
일반적인 문제
1. 앱에서 기기가 보이지 않음
- 보드에 전원이 공급되고 스케치가 업로드되었는지 확인하세요
- 스마트폰에서 블루투스가 활성화되어 있는지 확인하세요
- Android 11 이하에서는 위치 서비스도 활성화하세요
- 스마트폰의 블루투스를 재시작해 보세요
2. 슬라이더 변경이 수신되지 않음
- 앱의 블루투스 연결 상태를 확인하세요
- onSliderValue 콜백이 올바르게 등록되었는지 확인하세요
- 오류 메시지를 시리얼 모니터에서 확인하세요
3. PWM 출력이 작동하지 않음
- 해당 핀이 PWM을 지원하는지 확인하세요
- 배선 연결을 확인하세요
- 간단한 analogWrite 스케치로 먼저 테스트하세요
4. 재연결 시 슬라이더가 0으로 초기화됨
- 재연결 시 저장된 값을 전송하도록 onGetConfig 콜백을 구현하세요
- 연결 간에 슬라이더 값을 변수에 저장하세요
5. 연결이 자주 끊김
- 아두이노와의 거리를 줄이세요
- 다른 BLE 기기의 간섭을 확인하세요
- 안정적인 USB 전원 공급을 확보하세요
6. 업로드 실패 또는 보드 인식 불가
- 보드 매니저를 통해 최신 Arduino Nano ESP32 보드 패키지를 설치하세요
- 다른 USB 케이블이나 포트를 시도해 보세요
- 업로드 전에 리셋 버튼을 눌러보세요
프로젝트 아이디어
조명 제어
- 듀얼 LED 밝기 컨트롤러
- RGB LED 색상 믹서 (두 슬라이더로 색조/채도 조절)
- LED 스트립 밝기 및 색온도
- 무대 조명 디머
모터 제어
- DC 모터 속도 컨트롤러
- 듀얼 서보 위치 제어
- 팬-틸트 카메라 마운트
- 로봇 바퀴 속도
오디오
- 볼륨 제어
- 음색 주파수 및 지속 시간
- 이퀄라이저 밴드
다음 단계
블루투스 슬라이더 예제를 완료한 후 다음을 살펴보세요:
- 블루투스 조이스틱 — 2D 방향 제어
- 블루투스 로테이터 — 각도/회전 제어
- 블루투스 온도 — 온도 게이지 표시
- 블루투스 다중 앱 — 슬라이더와 다른 앱 위젯 결합