Arduino UNO R4 WiFi Bluetooth Slider Example Hướng Dẫn Điều Khiển Dual Slider qua BLE

Tổng Quan

Ví dụ Bluetooth Slider cung cấp điều khiển dual slider có thể truy cập thông qua ứng dụng DIYables Bluetooth STEM. Được thiết kế cho Arduino UNO R4 WiFi sử dụng BLE (Bluetooth Low Energy) để điều khiển hai giá trị độc lập với phạm vi và bước có thể cấu hình. Hoàn hảo cho điều khiển độ sáng LED, tốc độ motor, định vị servo và bất kỳ ứng dụng nào cần đầu vào số có thể điều chỉnh.

Lưu ý: Arduino UNO R4 WiFi chỉ hỗ trợ BLE (Bluetooth Low Energy). Nó không hỗ trợ Classic Bluetooth. Ứng dụng DIYables Bluetooth hỗ trợ cả BLE và Classic Bluetooth trên Android, và BLE trên iOS. Vì board này sử dụng BLE, ứng dụng hoạt động trên cả Android và iOS.

Arduino UNO R4 WiFi Bluetooth slider example - hướng dẫn Điều khiển dual slider qua ble

Tính Năng

  • Dual Sliders: Hai slider điều khiển độc lập
  • Phạm Vi Có Thể Cấu Hình: Thiết lập giá trị tối thiểu, tối đa và bước
  • Cập Nhật Thời Gian Thực: Giá trị slider được gửi ngay lập tức khi thay đổi
  • Sẵn Sàng PWM: Ánh xạ giá trị slider trực tiếp tới PWM output
  • Hoạt Động Trên Android & iOS: BLE được hỗ trợ trên cả hai nền tảng
  • Không Cần Ghép Đôi: BLE tự động kết nối mà không cần ghép đôi thủ công
  • Tiết Kiệm Điện: BLE tiêu thụ ít điện hơn Classic Bluetooth

Phần Cứng Cần Thiết

1×Arduino UNO R4 WiFi
1×Alternatively, DIYables STEM V4 IoT
1×(Tùy chọn) DIYables STEM V4 IoT
1×Dây USB Type-C
1×breadboard
1×Dây Jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino UNO R4
1×(Khuyến nghị) Breadboard Shield for Arduino UNO R4
1×(Khuyến nghị) Enclosure for Arduino UNO R4
1×(Khuyến nghị) Power Splitter for Arduino UNO R4
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V4 IoT Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Code Arduino UNO R4 WiFi

Các Bước Thực Hiện

Thực hiện theo các hướng dẫn này từng bước:

  • Nếu đây là lần đầu tiên bạn sử dụng Arduino UNO R4 WiFi, hãy tham khảo Arduino UNO R4 - Cài Đặt Phần Mềm.
  • Kết nối board Arduino UNO R4 WiFi với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn board Arduino UNO R4 WiFi và COM port phù hợp.
  • Điều hướng tới biểu tượng Libraries ở 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.
Arduino UNO R4 diyables Bluetooth 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.
Arduino UNO R4 diyables Bluetooth dependency

BLE Code

  • Trên Arduino IDE, Vào File Examples DIYables Bluetooth ArduinoBLE_Slider example, hoặc sao chép code trên và dán vào editor của Arduino IDE
/* * DIYables Bluetooth Library - Bluetooth 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: * - Arduino UNO R4 WiFi * - Arduino Nano 33 BLE / BLE Sense * - Arduino Nano 33 IoT * - Arduino MKR WiFi 1010 * - Arduino Nano RP2040 Connect * - Any board supporting the ArduinoBLE library * * Setup: * 1. Upload the sketch to your Arduino * 2. Open Serial Monitor 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_ArduinoBLE.h> // BLE Configuration const char* DEVICE_NAME = "Arduino_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_ArduinoBLE 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 (for LED brightness control example) const int PWM_PIN_1 = 9; const int PWM_PIN_2 = 10; void setup() { Serial.begin(9600); while (!Serial); Serial.println("DIYables Bluetooth - 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!"); // 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 analogWrite(PWM_PIN_1, pwm1); analogWrite(PWM_PIN_2, pwm2); // TODO: Add your control logic here based on slider values // Examples: // - Servo control: servo.write(map(slider1, 0, 100, 0, 180)); // - Motor speed: analogWrite(MOTOR_PIN, 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(); // Optional: Update slider positions based on sensor input // Example: Send current values periodically /* static unsigned long lastUpdate = 0; if (millis() - lastUpdate >= 5000) { lastUpdate = millis(); bluetoothSlider.send(currentSlider1, currentSlider2); } */ delay(10); }
  • Nhấp nút Upload trên Arduino IDE để upload code lên Arduino UNO R4 WiFi
  • Mở Serial Monitor
  • Kiểm tra kết quả trên Serial Monitor. Nó sẽ trông như sau:
COM6
Send
DIYables Bluetooth - 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

Lưu ý: Ứng dụng DIYables Bluetooth hỗ trợ cả BLE và Classic Bluetooth trên Android, và BLE trên iOS. Vì Arduino UNO R4 WiFi sử dụng BLE, ứng dụng hoạt động trên cả Android và iOS. Không cần ghép đôi thủ công cho BLE — chỉ cần quét và kết nối.

  • 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 thiết bị Bluetooth
    • Quyền Location (chỉ Android 11 trở xuống) - được 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ác thiết bị BLE.
diyables Bluetooth app - home screen with scan nút nhấn
  • Tìm và nhấn "Arduino_Slider" trong kết quả quét để kết nối.
  • 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 - home screen with slider app

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 Ứng Dụng DIYables Bluetooth.

  • Kéo các slider để thay đổi giá trị
diyables Bluetooth app - slider screen

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

COM6
Send
Bluetooth connected! Slider 1: 50, Slider 2: 0 Slider 1: 75, Slider 2: 0 Slider 1: 100, Slider 2: 25
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Điều chỉnh các slider và xem các giá trị thay đổ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

Cấu Hình Phạm Vi Slider

// Constructor: DIYables_BluetoothSlider(min, max, step) DIYables_BluetoothSlider bluetoothSlider(0, 100, 1); // Thay đổi phạm vi lúc runtime bluetoothSlider.setRange(0, 255); // Thay đổi kích thước bước bluetoothSlider.setStep(5); // Điều khiển thô hơn // Đọc cấu hình int minVal = bluetoothSlider.getMin(); int maxVal = bluetoothSlider.getMax(); int step = bluetoothSlider.getStep();

Xử Lý Thay Đổi Slider

bluetoothSlider.onSliderValue([](int slider1, int slider2) { currentSlider1 = slider1; currentSlider2 = slider2; Serial.print("Slider 1: "); Serial.print(slider1); Serial.print(", Slider 2: "); Serial.println(slider2); // Ánh xạ tới PWM và điều khiển output int pwm1 = map(slider1, 0, 100, 0, 255); analogWrite(PWM_PIN_1, pwm1); });

Gửi Giá Trị Hiện Tại Tới App

bluetoothSlider.onGetConfig([]() { bluetoothSlider.send(currentSlider1, currentSlider2); }); // Hoặc gửi bất kỳ lúc nào: bluetoothSlider.send(50, 75); // Thiết lập cả hai slider

Xử Lý Sự Kiện Kết Nối

bluetoothServer.setOnConnected([]() { Serial.println("Bluetooth connected!"); bluetoothSlider.send(currentSlider1, currentSlider2); }); bluetoothServer.setOnDisconnected([]() { Serial.println("Bluetooth disconnected!"); });

Ví Dụ Lập Trình

Điều Khiển Độ Sáng 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); });

Điều Khiển Servo

#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("°"); }); }

Tốc Độ Motor Với Hướng

const int MOTOR_SPEED_PIN = 9; const int MOTOR_DIR_PIN = 8; bluetoothSlider.onSliderValue([](int slider1, int slider2) { // Slider 1: tốc độ (0-100%) // Slider 2: ngưỡng hướng (dưới 50 = lùi, trên 50 = tiến) 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"); });

Kỹ Thuật Lập Trình Nâng Cao

Slider Với Vùng Chết

bluetoothSlider.onSliderValue([](int slider1, int slider2) { // Thêm vùng chết quanh tâm (45-55 = dừng) 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); } });

Giới Hạn Tốc Độ

unsigned long lastSliderAction = 0; const unsigned long SLIDER_COOLDOWN = 50; // tối thiểu 50ms bluetoothSlider.onSliderValue([](int slider1, int slider2) { if (millis() - lastSliderAction >= SLIDER_COOLDOWN) { lastSliderAction = millis(); // Xử lý giá trị slider analogWrite(PWM_PIN, map(slider1, 0, 100, 0, 255)); } });

Khắc Phục Sự Cố

Các Vấn Đề Thường Gặp

1. Không thể tìm thấy thiết bị trong ứng dụng

  • Đảm bảo Arduino UNO R4 WiFi được cấp nguồn và sketch đã được upload
  • Đảm bảo Bluetooth của điện thoại đã được bật
  • Trên Android 11 trở xuống, cũng bật dịch vụ Vị trí
  • Thử khởi động lại Bluetooth trên điện thoại của bạn

2. Không nhận được thay đổi của slider

  • Kiểm tra trạng thái kết nối Bluetooth trong ứng dụng
  • Xác minh callback onSliderValue được thiết lập đúng
  • Kiểm tra Serial Monitor cho bất kỳ thông báo lỗi nào

3. PWM output không hoạt động

  • Xác minh chân hỗ trợ PWM (các chân 3, 5, 6, 9, 10, 11 trên UNO R4)
  • Kiểm tra kết nối dây
  • Thử với sketch analogWrite đơn giản trước

4. Slider reset về 0 khi kết nối lại

  • Triển khai callback onGetConfig để gửi giá trị đã lưu khi kết nối lại
  • Lưu giá trị slider trong biến tồn tại qua các kết nối

5. Kết nối thường xuyên bị ngắt

  • Di chuyển gần Arduino hơn (giảm khoảng cách)
  • Kiểm tra nhiễu từ các thiết bị BLE khác
  • Đảm bảo nguồn USB ổn định

6. Upload thất bại hoặc board không được nhận dạng

  • Cài đặt gói board Arduino UNO R4 mới nhất qua Board Manager
  • Thử cáp USB hoặc cổng khác
  • Nhấn nút reset trên board trước khi upload

Ý Tưởng Dự Án

Điều Khiển Ánh Sáng

  • Bộ điều khiển độ sáng LED kép
  • Bộ trộn màu LED RGB (sử dụng hai slider cho hue/saturation)
  • Độ sáng LED strip và nhiệt độ màu
  • Dimmer ánh sáng sân khấu

Điều Khiển Motor

  • Bộ điều khiển tốc độ motor DC
  • Định vị servo kép
  • Giá đỡ camera pan-tilt
  • Tốc độ bánh xe robot

Âm Thanh

  • Điều khiển âm lượng
  • Tần số và thời lượng âm thanh
  • Dải equalizer

Các Bước Tiếp Theo

Sau khi thành thạo ví dụ Bluetooth Slider, hãy thử:

  1. Bluetooth Joystick - Cho điều khiển hướng 2D
  2. Bluetooth Rotator - Cho điều khiển góc/quay
  3. Bluetooth Temperature - Cho hiển thị đồng hồ nhiệt độ
  4. Multiple Bluetooth Apps - Kết hợp slider với các ứng dụng khác

Hỗ Trợ

Để được trợ giúp thêm: