ESP32 Bluetooth Slider Example Hướng dẫn Giao diện Điều khiển Slider Kép

Tổng quan

Ví dụ Bluetooth Slider cung cấp hai điều khiển slider độc lập có thể truy cập thông qua ứng dụng DIYables Bluetooth STEM. Được thiết kế cho bo mạch ESP32 với hỗ trợ cả BLE (Bluetooth Low Energy)Classic Bluetooth. Mỗi slider cung cấp giá trị từ 0-100, hoàn hảo cho điều khiển PWM, điều chỉnh độ sáng, điều khiển tốc độ motor và bất kỳ ứng dụng nào yêu cầu giá trị điều khiển kiểu analog.

Ví dụ này hỗ trợ hai chế độ Bluetooth:

  • ESP32 BLE (Bluetooth Low Energy): Hoạt động trên cả Android và iOS
  • ESP32 Classic Bluetooth: Chỉ hoạt động trên Android. iOS không hỗ trợ Classic Bluetooth. Sử dụng BLE nếu bạn cần hỗ trợ iOS.
ESP32 Bluetooth slider example - hướng dẫn giao diện Điều khiển slider kép

Tính năng

  • Slider kép: Hai điều khiển slider độc lập (mỗi cái có phạm vi 0-100)
  • Giá trị thời gian thực: Cập nhật giá trị tức thì qua kết nối Bluetooth
  • Tương thích PWM: Giá trị (0-100) dễ dàng ánh xạ tới các hàm analogWrite()
  • Phản hồi trực quan: Hiển thị giá trị thời gian thực cho mỗi slider trong ứng dụng
  • BLE & Classic Bluetooth: Chọn chế độ Bluetooth phù hợp với dự án của bạn
  • Đa nền tảng: Chế độ BLE hoạt động trên cả Android và iOS; Classic Bluetooth hoạt động trên Android
  • Tùy chọn tiết kiệm pin: Chế độ BLE tiêu thụ ít điện hơn Classic Bluetooth
  • Phạm vi & Bước có thể cấu hình: Tùy chỉnh phạm vi slider và kích thước bước trong thời gian chạy

Linh kiện cần thiết

1×mô-đun phát triển ESP-WROOM-32
1×Alternatively, ESP32 Uno-form board
1×Alternatively, ESP32 S3 Uno-form board
1×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)
1×breadboard
1×dây jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP32
1×(Khuyến nghị) Breakout Expansion Board for ESP32
1×(Khuyến nghị) Power Splitter for ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Code ESP32

Các bước thực hiện

Làm theo các hướng dẫn từng bước:

  • Nếu đây là lần đầu tiên bạn sử dụng ESP32, hãy tham khảo hướng dẫn ESP32 - Cài Đặt Phần Mềm.
  • Kết nối bo mạch ESP32 với máy tính của bạn bằng cáp USB.
  • Khởi chạy Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP32 và cổng COM thích hợp.
  • Điều hướng tới biểu tượng Libraries trên thanh bên trái của Arduino IDE.
  • Tìm kiếm "DIYables Bluetooth", sau đó tìm thư viện DIYables Bluetooth của DIYables
  • Nhấp nút Install để cài đặt thư viện.
thư viện ESP32 diyables Bluetooth
  • Bạn sẽ được yêu cầu cài đặt một số thư viện phụ thuộc khác
  • Nhấp nút Install All để cài đặt tất cả các thư viện phụ thuộc.
thư viện phụ thuộc ESP32 diyables Bluetooth

Chọn một trong hai chế độ Bluetooth dưới đây tùy theo nhu cầu của bạn:

Code ESP32 Classic Bluetooth (hoạt động với ứng dụng chỉ trên Android)

Lưu ý: Classic Bluetooth KHÔNG được hỗ trợ trên iOS. Nếu bạn cần hỗ trợ iOS, hãy sử dụng code BLE dưới đây.

  • Trong Arduino IDE, đi tới File Examples DIYables Bluetooth Esp32Bluetooth_Slider example, hoặc sao chép code trên và dán vào trình soạn thảo của Arduino IDE
/* * DIYables Bluetooth Library - ESP32 Classic Bluetooth Slider Example * Works with DIYables Bluetooth STEM app on Android * Note: Classic Bluetooth is NOT supported on iOS. Use BLE examples for iOS support. * * This example demonstrates the Bluetooth Slider feature: * - Control values using sliders (0-100) * - Support for dual sliders * - Configurable range and step * * Compatible Boards: * - ESP32 (all variants with Classic Bluetooth) * - ESP32-WROOM-32 * - ESP32-DevKitC * - ESP32-WROVER * * Note: Select "Huge APP (3MB No OTA/1MB SPIFFS)" partition scheme * in Arduino IDE: Tools > Partition Scheme * * Setup: * 1. Upload the sketch to your ESP32 * 2. Open Serial Monitor (115200 baud) to see connection status * 3. Use DIYables Bluetooth App to connect and control sliders * * Tutorial: https://diyables.io/bluetooth-app * Author: DIYables */ #include <DIYables_BluetoothServer.h> #include <DIYables_BluetoothSlider.h> #include <platforms/DIYables_Esp32Bluetooth.h> // Create Bluetooth instances DIYables_Esp32Bluetooth bluetooth("ESP32_Slider"); 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 (for LED brightness control example) const int PWM_PIN_1 = 16; const int PWM_PIN_2 = 17; // ESP32 LEDC PWM channels const int PWM_CHANNEL_1 = 0; const int PWM_CHANNEL_2 = 1; void setup() { Serial.begin(115200); delay(1000); Serial.println("DIYables Bluetooth - ESP32 Slider Example"); // Initialize PWM using ESP32 LEDC ledcSetup(PWM_CHANNEL_1, 5000, 8); // 5kHz, 8-bit resolution ledcSetup(PWM_CHANNEL_2, 5000, 8); ledcAttachPin(PWM_PIN_1, PWM_CHANNEL_1); ledcAttachPin(PWM_PIN_2, PWM_CHANNEL_2); // 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!"); // Send initial slider positions bluetoothSlider.send(currentSlider1, currentSlider2); }); bluetoothServer.setOnDisconnected([]() { Serial.println("Bluetooth disconnected!"); }); // Set up slider callback for value changes bluetoothSlider.onSliderValue([](int slider1, int slider2) { // Store the received values currentSlider1 = slider1; currentSlider2 = slider2; // Print slider values (0-100) 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); // Control LED brightness using ESP32 LEDC ledcWrite(PWM_CHANNEL_1, pwm1); ledcWrite(PWM_CHANNEL_2, pwm2); // TODO: Add your control logic here based on slider values // Examples: // - Servo control: myServo.write(map(slider1, 0, 100, 0, 180)); // - Motor speed: ledcWrite(MOTOR_CHANNEL, pwm1); // - Volume control: setVolume(slider1); // - Brightness control: setBrightness(slider2); }); // Optional: Handle requests for current slider values (when app loads) bluetoothSlider.onGetConfig([]() { // Send the stored slider values back to the app bluetoothSlider.send(currentSlider1, currentSlider2); Serial.print("App requested values - Sent: Slider1="); Serial.print(currentSlider1); Serial.print(", Slider2="); Serial.println(currentSlider2); }); // You can change slider configuration at runtime: // bluetoothSlider.setRange(0, 255); // Change range to 0-255 // bluetoothSlider.setStep(5); // Change step to 5 (coarser control) Serial.println("Waiting for Bluetooth connection..."); } void loop() { // Handle Bluetooth server communications bluetoothServer.loop(); delay(10); }
  • Nhấp nút Upload trên Arduino IDE để upload code lên ESP32
  • Mở Serial Monitor
  • Kiểm tra kết quả trên Serial Monitor. Nó trông như thế này:
COM6
Send
DIYables Bluetooth - ESP32 Slider Example Waiting for Bluetooth connection...
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Code ESP32 BLE (hoạt động với ứng dụng trên cả Android và iOS)

  • Trong Arduino IDE, đi tới File Examples DIYables Bluetooth Esp32BLE_Slider example, hoặc sao chép code trên và dán vào trình soạn thảo của Arduino IDE
/* * 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 * * Compatible Boards: * - ESP32-WROOM-32 * - ESP32-DevKitC * - ESP32-WROVER * - ESP32-S3 * - ESP32-C3 * - Any ESP32 board supporting BLE * * Note: Select "Huge APP (3MB No OTA/1MB SPIFFS)" partition scheme * in Arduino IDE: Tools > Partition Scheme * * Setup: * 1. Upload the sketch to your ESP32 * 2. Open Serial Monitor (115200 baud) to see connection status * 3. Use DIYables Bluetooth App to connect and control sliders * * 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 = 16; const int PWM_PIN_2 = 17; 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); }
  • Nhấp nút Upload trên Arduino IDE để upload code lên ESP32
  • Mở Serial Monitor
  • Kiểm tra kết quả trên Serial Monitor. Nó trông như thế này:
COM6
Send
DIYables Bluetooth - ESP32 BLE Slider Example Waiting for Bluetooth connection...
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Ứng dụng di động

  • Cài đặt ứng dụng DIYables Bluetooth trên smartphone của bạn: Android | iOS
  • Nếu bạn đang sử dụng ESP32 Classic Bluetooth code, bạn cần ghép nối ESP32 với điện thoại Android của bạn trước khi mở ứng dụng:
    • Đi tới Settings > Bluetooth trên điện thoại của bạn
    • Đảm bảo Bluetooth đã được bật
    • Điện thoại của bạn sẽ quét các thiết bị có sẵn
    • Tìm và nhấn "ESP32_Slider" trong danh sách các thiết bị có sẵn
    • Xác nhận yêu cầu ghép nối (không cần mã PIN)
    • Đợi cho đến khi nó hiển thị "Paired" dưới tên thiết bị
  • Nếu bạn đang sử dụng ESP32 BLE code, không cần ghép nối. Chỉ cần tiến tới bước tiếp theo.
  • Mở ứng dụng DIYables Bluetooth
  • Khi mở ứng dụng lần đầu tiên, nó sẽ yêu cầu quyền. Vui lòng cấp các quyền sau:
    • Quyền Nearby Devices (Android 12+) / quyền Bluetooth (iOS) - cần thiết để quét và kết nối với các thiết bị Bluetooth
    • Quyền Location (chỉ Android 11 trở xuống) - yêu cầu bởi các phiên bản Android cũ để quét thiết bị BLE
  • Đảm bảo Bluetooth đã được bật trên điện thoại của bạn
  • Trên màn hình chính, nhấn nút Connect. Ứng dụng sẽ quét cả thiết bị BLE và Classic Bluetooth.
diyables Bluetooth app - màn hình chính với nút scan
  • Tìm và nhấn thiết bị của bạn trong kết quả quét để kết nối:
    • Cho Classic Bluetooth: nhấn "ESP32_Slider"
    • Cho BLE: nhấn "ESP32BLE_Slider"
  • Sau khi kết nối, ứng dụng tự động quay về màn hình chính. Chọn ứng dụng Slider từ menu ứng dụng.
diyables Bluetooth app - màn hình chính với ứng dụng slider

Lưu ý: Bạn có thể nhấn biểu tượng cài đặt trên màn hình chính để ẩn/hiện các ứng dụng trên màn hình chính. Để biết thêm chi tiết, xem Hướng dẫn sử dụng DIYables Bluetooth App.

  • Di chuyển hai slider để điều khiển giá trị PWM (0-100)
diyables Bluetooth app - màn hình slider

Bây giờ hãy quay lại xem Serial Monitor trên Arduino IDE. Bạn sẽ thấy:

COM6
Send
Bluetooth connected! Slider 1: 50, Slider 2: 30 Slider 1: 75, Slider 2: 30 Slider 1: 75, Slider 2: 60 Slider 1: 100, Slider 2: 85
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Di chuyển các slider trong ứng dụng và xem phản hồi thời gian thực trong Serial Monitor

Tùy chỉnh sáng tạo - Điều chỉnh code cho dự án của bạn

Đặt giá trị mặc định cho Slider

Cấu hình vị trí ban đầu của slider:

// Giá trị slider hiện tại (0-100) int currentSlider1 = 25; // Mặc định 25% int currentSlider2 = 50; // Mặc định 50%

Tùy chỉnh phạm vi và bước của Slider

// Tạo instance ứng dụng Slider với phạm vi tùy chỉnh (min=0, max=255, step=5) DIYables_BluetoothSlider bluetoothSlider(0, 255, 5); // Hoặc thay đổi trong runtime: bluetoothSlider.setRange(0, 255); // Thay đổi phạm vi thành 0-255 bluetoothSlider.setStep(5); // Thay đổi bước thành 5 (điều khiển thô hơn) // Đọc cấu hình hiện tại: int currentMin = bluetoothSlider.getMin(); // Lấy giá trị tối thiểu hiện tại int currentMax = bluetoothSlider.getMax(); // Lấy giá trị tối đa hiện tại int currentStep = bluetoothSlider.getStep(); // Lấy giá trị bước hiện tại

Xử lý yêu cầu cấu hình từ ứng dụng

Khi ứng dụng kết nối và mở màn hình Slider, nó yêu cầu cấu hình slider từ ESP32. Bạn có thể sử dụng callback onGetConfig() để gửi giá trị slider hiện tại tới ứng dụng vào thời điểm đó:

bluetoothSlider.onGetConfig([]() { // Điều này được gọi khi ứng dụng yêu cầu cấu hình slider // Gửi giá trị slider hiện tại để ứng dụng hiển thị chính xác bluetoothSlider.send(currentSlider1, currentSlider2); Serial.println("App requested config - sent current values"); });

Gửi giá trị tới ứng dụng

Bạn có thể gửi giá trị slider từ ESP32 tới ứng dụng (ví dụ, để cập nhật vị trí slider của ứng dụng):

// Gửi cả hai giá trị slider tới ứng dụng bluetoothSlider.send(currentSlider1, currentSlider2); // Gửi một giá trị đơn (áp dụng cho cả hai slider) bluetoothSlider.send(50);

Xử lý sự kiện kết nối

Bạn có thể phát hiện khi ứng dụng kết nối hoặc ngắt kết nối khỏi ESP32:

// Được gọi khi ứng dụng kết nối tới ESP32 bluetoothServer.setOnConnected([]() { Serial.println("Bluetooth connected!"); // Gửi giá trị slider hiện tại tới ứng dụng bluetoothSlider.send(currentSlider1, currentSlider2); }); // Được gọi khi ứng dụng ngắt kết nối khỏi ESP32 bluetoothServer.setOnDisconnected([]() { Serial.println("Bluetooth disconnected!"); // Tùy chọn: dừng motor, reset đầu ra, v.v. }); // Kiểm tra trạng thái kết nối ở bất cứ đâu trong code của bạn if (bluetoothServer.isConnected()) { // Làm gì đó chỉ khi được kết nối }

Cách sử dụng Slider

Điều khiển giao diện ứng dụng

Giao diện slider trong ứng dụng DIYables Bluetooth cung cấp:

  • Slider 1: Slider điều khiển đầu tiên với hiển thị giá trị
  • Slider 2: Slider điều khiển thứ hai với hiển thị giá trị
  • Hiển thị giá trị: Giá trị số thời gian thực cho cả hai slider

Phạm vi giá trị

Mỗi slider cung cấp:

  • Phạm vi mặc định: 0 đến 100
  • Có thể cấu hình: Phạm vi và bước có thể được tùy chỉnh trong code
  • Ánh xạ PWM: Dễ dàng ánh xạ tới 0-255 cho analogWrite()

Ví dụ lập trình

Trình xử lý Slider cơ bản

void setup() { // Thiết lập callback slider cho thay đổi giá trị bluetoothSlider.onSliderValue([](int slider1, int slider2) { // Lưu trữ giá trị nhận được currentSlider1 = slider1; currentSlider2 = slider2; // In giá trị slider Serial.println("Slider 1: " + String(slider1) + ", Slider 2: " + String(slider2)); // Thêm logic điều khiển của bạn ở đây }); }

Điều khiển độ sáng LED (ví dụ BLE)

// Chân đầu ra PWM const int PWM_PIN_1 = 16; const int PWM_PIN_2 = 17; void setup() { // Cấu hình chân PWM là đầu ra pinMode(PWM_PIN_1, OUTPUT); pinMode(PWM_PIN_2, OUTPUT); bluetoothSlider.onSliderValue([](int slider1, int slider2) { currentSlider1 = slider1; currentSlider2 = slider2; // Ánh xạ giá trị slider (0-100) tới phạm vi PWM (0-255) int pwm1 = map(slider1, 0, 100, 0, 255); int pwm2 = map(slider2, 0, 100, 0, 255); // Điều khiển độ sáng LED analogWrite(PWM_PIN_1, pwm1); analogWrite(PWM_PIN_2, pwm2); Serial.println("LED1 Brightness: " + String(pwm1) + ", LED2 Brightness: " + String(pwm2)); }); }

Điều khiển độ sáng LED (Classic Bluetooth với ESP32 LEDC)

// Chân đầu ra PWM const int PWM_PIN_1 = 16; const int PWM_PIN_2 = 17; // Kênh PWM ESP32 LEDC const int PWM_CHANNEL_1 = 0; const int PWM_CHANNEL_2 = 1; void setup() { // Khởi tạo PWM sử dụng ESP32 LEDC ledcSetup(PWM_CHANNEL_1, 5000, 8); // 5kHz, độ phân giải 8-bit ledcSetup(PWM_CHANNEL_2, 5000, 8); ledcAttachPin(PWM_PIN_1, PWM_CHANNEL_1); ledcAttachPin(PWM_PIN_2, PWM_CHANNEL_2); bluetoothSlider.onSliderValue([](int slider1, int slider2) { currentSlider1 = slider1; currentSlider2 = slider2; // Ánh xạ giá trị slider (0-100) tới phạm vi PWM (0-255) int pwm1 = map(slider1, 0, 100, 0, 255); int pwm2 = map(slider2, 0, 100, 0, 255); // Điều khiển độ sáng LED sử dụng ESP32 LEDC ledcWrite(PWM_CHANNEL_1, pwm1); ledcWrite(PWM_CHANNEL_2, pwm2); Serial.println("LED1 Brightness: " + String(pwm1) + ", LED2 Brightness: " + String(pwm2)); }); }

Điều khiển vị trí Servo

#include <ESP32Servo.h> Servo servo1, servo2; void setup() { // Gắn servo vào chân servo1.attach(16); servo2.attach(17); bluetoothSlider.onSliderValue([](int slider1, int slider2) { currentSlider1 = slider1; currentSlider2 = slider2; // Ánh xạ giá trị slider (0-100) tới góc servo (0-180°) int angle1 = map(slider1, 0, 100, 0, 180); int angle2 = map(slider2, 0, 100, 0, 180); // Di chuyển servo tới vị trí tính toán servo1.write(angle1); servo2.write(angle2); Serial.println("Servo1: " + String(angle1) + "°, Servo2: " + String(angle2) + "°"); }); }

Điều khiển tốc độ motor

// Chân driver motor const int MOTOR1_PWM = 16; // Điều khiển tốc độ motor 1 const int MOTOR1_DIR1 = 18; // Chân hướng motor 1 - 1 const int MOTOR1_DIR2 = 19; // Chân hướng motor 1 - 2 const int MOTOR2_PWM = 17; // Điều khiển tốc độ motor 2 const int MOTOR2_DIR1 = 21; // Chân hướng motor 2 - 1 const int MOTOR2_DIR2 = 22; // Chân hướng motor 2 - 2 void setup() { // Cấu hình chân motor pinMode(MOTOR1_PWM, OUTPUT); pinMode(MOTOR1_DIR1, OUTPUT); pinMode(MOTOR1_DIR2, OUTPUT); pinMode(MOTOR2_PWM, OUTPUT); pinMode(MOTOR2_DIR1, OUTPUT); pinMode(MOTOR2_DIR2, OUTPUT); // Đặt hướng motor ban đầu (tiến) digitalWrite(MOTOR1_DIR1, HIGH); digitalWrite(MOTOR1_DIR2, LOW); digitalWrite(MOTOR2_DIR1, HIGH); digitalWrite(MOTOR2_DIR2, LOW); bluetoothSlider.onSliderValue([](int slider1, int slider2) { currentSlider1 = slider1; currentSlider2 = slider2; // Ánh xạ giá trị slider (0-100) tới phạm vi PWM (0-255) int pwm1 = map(slider1, 0, 100, 0, 255); int pwm2 = map(slider2, 0, 100, 0, 255); // Điều khiển tốc độ motor analogWrite(MOTOR1_PWM, pwm1); analogWrite(MOTOR2_PWM, pwm2); Serial.println("Motor1: " + String(slider1) + "%, " + "Motor2: " + String(slider2) + "%"); }); }

Điều khiển màu LED RGB

// Chân LED RGB const int RED_PIN = 16; const int GREEN_PIN = 17; const int BLUE_PIN = 18; void setup() { pinMode(RED_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); bluetoothSlider.onSliderValue([](int slider1, int slider2) { currentSlider1 = slider1; currentSlider2 = slider2; // Sử dụng slider để điều khiển các thành phần RGB // Slider 1 điều khiển cường độ đỏ // Slider 2 điều khiển cường độ xanh dương // Xanh lá được tính toán dựa trên cả hai slider int redValue = map(slider1, 0, 100, 0, 255); int blueValue = map(slider2, 0, 100, 0, 255); int greenValue = (redValue + blueValue) / 2; analogWrite(RED_PIN, redValue); analogWrite(GREEN_PIN, greenValue); analogWrite(BLUE_PIN, blueValue); Serial.println("RGB - R:" + String(redValue) + " G:" + String(greenValue) + " B:" + String(blueValue)); }); }

Kỹ thuật lập trình nâng cao

Làm mịn giá trị

class SliderSmoother { private: int currentValue = 0; int targetValue = 0; unsigned long lastUpdate = 0; const int SMOOTH_RATE = 2; // Thay đổi mỗi chu kỳ cập nhật public: void setTarget(int target) { targetValue = target; } int getCurrentValue() { return currentValue; } bool update() { if (millis() - lastUpdate > 10) { // Cập nhật mỗi 10ms bool changed = false; if (currentValue < targetValue) { currentValue = min(currentValue + SMOOTH_RATE, targetValue); changed = true; } else if (currentValue > targetValue) { currentValue = max(currentValue - SMOOTH_RATE, targetValue); changed = true; } lastUpdate = millis(); return changed; } return false; } }; SliderSmoother smoother1, smoother2; void setup() { bluetoothSlider.onSliderValue([](int slider1, int slider2) { // Đặt giá trị mục tiêu để chuyển tiếp mượt mà smoother1.setTarget(slider1); smoother2.setTarget(slider2); }); } void loop() { bluetoothServer.loop(); // Cập nhật giá trị được làm mịn bool changed1 = smoother1.update(); bool changed2 = smoother2.update(); if (changed1 || changed2) { // Ánh xạ giá trị được làm mịn (0-100) tới PWM (0-255) và áp dụng analogWrite(16, map(smoother1.getCurrentValue(), 0, 100, 0, 255)); analogWrite(17, map(smoother2.getCurrentValue(), 0, 100, 0, 255)); } }

Điều khiển dựa trên ngưỡng

void setupThresholdControl() { bluetoothSlider.onSliderValue([](int slider1, int slider2) { currentSlider1 = slider1; currentSlider2 = slider2; // Điều khiển dựa trên ngưỡng cho đầu ra rời rạc const int LOW_THRESHOLD = 33; const int MEDIUM_THRESHOLD = 66; // Điều khiển đầu ra digital dựa trên ngưỡng slider 1 if (slider1 < LOW_THRESHOLD) { // Mức thấp: Tắt tất cả đầu ra digitalWrite(18, LOW); digitalWrite(19, LOW); digitalWrite(21, LOW); } else if (slider1 < MEDIUM_THRESHOLD) { // Mức trung bình: Bật đầu ra đầu tiên digitalWrite(18, HIGH); digitalWrite(19, LOW); digitalWrite(21, LOW); } else { // Mức cao: Bật tất cả đầu ra digitalWrite(18, HIGH); digitalWrite(19, HIGH); digitalWrite(21, HIGH); } // Sử dụng slider 2 cho điều khiển PWM analog analogWrite(16, map(slider2, 0, 100, 0, 255)); }); }