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) và 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.
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
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.
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.
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 instancesDIYables_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 valuesint currentSlider1 = 0;int currentSlider2 = 0;// PWM output pins (for LED brightness control example)constint PWM_PIN_1 = 16;constint PWM_PIN_2 = 17;// ESP32 LEDC PWM channelsconstint PWM_CHANNEL_1 = 0;constint PWM_CHANNEL_2 = 1;voidsetup() {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...");}voidloop() {// 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:
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
DIYables Bluetooth - ESP32 Slider Example
Waiting for Bluetooth connection...
Ln 11, Col 1
ESP32 Dev Module on COM15
2
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 Configurationconst 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 instancesDIYables_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 valuesint currentSlider1 = 0;int currentSlider2 = 0;// PWM output pinsconstint PWM_PIN_1 = 16;constint PWM_PIN_2 = 17;voidsetup() {Serial.begin(115200);delay(1000);Serial.println("DIYables Bluetooth - ESP32 BLE Slider Example");// Initialize PWM pinspinMode(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...");}voidloop() { 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:
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
New Line
9600 baud
DIYables Bluetooth - ESP32 BLE Slider Example
Waiting for Bluetooth connection...
Ln 11, Col 1
ESP32 Dev Module on COM15
2
Ứ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.
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.
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)
Bây giờ hãy quay lại xem Serial Monitor trên Arduino IDE. Bạn sẽ thấy:
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
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-255bluetoothSlider.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ạiint currentMax = bluetoothSlider.getMax(); // Lấy giá trị tối đa hiện tạiint 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ụngbluetoothSlider.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 ESP32bluetoothServer.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 ESP32bluetoothServer.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ạnif (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
voidsetup() {// 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ị sliderSerial.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 PWMconstint PWM_PIN_1 = 16;constint PWM_PIN_2 = 17;voidsetup() {// Cấu hình chân PWM là đầu rapinMode(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 LEDanalogWrite(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 PWMconstint PWM_PIN_1 = 16;constint PWM_PIN_2 = 17;// Kênh PWM ESP32 LEDCconstint PWM_CHANNEL_1 = 0;constint PWM_CHANNEL_2 = 1;voidsetup() {// 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;voidsetup() {// 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 motorconstint MOTOR1_PWM = 16; // Điều khiển tốc độ motor 1constint MOTOR1_DIR1 = 18; // Chân hướng motor 1 - 1constint MOTOR1_DIR2 = 19; // Chân hướng motor 1 - 2constint MOTOR2_PWM = 17; // Điều khiển tốc độ motor 2constint MOTOR2_DIR1 = 21; // Chân hướng motor 2 - 1constint MOTOR2_DIR2 = 22; // Chân hướng motor 2 - 2voidsetup() {// Cấu hình chân motorpinMode(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 độ motoranalogWrite(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 RGBconstint RED_PIN = 16;constint GREEN_PIN = 17;constint BLUE_PIN = 18;voidsetup() {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 sliderint 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;unsignedlong lastUpdate = 0;constint SMOOTH_RATE = 2; // Thay đổi mỗi chu kỳ cập nhậtpublic:void setTarget(int target) { targetValue = target; }int getCurrentValue() {return currentValue; }boolupdate() {if (millis() - lastUpdate > 10) { // Cập nhật mỗi 10msbool changed = false;if (currentValue < targetValue) { currentValue = min(currentValue + SMOOTH_RATE, targetValue); changed = true; } elseif (currentValue > targetValue) { currentValue = max(currentValue - SMOOTH_RATE, targetValue); changed = true; } lastUpdate = millis();return changed; }returnfalse; }};SliderSmoother smoother1, smoother2;voidsetup() { 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); });}voidloop() { bluetoothServer.loop();// Cập nhật giá trị được làm mịnbool 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ụnganalogWrite(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ạcconstint LOW_THRESHOLD = 33;constint MEDIUM_THRESHOLD = 66;// Điều khiển đầu ra digital dựa trên ngưỡng slider 1if (slider1 < LOW_THRESHOLD) {// Mức thấp: Tắt tất cả đầu radigitalWrite(18, LOW);digitalWrite(19, LOW);digitalWrite(21, LOW); } elseif (slider1 < MEDIUM_THRESHOLD) {// Mức trung bình: Bật đầu ra đầu tiêndigitalWrite(18, HIGH);digitalWrite(19, LOW);digitalWrite(21, LOW); } else {// Mức cao: Bật tất cả đầu radigitalWrite(18, HIGH);digitalWrite(19, HIGH);digitalWrite(21, HIGH); }// Sử dụng slider 2 cho điều khiển PWM analoganalogWrite(16, map(slider2, 0, 100, 0, 255)); });}