아두이노 나노 ESP32 블루투스 슬라이더 예제 BLE를 통한 듀얼 슬라이더 제어 튜토리얼

개요

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

참고: Arduino Nano ESP32는 BLE만 지원하며 클래식 블루투스는 지원하지 않습니다. DIYables 블루투스 앱은 BLE를 통해 Android와 iOS 모두에서 작동합니다.

아두이노 나노 ESP32 블루투스 슬라이더 예제 - BLE를 통한 듀얼 슬라이더 제어 튜토리얼

기능

  • 듀얼 슬라이더: 두 개의 독립적인 슬라이더 제어
  • 설정 가능한 범위: 최솟값, 최댓값, 스텝 값 설정
  • 실시간 업데이트: 변경 시 슬라이더 값 즉시 전송
  • 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 라이브러리를 선택하세요.
  • 설치를 클릭하세요.
아두이노 나노 ESP32 diyaBLEs 블루투스 라이브러리
  • 종속성 설치 메시지가 나타나면 모두 설치를 클릭하세요.
아두이노 나노 ESP32 diyaBLEs 블루투스 dependency

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); }
  • 업로드를 클릭하여 스케치를 보드에 플래시하세요.
  • 시리얼 모니터를 열어주세요.
  • 시리얼 모니터 출력은 다음과 같아야 합니다:
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
DIYables Bluetooth - Slider Example Waiting for Bluetooth connection...
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

모바일 앱

  • 스마트폰에 DIYables 블루투스 앱을 설치하세요: Android | iOS

참고: DIYables 블루투스 앱은 BLE를 통해 Android와 iOS 모두에서 작동합니다. 수동 페어링이 필요 없습니다.

  • DIYables 블루투스 앱을 실행하세요.
  • 처음 실행 시 다음 권한을 허용하세요:
    • 근처 기기 (Android 12+) / 블루투스 (iOS) — 블루투스 기기 스캔 및 연결에 필요
    • 위치 (Android 11 이하에만 해당) — 구형 Android 버전에서 BLE 스캔에 필요
  • 기기에서 블루투스가 활성화되어 있는지 확인하세요.
  • 홈 화면에서 연결을 탭하세요. 앱이 BLE 기기를 스캔합니다.
diyaBLEs 블루투스 앱 - 스캔 버튼이 있는 홈 화면
  • 스캔 결과에서 "Arduino_Slider"를 탭하세요.
  • 연결 후 홈 화면으로 돌아가 슬라이더 앱을 여세요.
diyaBLEs 블루투스 앱 - 슬라이더 앱이 있는 홈 화면

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

  • 슬라이더를 드래그하여 값을 변경하세요.
diyaBLEs 블루투스 앱 - 슬라이더 화면

Arduino IDE의 시리얼 모니터를 다시 확인하면 다음과 같이 표시됩니다:

Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
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
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2
  • 슬라이더를 조정하고 시리얼 모니터에서 실시간으로 값이 업데이트되는 것을 확인하세요.

창의적인 커스터마이징 - 프로젝트에 코드 적용하기

슬라이더 범위 설정

// 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 모터 속도 컨트롤러
  • 듀얼 서보 위치 제어
  • 팬-틸트 카메라 마운트
  • 로봇 바퀴 속도

오디오

  • 볼륨 제어
  • 음색 주파수 및 지속 시간
  • 이퀄라이저 밴드

다음 단계

블루투스 슬라이더 예제를 완료한 후 다음을 살펴보세요:

  1. 블루투스 조이스틱 — 2D 방향 제어
  2. 블루투스 로테이터 — 각도/회전 제어
  3. 블루투스 온도 — 온도 게이지 표시
  4. 블루투스 다중 앱 — 슬라이더와 다른 앱 위젯 결합

지원

추가 도움이 필요하시면:

  • API 레퍼런스 문서를 확인하세요
  • DIYables 튜토리얼을 방문하세요
  • 아두이노 커뮤니티 포럼