Arduino UNO R4 WiFi Bluetooth Multiple Apps Beispiel - All-in-One BLE Tutorial
Das Bluetooth Multiple Apps Beispiel demonstriert die gleichzeitige Ausführung von 9 Bluetooth-Apps auf einem einzigen Arduino UNO R4 WiFi mit BLE. Entwickelt für Arduino UNO R4 WiFi unter Verwendung von BLE (Bluetooth Low Energy), um Monitor, Chat, Slider, Joystick, Temperature, Plotter, Table, Analog Gauge und Rotator in einem leistungsstarken Sketch zu kombinieren. Alle Apps teilen sich eine einzige BLE-Verbindung und können miteinander interagieren. Perfekt für umfassende Dashboards, komplexe IoT-Projekte und das Erlernen mehrerer App-Typen auf einmal.
Hinweis: Der Arduino UNO R4 WiFi unterstützt nur BLE (Bluetooth Low Energy). Er unterstützt kein klassisches Bluetooth. Die DIYables Bluetooth App unterstützt sowohl BLE als auch klassisches Bluetooth auf Android und BLE auf iOS. Da dieses Board BLE verwendet, funktioniert die App auf sowohl Android als auch iOS.
9 Apps in Einer: Monitor, Chat, Slider, Joystick, Temperature, Plotter, Table, Analog Gauge, Rotator
App-übergreifende Interaktion: Slider-Wert aktualisiert Gauge und Table, Joystick aktualisiert Table, etc.
Einzelne BLE-Verbindung: Alle Apps teilen sich effizient eine Verbindung
Echtzeit-Updates: Jede App aktualisiert in ihrem eigenen Intervall
Umfassendes Dashboard: Alle Daten von einem Gerät aus anzeigen
Funktioniert auf Android & iOS: BLE wird auf beiden Plattformen unterstützt
Kein Pairing erforderlich: BLE verbindet sich automatisch ohne manuelles Pairing
| App | Beschreibung | Update-Intervall |
| Monitor | Textbasierte Statusanzeige | 5 Sekunden |
| Chat | Bidirektionale Textnachrichten | Bei Bedarf |
| Slider | Wertsteuerung (0-255) | Bei Änderung |
| Joystick | 2D-Positionssteuerung | Bei Änderung |
| Temperature | Temperatursensor (-10 bis 50°C) | 2 Sekunden |
| Plotter | Echtzeit-Datendiagramm | 100ms |
| Table | Strukturierte Daten (10 Zeilen) | 5 Sekunden |
| Analog Gauge | Zifferblatt-Anzeige (0-100%) | 3 Sekunden |
| Rotator | Winkelsteuerung (kontinuierlich) | Bei Änderung |
Oder Sie können die folgenden Kits kaufen:
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.
Folgen Sie diesen Anweisungen Schritt für Schritt:
Verbinden Sie das Arduino UNO R4 WiFi Board mit Ihrem Computer über ein USB-Kabel.
Starten Sie die Arduino IDE auf Ihrem Computer.
Wählen Sie das Arduino UNO R4 WiFi Board und den entsprechenden COM-Port.
Navigieren Sie zum Libraries Symbol in der linken Leiste der Arduino IDE.
Suchen Sie nach "DIYables Bluetooth", dann finden Sie die DIYables Bluetooth Bibliothek von DIYables
Klicken Sie auf den Install Button, um die Bibliothek zu installieren.
Sie werden gefragt, ob Sie einige andere Bibliotheksabhängigkeiten installieren möchten
Klicken Sie auf den Install All Button, um alle Bibliotheksabhängigkeiten zu installieren.

#include <DIYables_BluetoothServer.h>
#include <DIYables_BluetoothMonitor.h>
#include <DIYables_BluetoothChat.h>
#include <DIYables_BluetoothSlider.h>
#include <DIYables_BluetoothJoystick.h>
#include <DIYables_BluetoothTemperature.h>
#include <DIYables_BluetoothPlotter.h>
#include <DIYables_BluetoothTable.h>
#include <DIYables_BluetoothAnalogGauge.h>
#include <DIYables_BluetoothRotator.h>
#include <platforms/DIYables_ArduinoBLE.h>
const char* DEVICE_NAME = "DIYables Multi-App";
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";
DIYables_ArduinoBLE bluetooth(DEVICE_NAME, SERVICE_UUID, TX_UUID, RX_UUID);
DIYables_BluetoothServer bluetoothServer(bluetooth);
DIYables_BluetoothMonitor bluetoothMonitor;
DIYables_BluetoothChat bluetoothChat;
DIYables_BluetoothSlider bluetoothSlider(0, 255, 1);
DIYables_BluetoothJoystick bluetoothJoystick(false, 5);
DIYables_BluetoothTemperature bluetoothTemperature(-10.0, 50.0, "°C");
DIYables_BluetoothPlotter bluetoothPlotter;
DIYables_BluetoothTable bluetoothTable;
DIYables_BluetoothAnalogGauge bluetoothGauge(0.0, 100.0, "%");
DIYables_BluetoothRotator bluetoothRotator(ROTATOR_MODE_CONTINUOUS);
int currentSlider1 = 128;
int currentSlider2 = 64;
int currentJoystickX = 0;
int currentJoystickY = 0;
float currentTemperature = 25.0;
float currentGaugeValue = 50.0;
float currentRotatorAngle = 0.0;
int messageCount = 0;
unsigned long lastMonitorUpdate = 0;
unsigned long lastTempUpdate = 0;
unsigned long lastPlotUpdate = 0;
unsigned long lastTableUpdate = 0;
unsigned long lastGaugeUpdate = 0;
float plotPhase = 0;
void setup() {
Serial.begin(9600);
delay(1000);
Serial.println("DIYables Bluetooth - Multiple Apps Example");
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
bluetoothServer.begin();
bluetoothServer.addApp(&bluetoothMonitor);
bluetoothServer.addApp(&bluetoothChat);
bluetoothServer.addApp(&bluetoothSlider);
bluetoothServer.addApp(&bluetoothJoystick);
bluetoothServer.addApp(&bluetoothTemperature);
bluetoothServer.addApp(&bluetoothPlotter);
bluetoothServer.addApp(&bluetoothTable);
bluetoothServer.addApp(&bluetoothGauge);
bluetoothServer.addApp(&bluetoothRotator);
Serial.print("Registered apps: ");
Serial.println(bluetoothServer.getAppCount());
bluetoothPlotter.setPlotTitle("Sensor Data");
bluetoothPlotter.setAxisLabels("Time", "Value");
bluetoothPlotter.setYAxisRange(-1.5, 1.5);
bluetoothPlotter.setMaxSamples(100);
bluetoothPlotter.setLegendLabels("Sine", "Cosine", "Random");
bluetoothTable.addRow("Status");
bluetoothTable.addRow("Uptime");
bluetoothTable.addRow("Slider 1");
bluetoothTable.addRow("Slider 2");
bluetoothTable.addRow("Joystick X");
bluetoothTable.addRow("Joystick Y");
bluetoothTable.addRow("Temperature");
bluetoothTable.addRow("Gauge Value");
bluetoothTable.addRow("Rotator Angle");
bluetoothTable.addRow("Messages");
setupCallbacks();
Serial.println("Waiting for Bluetooth connection...");
}
void setupCallbacks() {
bluetoothServer.setOnConnected([]() {
Serial.println("Bluetooth connected!");
digitalWrite(LED_BUILTIN, HIGH);
bluetoothMonitor.send("=== DIYables Multi-App Connected ===");
bluetoothMonitor.send("All apps are ready!");
bluetoothChat.send("Hello! Arduino Multi-App is connected.");
});
bluetoothServer.setOnDisconnected([]() {
Serial.println("Bluetooth disconnected!");
digitalWrite(LED_BUILTIN, LOW);
});
bluetoothMonitor.onMonitorMessage([](const String& message) {
Serial.println("Monitor cmd: " + message);
if (message == "HELP") {
bluetoothMonitor.send("Commands: STATUS, HELP, LED_ON, LED_OFF");
} else if (message == "STATUS") {
bluetoothMonitor.send("Slider1=" + String(currentSlider1) + " Slider2=" + String(currentSlider2));
bluetoothMonitor.send("Joystick X=" + String(currentJoystickX) + " Y=" + String(currentJoystickY));
bluetoothMonitor.send("Temp=" + String(currentTemperature, 1) + "°C");
bluetoothMonitor.send("Gauge=" + String(currentGaugeValue, 1) + "%");
bluetoothMonitor.send("Rotator=" + String(currentRotatorAngle, 0) + "°");
} else if (message == "LED_ON") {
digitalWrite(LED_BUILTIN, HIGH);
bluetoothMonitor.send("LED turned ON");
} else if (message == "LED_OFF") {
digitalWrite(LED_BUILTIN, LOW);
bluetoothMonitor.send("LED turned OFF");
} else {
bluetoothMonitor.send("Unknown: " + message + " (type HELP)");
}
});
bluetoothChat.onChatMessage([](const String& message) {
Serial.println("Chat: " + message);
bluetoothChat.send("Echo: " + message);
if (message.equalsIgnoreCase("ping")) {
bluetoothChat.send("pong!");
} else if (message.equalsIgnoreCase("status")) {
bluetoothChat.send("Uptime: " + String(millis() / 1000) + "s, Apps: " + String(bluetoothServer.getAppCount()));
}
});
bluetoothSlider.onSliderValue([](int slider1, int slider2) {
currentSlider1 = slider1;
currentSlider2 = slider2;
Serial.print("Slider 1: "); Serial.print(slider1);
Serial.print(", Slider 2: "); Serial.println(slider2);
currentGaugeValue = map(slider1, 0, 255, 0, 100);
bluetoothGauge.send(currentGaugeValue);
bluetoothTable.sendValueUpdate("Slider 1", String(slider1));
bluetoothTable.sendValueUpdate("Slider 2", String(slider2));
bluetoothTable.sendValueUpdate("Gauge Value", String(currentGaugeValue, 1) + "%");
});
bluetoothSlider.onGetConfig([]() {
bluetoothSlider.send(currentSlider1, currentSlider2);
});
bluetoothJoystick.onJoystickValue([](int x, int y) {
currentJoystickX = x;
currentJoystickY = y;
Serial.print("Joystick X: "); Serial.print(x);
Serial.print(", Y: "); Serial.println(y);
bluetoothTable.sendValueUpdate("Joystick X", String(x));
bluetoothTable.sendValueUpdate("Joystick Y", String(y));
});
bluetoothJoystick.onGetConfig([]() {
bluetoothJoystick.send(currentJoystickX, currentJoystickY);
});
bluetoothTemperature.onTemperatureRequest([]() {
bluetoothTemperature.send(currentTemperature);
});
bluetoothPlotter.onDataRequest([]() {
Serial.println("Plotter data requested");
});
bluetoothTable.onDataRequest([]() {
Serial.println("Table data requested");
bluetoothTable.sendTableStructure();
updateAllTableValues();
});
bluetoothGauge.onValueRequest([]() {
bluetoothGauge.send(currentGaugeValue);
});
bluetoothRotator.onRotatorAngle([](float angle) {
currentRotatorAngle = angle;
Serial.print("Rotator: "); Serial.print(angle); Serial.println("°");
bluetoothTable.sendValueUpdate("Rotator Angle", String(angle, 0) + "°");
});
}
void updateAllTableValues() {
bluetoothTable.sendValueUpdate("Status", "Running");
unsigned long uptime = millis() / 1000;
String uptimeStr;
if (uptime >= 60) {
uptimeStr = String(uptime / 60) + "m " + String(uptime % 60) + "s";
} else {
uptimeStr = String(uptime) + "s";
}
bluetoothTable.sendValueUpdate("Uptime", uptimeStr);
bluetoothTable.sendValueUpdate("Slider 1", String(currentSlider1));
bluetoothTable.sendValueUpdate("Slider 2", String(currentSlider2));
bluetoothTable.sendValueUpdate("Joystick X", String(currentJoystickX));
bluetoothTable.sendValueUpdate("Joystick Y", String(currentJoystickY));
bluetoothTable.sendValueUpdate("Temperature", String(currentTemperature, 1) + " °C");
bluetoothTable.sendValueUpdate("Gauge Value", String(currentGaugeValue, 1) + "%");
bluetoothTable.sendValueUpdate("Rotator Angle", String(currentRotatorAngle, 0) + "°");
bluetoothTable.sendValueUpdate("Messages", String(messageCount));
}
void loop() {
bluetoothServer.loop();
if (!bluetooth.isConnected()) {
delay(10);
return;
}
if (millis() - lastMonitorUpdate >= 5000) {
lastMonitorUpdate = millis();
messageCount++;
bluetoothMonitor.send("[INFO] Heartbeat #" + String(messageCount) + " - Uptime: " + String(millis() / 1000) + "s");
}
if (millis() - lastTempUpdate >= 2000) {
lastTempUpdate = millis();
static float tempOffset = 0;
tempOffset += random(-10, 11) / 10.0;
if (tempOffset > 5.0) tempOffset = 5.0;
if (tempOffset < -5.0) tempOffset = -5.0;
currentTemperature = 25.0 + tempOffset;
bluetoothTemperature.send(currentTemperature);
bluetoothTable.sendValueUpdate("Temperature", String(currentTemperature, 1) + " °C");
}
if (millis() - lastPlotUpdate >= 100) {
lastPlotUpdate = millis();
float sine = sin(plotPhase);
float cosine = cos(plotPhase);
float noise = random(-50, 51) / 100.0;
bluetoothPlotter.send(sine, cosine, noise);
plotPhase += 0.1;
if (plotPhase > 2 * PI) plotPhase = 0;
}
if (millis() - lastTableUpdate >= 5000) {
lastTableUpdate = millis();
unsigned long uptime = millis() / 1000;
String uptimeStr;
if (uptime >= 60) {
uptimeStr = String(uptime / 60) + "m " + String(uptime % 60) + "s";
} else {
uptimeStr = String(uptime) + "s";
}
bluetoothTable.sendValueUpdate("Uptime", uptimeStr);
bluetoothTable.sendValueUpdate("Messages", String(messageCount));
}
if (millis() - lastGaugeUpdate >= 3000) {
lastGaugeUpdate = millis();
float sensorValue = 50.0 + 30.0 * sin(millis() / 10000.0);
currentGaugeValue = sensorValue;
bluetoothGauge.send(currentGaugeValue);
bluetoothTable.sendValueUpdate("Gauge Value", String(currentGaugeValue, 1) + "%");
}
delay(10);
}
Klicken Sie auf den Upload Button in der Arduino IDE, um den Code auf den Arduino UNO R4 WiFi hochzuladen
Öffnen Sie den Serial Monitor
Überprüfen Sie das Ergebnis im Serial Monitor. Es sieht folgendermaßen aus:
DIYables Bluetooth - Multiple Apps Example
Waiting for Bluetooth connection...
Installieren Sie die DIYables Bluetooth App auf Ihrem Smartphone:
Android |
iOS
Hinweis: Die DIYables Bluetooth App unterstützt sowohl BLE als auch klassisches Bluetooth auf Android und BLE auf iOS. Da der Arduino UNO R4 WiFi BLE verwendet, funktioniert die App auf sowohl Android als auch iOS. Für BLE ist kein manuelles Pairing erforderlich — einfach scannen und verbinden.
Öffnen Sie die DIYables Bluetooth App
Beim ersten Öffnen der App werden Berechtigungen angefordert. Bitte gewähren Sie folgende:
Nearby Devices Berechtigung (Android 12+) / Bluetooth Berechtigung (iOS) - erforderlich zum Scannen und Verbinden mit Bluetooth-Geräten
Location Berechtigung (nur Android 11 und niedriger) - von älteren Android-Versionen zum Scannen nach BLE-Geräten benötigt
Stellen Sie sicher, dass Bluetooth auf Ihrem Telefon aktiviert ist
Tippen Sie auf dem Startbildschirm auf den Connect Button. Die App scannt nach BLE-Geräten.
Finden und tippen Sie auf "DIYables Multi-App" in den Scan-Ergebnissen, um sich zu verbinden.
Nach der Verbindung kehrt die App automatisch zum Startbildschirm zurück. Der Startbildschirm zeigt alle verfügbaren Apps. Die 9 Apps, die im Arduino-Code initialisiert wurden, werden reagieren und funktionieren — andere Apps auf dem Startbildschirm werden erscheinen, aber nicht mit diesem Sketch funktionieren.
Hinweis: Sie können auf das Einstellungssymbol auf dem Startbildschirm tippen, um Apps auf dem Startbildschirm ein-/auszublenden. Weitere Details finden Sie im DIYables Bluetooth App Benutzerhandbuch.
Tippen Sie auf einige der folgenden Apps, um sie zu öffnen und mit dem Arduino zu interagieren: Monitor, Chat, Slider, Joystick, Temperature, Plotter, Table, Analog Gauge, Rotator
Wechseln Sie frei zwischen den Apps — sie teilen sich alle dieselbe BLE-Verbindung
Schauen Sie nun zurück auf den Serial Monitor in der Arduino IDE. Sie werden sehen:
Bluetooth connected!
Monitor: System running, uptime: 5s
Chat message: Hello
Slider value: 128
Joystick: X=0.50, Y=-0.30
Temperature: 22.50 °C
Jede App wird mit ihrer eigenen Konfiguration und Callbacks erstellt:
DIYables_BluetoothServer bluetoothServer(bluetooth);
DIYables_BluetoothMonitor bluetoothMonitor(bluetoothServer);
DIYables_BluetoothChat bluetoothChat(bluetoothServer);
DIYables_BluetoothSlider bluetoothSlider(bluetoothServer, 0, 255, 1);
DIYables_BluetoothJoystick bluetoothJoystick(bluetoothServer, false, 5);
DIYables_BluetoothTemperature bluetoothTemp(bluetoothServer, -10.0, 50.0, "°C");
DIYables_BluetoothPlotter bluetoothPlotter(bluetoothServer);
DIYables_BluetoothTable bluetoothTable(bluetoothServer);
DIYables_BluetoothAnalogGauge bluetoothGauge(bluetoothServer, 0.0, 100.0, "%");
DIYables_BluetoothRotator bluetoothRotator(bluetoothServer, ROTATOR_MODE_CONTINUOUS);
Apps können miteinander interagieren — wenn eine App eine Eingabe erhält, kann sie andere Apps aktualisieren:
bluetoothSlider.onSliderValue([](int value) {
float percent = value * 100.0 / 255.0;
bluetoothGauge.send(percent);
bluetoothTable.sendValueUpdate("Slider 1", String(value));
});
bluetoothJoystick.onJoystickValue([](float x, float y) {
bluetoothTable.sendValueUpdate("Joystick X", String(x, 2));
bluetoothTable.sendValueUpdate("Joystick Y", String(y, 2));
});
bluetoothRotator.onRotatorAngle([](float angle) {
bluetoothTable.sendValueUpdate("Rotator Angle", String(angle, 1) + "°");
});
Jede App hat ihr eigenes Update-Intervall, um Reaktionsfähigkeit und Bandbreite auszubalancieren:
void loop() {
bluetoothServer.loop();
unsigned long now = millis();
if (now - lastPlotterTime >= 100) { ... }
if (now - lastTempTime >= 2000) { ... }
if (now - lastGaugeTime >= 3000) { ... }
if (now - lastMonitorTime >= 5000) { ... }
if (now - lastTableTime >= 5000) { ... }
}
Das Beispiel erstellt eine Tabelle mit 10 Zeilen, die Daten von allen Apps zeigt:
| Zeile | Label | Beschreibung |
| 0 | Status | Verbindungs-/Laufstatus |
| 1 | Uptime | Zeit seit dem Start |
| 2 | Slider 1 | Aktueller Slider-Wert |
| 3 | Slider 2 | Zweiter Slider-Wert |
| 4 | Joystick X | Joystick X-Position |
| 5 | Joystick Y | Joystick Y-Position |
| 6 | Temperature | Aktuelle Temperatur |
| 7 | Gauge Value | Aktueller Gauge-Prozentsatz |
| 8 | Rotator Angle | Aktueller Rotationswinkel |
| 9 | Messages | Chat-Nachrichtenzahl |
Sie benötigen nicht alle 9 Apps. Fügen Sie einfach nur die ein, die Sie benötigen:
DIYables_BluetoothMonitor bluetoothMonitor(bluetoothServer);
DIYables_BluetoothSlider bluetoothSlider(bluetoothServer, 0, 100, 1);
void checkTemperatureAlarm(float temp) {
if (temp > 40.0) {
bluetoothMonitor.send("⚠️ HIGH TEMP ALERT: " + String(temp, 1) + "°C");
bluetoothChat.send("Temperature alarm triggered!");
}
}
1. Gerät kann in der App nicht gefunden werden
Stellen Sie sicher, dass der Arduino UNO R4 WiFi eingeschaltet ist und der Sketch hochgeladen wurde
Stellen Sie sicher, dass Bluetooth auf Ihrem Telefon aktiviert ist
Auf Android 11 und niedriger aktivieren Sie auch die Standortdienste
2. Einige Apps werden im Menü nicht angezeigt
Alle Apps, die initialisiert werden, erscheinen automatisch
Überprüfen Sie, dass jedes App-Objekt ordnungsgemäß erstellt wurde
Die App erkennt verfügbare Apps vom Arduino
3. Updates scheinen langsam
Jede App hat unterschiedliche Update-Intervalle — das ist beabsichtigt
BLE hat begrenzte Bandbreite; zu viele schnelle Updates können Überlastung verursachen
Reduzieren Sie die Update-Frequenz für Apps, die keine Echtzeit-Daten benötigen
4. App-übergreifende Updates funktionieren nicht
Überprüfen Sie, dass die Callback-Funktionen ordnungsgemäß eingerichtet sind
Prüfen Sie, dass die Tabellenzeilennamen exakt übereinstimmen (Groß-/Kleinschreibung beachten)
Stellen Sie sicher, dass das Ziel-App-Objekt im Callback-Bereich zugänglich ist
5. Speicherprobleme oder Abstürze
Die Ausführung von 9 Apps verbraucht erheblichen Speicher
Entfernen Sie unbenutzte Apps, um Ressourcen freizugeben
Reduzieren Sie die Anzahl der Tabellenzeilen falls nötig
6. Upload schlägt fehl oder Board wird nicht erkannt
Umfassendes IoT-Dashboard
Roboter-Steuerungspanel (Joystick + Monitor + Slider)
Wetterstation (Temperature + Gauge + Plotter + Table)
Hausautomatisierungs-Hub (Slider + Pins + Monitor + Chat)
STEM-Lernplattform (alle Apps zum Experimentieren)
Nach dem Beherrschen des Multiple Apps Beispiels erkunden Sie einzelne App-Tutorials für tieferes Verständnis:
Bluetooth Chat - Für Details zu Nachrichten
Bluetooth Slider - Für Details zur Wertsteuerung
Bluetooth Plotter - Für Details zur Datenvisualisierung
Bluetooth RTC - Für Zeitsynchronisation (verwendet eingebaute Hardware-RTC)