ESP32 Bluetooth Chat Beispiel - Bidirektionale Messaging-Schnittstelle Tutorial

Überblick

Das Bluetooth Chat-Beispiel ermöglicht bidirektionale Textnachrichten zwischen Ihrem ESP32 und einem Smartphone über die DIYables Bluetooth STEM App. Entwickelt für ESP32-Boards mit Unterstützung für sowohl BLE (Bluetooth Low Energy) als auch Classic Bluetooth-Verbindungen. Senden und empfangen Sie Textnachrichten in Echtzeit, implementieren Sie benutzerdefinierte Befehlsbearbeitung und verbinden Sie Serial Monitor mit Bluetooth — perfekt für Debugging, Fernsteuerung und interaktive Projekte.

Dieses Beispiel unterstützt zwei Bluetooth-Modi:

  • ESP32 BLE (Bluetooth Low Energy): Funktioniert sowohl mit Android als auch iOS
  • ESP32 Classic Bluetooth: Funktioniert nur mit Android. iOS unterstützt Classic Bluetooth nicht. Verwenden Sie BLE, wenn Sie iOS-Unterstützung benötigen.
ESP32 Bluetooth Chat Beispiel - Bidirektionale Messaging-Schnittstelle Tutorial

Funktionen

  • Bidirektionale Nachrichten: Senden und empfangen Sie Textnachrichten in Echtzeit
  • Echo-Modus: Automatische Rückgabe empfangener Nachrichten an die App
  • Befehlsbearbeitung: Verarbeitung benutzerdefinierter Textbefehle (ping, status, time, heap)
  • Periodische Nachrichten: Senden automatischer Status-Updates in konfigurierbaren Intervallen
  • Serial-zu-Bluetooth-Brücke: Tippen Sie Nachrichten im Serial Monitor ein und senden Sie sie an die App
  • BLE & Classic Bluetooth: Wählen Sie den Bluetooth-Modus, der zu Ihrem Projekt passt
  • Plattformübergreifend: BLE-Modus funktioniert mit Android und iOS; Classic Bluetooth funktioniert mit Android
  • Energiesparoption: BLE-Modus verbraucht weniger Energie als Classic Bluetooth

Erforderliche Hardware

1×ESP32 ESP-WROOM-32 Entwicklungsmodul
1×(Alternativ) ESP32 Uno-form board
1×(Alternativ) ESP32 S3 Uno-form board
1×USB-Kabel Type-C
1×Breadboard (Steckplatine)
1×Jumper-Kabel
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP32
1×(Empfohlen) Breakout Expansion Board for ESP32
1×(Empfohlen) Stromverteiler für ESP32

Oder Sie können die folgenden Kits kaufen:

1×DIYables ESP32 Starter-Kit (ESP32 enthalten)
1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
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.

ESP32 Code

Schnelle Schritte

Folgen Sie diesen Anweisungen Schritt für Schritt:

  • Wenn Sie zum ersten Mal ESP32 verwenden, lesen Sie das Tutorial zur Einrichtung der Umgebung für ESP32 in der Arduino IDE.
  • Verbinden Sie das ESP32-Board über ein USB-Kabel mit Ihrem Computer.
  • Starten Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das entsprechende ESP32-Board und den COM-Port aus.
  • Navigieren Sie zum Libraries-Symbol in der linken Leiste der Arduino IDE.
  • Suchen Sie nach "DIYables Bluetooth" und finden Sie die DIYables Bluetooth-Bibliothek von DIYables
  • Klicken Sie auf Install, um die Bibliothek zu installieren.
ESP32 DIYables Bluetooth library
  • Sie werden gefragt, ob Sie weitere Bibliotheksabhängigkeiten installieren möchten
  • Klicken Sie auf Install All, um alle Bibliotheksabhängigkeiten zu installieren.
ESP32 DIYables Bluetooth dependency

Wählen Sie einen der beiden Bluetooth-Modi unten, je nach Ihren Anforderungen:

ESP32 Classic Bluetooth Code (funktioniert nur mit der App auf Android)

Hinweis: Classic Bluetooth wird von iOS NICHT unterstützt. Wenn Sie iOS-Unterstützung benötigen, verwenden Sie den BLE-Code unten.

  • In der Arduino IDE gehen Sie zu File Examples DIYables Bluetooth Esp32Bluetooth_Chat Beispiel, oder kopieren Sie den obigen Code und fügen Sie ihn in den Editor der Arduino IDE ein
/* * DIYables Bluetooth Library - ESP32 Classic Bluetooth Chat 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 Chat feature: * - Two-way text messaging via Bluetooth * - Receive messages from mobile app * - Send messages to mobile app * * 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 and messages * 3. Use DIYables Bluetooth App to connect and chat * * Tutorial: https://diyables.io/bluetooth-app * Author: DIYables */ #include <DIYables_BluetoothServer.h> #include <DIYables_BluetoothChat.h> #include <platforms/DIYables_Esp32Bluetooth.h> // Create Bluetooth instances DIYables_Esp32Bluetooth bluetooth("ESP32_Chat"); DIYables_BluetoothServer bluetoothServer(bluetooth); // Create Chat app instance DIYables_BluetoothChat bluetoothChat; // Variables for periodic messages unsigned long lastMessageTime = 0; const unsigned long MESSAGE_INTERVAL = 10000; // Send message every 10 seconds int messageCount = 0; void setup() { Serial.begin(115200); delay(1000); Serial.println("DIYables Bluetooth - ESP32 Chat Example"); // Initialize Bluetooth server with platform-specific implementation bluetoothServer.begin(); // Add chat app to server bluetoothServer.addApp(&bluetoothChat); // Set up connection event callbacks bluetoothServer.setOnConnected([]() { Serial.println("Bluetooth connected!"); bluetoothChat.send("Hello! ESP32 is ready to chat."); }); bluetoothServer.setOnDisconnected([]() { Serial.println("Bluetooth disconnected!"); messageCount = 0; }); // Set up callback for received chat messages bluetoothChat.onChatMessage([](const String& message) { Serial.print("Received: "); Serial.println(message); // Echo the message back String response = "Echo: "; response += message; bluetoothChat.send(response); // You can add custom command handling here if (message.equalsIgnoreCase("ping")) { bluetoothChat.send("pong!"); } else if (message.equalsIgnoreCase("status")) { bluetoothChat.send("ESP32 is running normally"); } else if (message.equalsIgnoreCase("time")) { String timeMsg = "Uptime: "; timeMsg += String(millis() / 1000); timeMsg += " seconds"; bluetoothChat.send(timeMsg); } else if (message.equalsIgnoreCase("heap")) { String heapMsg = "Free heap: "; heapMsg += String(ESP.getFreeHeap()); heapMsg += " bytes"; bluetoothChat.send(heapMsg); } }); Serial.println("Waiting for Bluetooth connection..."); Serial.println("Type 'ping', 'status', 'time', or 'heap' in the app to test commands"); } void loop() { // Handle Bluetooth server communications bluetoothServer.loop(); // Send periodic status message (only when connected) if (bluetooth.isConnected() && millis() - lastMessageTime >= MESSAGE_INTERVAL) { lastMessageTime = millis(); messageCount++; String statusMsg = "Status update #"; statusMsg += String(messageCount); statusMsg += " - All systems operational"; bluetoothChat.send(statusMsg); Serial.print("Sent: "); Serial.println(statusMsg); } // Optional: Read from Serial and send to Bluetooth if (Serial.available()) { String serialMsg = Serial.readStringUntil('\n'); serialMsg.trim(); if (serialMsg.length() > 0 && bluetooth.isConnected()) { bluetoothChat.send(serialMsg); Serial.print("Sent from Serial: "); Serial.println(serialMsg); } } delay(10); }
  • Klicken Sie auf Upload in der Arduino IDE, um den Code auf den ESP32 hochzuladen
  • Öffnen Sie den Serial Monitor
  • Überprüfen Sie das Ergebnis im Serial Monitor. Es sieht folgendermaßen aus:
COM6
Send
DIYables Bluetooth - ESP32 Chat Example Waiting for Bluetooth connection... Type 'ping', 'status', 'time', or 'heap' in the app to test commands
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

ESP32 BLE Code (funktioniert mit der App sowohl auf Android als auch iOS)

  • In der Arduino IDE gehen Sie zu File Examples DIYables Bluetooth Esp32BLE_Chat Beispiel, oder kopieren Sie den obigen Code und fügen Sie ihn in den Editor der Arduino IDE ein
/* * DIYables Bluetooth Library - ESP32 BLE Chat Example * Works with DIYables Bluetooth STEM app on Android and iOS * * This example demonstrates the Bluetooth Chat feature: * - Two-way text messaging via Bluetooth * - Receive messages from mobile app * - Send messages to mobile app * * 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 and messages * 3. Use DIYables Bluetooth App to connect and chat * * Tutorial: https://diyables.io/bluetooth-app * Author: DIYables */ #include <DIYables_BluetoothServer.h> #include <DIYables_BluetoothChat.h> #include <platforms/DIYables_Esp32BLE.h> // BLE Configuration const char* DEVICE_NAME = "ESP32BLE_Chat"; 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 Chat app instance DIYables_BluetoothChat bluetoothChat; // Variables for periodic messages unsigned long lastMessageTime = 0; const unsigned long MESSAGE_INTERVAL = 10000; // Send message every 10 seconds int messageCount = 0; void setup() { Serial.begin(115200); delay(1000); Serial.println("DIYables Bluetooth - ESP32 BLE Chat Example"); // Initialize Bluetooth server with platform-specific implementation bluetoothServer.begin(); // Add chat app to server bluetoothServer.addApp(&bluetoothChat); // Set up connection event callbacks bluetoothServer.setOnConnected([]() { Serial.println("Bluetooth connected!"); bluetoothChat.send("Hello! ESP32 BLE is ready to chat."); }); bluetoothServer.setOnDisconnected([]() { Serial.println("Bluetooth disconnected!"); messageCount = 0; }); // Set up callback for received chat messages bluetoothChat.onChatMessage([](const String& message) { Serial.print("Received: "); Serial.println(message); // Echo the message back String response = "Echo: "; response += message; bluetoothChat.send(response); // Custom command handling if (message.equalsIgnoreCase("ping")) { bluetoothChat.send("pong!"); } else if (message.equalsIgnoreCase("status")) { bluetoothChat.send("ESP32 BLE is running normally"); } else if (message.equalsIgnoreCase("time")) { String timeMsg = "Uptime: "; timeMsg += String(millis() / 1000); timeMsg += " seconds"; bluetoothChat.send(timeMsg); } else if (message.equalsIgnoreCase("heap")) { String heapMsg = "Free heap: "; heapMsg += String(ESP.getFreeHeap()); heapMsg += " bytes"; bluetoothChat.send(heapMsg); } }); Serial.println("Waiting for Bluetooth connection..."); Serial.println("Type 'ping', 'status', 'time', or 'heap' in the app to test commands"); } void loop() { bluetoothServer.loop(); if (bluetooth.isConnected() && millis() - lastMessageTime >= MESSAGE_INTERVAL) { lastMessageTime = millis(); messageCount++; String statusMsg = "Status update #"; statusMsg += String(messageCount); statusMsg += " - All systems operational"; bluetoothChat.send(statusMsg); Serial.print("Sent: "); Serial.println(statusMsg); } if (Serial.available()) { String serialMsg = Serial.readStringUntil('\n'); serialMsg.trim(); if (serialMsg.length() > 0 && bluetooth.isConnected()) { bluetoothChat.send(serialMsg); Serial.print("Sent from Serial: "); Serial.println(serialMsg); } } delay(10); }
  • Klicken Sie auf Upload in der Arduino IDE, um den Code auf den ESP32 hochzuladen
  • Öffnen Sie den Serial Monitor
  • Überprüfen Sie das Ergebnis im Serial Monitor. Es sieht folgendermaßen aus:
COM6
Send
DIYables Bluetooth - ESP32 BLE Chat Example Waiting for Bluetooth connection... Type 'ping', 'status', 'time', or 'heap' in the app to test commands
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Mobile App

  • Installieren Sie die DIYables Bluetooth App auf Ihrem Smartphone: Android | iOS
  • Wenn Sie den ESP32 Classic Bluetooth Code verwenden, müssen Sie den ESP32 mit Ihrem Android-Telefon vor dem Öffnen der App koppeln:
    • Gehen Sie zu den Einstellungen > Bluetooth Ihres Telefons
    • Stellen Sie sicher, dass Bluetooth eingeschaltet ist
    • Ihr Telefon scannt nach verfügbaren Geräten
    • Finden und tippen Sie auf "ESP32_Chat" in der Liste der verfügbaren Geräte
    • Bestätigen Sie die Kopplungsanfrage (keine PIN erforderlich)
    • Warten Sie, bis "Gekoppelt" unter dem Gerätenamen angezeigt wird
  • Wenn Sie den ESP32 BLE Code verwenden, ist keine Kopplung erforderlich. Fahren Sie einfach mit dem nächsten Schritt fort.
  • Öffnen Sie die DIYables Bluetooth App
  • Beim ersten Öffnen der App werden Berechtigungen angefragt. Bitte gewähren Sie folgende:
    • Geräte in der Nähe-Berechtigung (Android 12+) / Bluetooth-Berechtigung (iOS) - erforderlich zum Scannen und Verbinden mit Bluetooth-Geräten
    • Standort-Berechtigung (nur Android 11 und früher) - erforderlich für ältere Android-Versionen zum Scannen nach BLE-Geräten
  • Stellen Sie sicher, dass Bluetooth auf Ihrem Telefon eingeschaltet ist
  • Tippen Sie auf dem Startbildschirm auf Connect. Die App scannt nach BLE- und Classic Bluetooth-Geräten.
DIYables Bluetooth App - Home Screen with Scan Button
  • Finden und tippen Sie auf Ihr Gerät in den Scan-Ergebnissen, um zu verbinden:
    • Für Classic Bluetooth: tippen Sie auf "ESP32_Chat"
    • Für BLE: tippen Sie auf "ESP32BLE_Chat"
  • Nach der Verbindung kehrt die App automatisch zum Startbildschirm zurück. Wählen Sie die Chat-App aus dem App-Menü.
DIYables Bluetooth App - Home Screen with Chat App

Hinweis: Sie können das Einstellungssymbol auf dem Startbildschirm antippen, um Apps auf dem Startbildschirm ein-/auszublenden. Weitere Details finden Sie im DIYables Bluetooth App Benutzerhandbuch.

  • Geben Sie eine Nachricht in das Texteingabefeld ein und tippen Sie auf Senden
DIYables Bluetooth App - Chat Screen

Schauen Sie nun zurück zum Serial Monitor in der Arduino IDE. Sie werden sehen:

COM6
Send
Bluetooth connected! Received: Hello Received: ping Received: status Sent: Status update #1 - All systems operational
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Geben Sie Nachrichten in die App ein und beobachten Sie das Echtzeit-Feedback im Serial Monitor
  • Probieren Sie eingebaute Befehle aus: ping, status, time, heap
  • Sie können auch Nachrichten im Serial Monitor eingeben, die dann an die App gesendet werden

Kreative Anpassung - Passen Sie den Code an Ihr Projekt an

Nachrichten von der App empfangen

Verwenden Sie den onChatMessage()-Callback, um von der App empfangene Nachrichten zu verarbeiten. Sie können beliebige benutzerdefinierte Befehlswörter definieren, die für Ihr Projekt sinnvoll sind — der ESP32 reagiert entsprechend:

bluetoothChat.onChatMessage([](const String& message) { Serial.print("Received: "); Serial.println(message); // Nachricht verarbeiten if (message == "LED_ON") { digitalWrite(2, HIGH); bluetoothChat.send("LED eingeschaltet"); } else if (message == "LED_OFF") { digitalWrite(2, LOW); bluetoothChat.send("LED ausgeschaltet"); } else { bluetoothChat.send("Unbekannter Befehl: " + message); } });

Sie können so viele benutzerdefinierte Befehle hinzufügen, wie Sie benötigen, indem Sie weitere else if-Blöcke hinzufügen. Fügen Sie zum Beispiel RELAY_ON / RELAY_OFF zur Relais-Steuerung hinzu, oder READ zur Auslösung einer Sensor-Ablesung — jedes Wort, das Sie in der App eingeben, wird zu einem Befehl.

Nachrichten an die App senden

Sie können jederzeit Textnachrichten vom ESP32 an die App senden:

// Eine einfache Textnachricht senden bluetoothChat.send("Hallo vom ESP32!"); // Sensordaten als Text senden float temperature = 25.3; bluetoothChat.send("Temperatur: " + String(temperature) + "°C"); // Status-Updates senden bluetoothChat.send("System bereit");

Verbindungsereignisse verwalten

Sie können erkennen, wann sich die App mit dem ESP32 verbindet oder trennt:

// Wird aufgerufen, wenn sich die App mit dem ESP32 verbindet bluetoothServer.setOnConnected([]() { Serial.println("Bluetooth verbunden!"); bluetoothChat.send("Willkommen! ESP32 ist bereit zum Chatten."); }); // Wird aufgerufen, wenn sich die App vom ESP32 trennt bluetoothServer.setOnDisconnected([]() { Serial.println("Bluetooth getrennt!"); }); // Verbindungsstatus überall in Ihrem Code prüfen if (bluetoothServer.isConnected()) { bluetoothChat.send("Immer noch verbunden!"); }

Serial-zu-Bluetooth-Brücke

Leiten Sie im Arduino IDE Serial Monitor eingegebene Nachrichten an die Bluetooth-App weiter:

void loop() { bluetoothServer.loop(); // Aus Serial lesen und an Bluetooth senden if (Serial.available()) { String serialMsg = Serial.readStringUntil('\n'); serialMsg.trim(); if (serialMsg.length() > 0 && bluetooth.isConnected()) { bluetoothChat.send(serialMsg); Serial.print("Vom Serial gesendet: "); Serial.println(serialMsg); } } delay(10); }

Verwendung des Chats

App-Interface-Steuerung

Die Chat-Schnittstelle in der DIYables Bluetooth App bietet:

  • Nachrichtenliste: Scrollbare Liste mit gesendeten und empfangenen Nachrichten
  • Texteingabe: Geben Sie Ihre Nachricht unten ein
  • Senden-Button: Tippen Sie, um die eingegebene Nachricht zu senden
  • Auto-Scroll: Scrollt automatisch zur neuesten Nachricht

Eingebaute Befehle

Der Beispielcode enthält diese eingebauten Befehle:

  • ping → Antwortet mit "pong!"
  • status → Meldet ESP32-Laufstatus
  • time → Zeigt Betriebszeit in Sekunden
  • heap → Zeigt freien Heap-Speicher in Bytes

Programmierbeispiele

Basis Echo-Chat

void setup() { // Chat-Callback einrichten bluetoothChat.onChatMessage([](const String& message) { Serial.print("Empfangen: "); Serial.println(message); // Nachricht zurück echoen bluetoothChat.send("Echo: " + message); }); }

Befehlsbasierte LED-Steuerung

const int LED_PIN = 2; // Eingebaute LED const int RED_PIN = 16; const int GREEN_PIN = 17; const int BLUE_PIN = 18; void setup() { pinMode(LED_PIN, OUTPUT); pinMode(RED_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); pinMode(BLUE_PIN, OUTPUT); bluetoothChat.onChatMessage([](const String& message) { String cmd = message; cmd.toUpperCase(); if (cmd == "LED ON") { digitalWrite(LED_PIN, HIGH); bluetoothChat.send("LED ist jetzt AN"); } else if (cmd == "LED OFF") { digitalWrite(LED_PIN, LOW); bluetoothChat.send("LED ist jetzt AUS"); } else if (cmd == "ROT") { digitalWrite(RED_PIN, HIGH); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, LOW); bluetoothChat.send("Rote LED aktiviert"); } else if (cmd == "GRUEN") { digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, HIGH); digitalWrite(BLUE_PIN, LOW); bluetoothChat.send("Grüne LED aktiviert"); } else if (cmd == "BLAU") { digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, HIGH); bluetoothChat.send("Blaue LED aktiviert"); } else if (cmd == "AUS") { digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, LOW); digitalWrite(BLUE_PIN, LOW); bluetoothChat.send("Alle LEDs aus"); } else if (cmd == "HILFE") { bluetoothChat.send("Befehle: LED ON, LED OFF, ROT, GRUEN, BLAU, AUS, HILFE"); } else { bluetoothChat.send("Unbekannter Befehl. Geben Sie HILFE für Liste ein."); } }); }

Sensor-Abfragesystem

#include <DHT.h> DHT dht(4, DHT22); void setup() { dht.begin(); bluetoothChat.onChatMessage([](const String& message) { String cmd = message; cmd.toUpperCase(); if (cmd == "TEMP") { float temp = dht.readTemperature(); if (!isnan(temp)) { bluetoothChat.send("Temperatur: " + String(temp, 1) + " °C"); } else { bluetoothChat.send("Fehler beim Lesen des Temperatursensors"); } } else if (cmd == "FEUCHTIGKEIT") { float hum = dht.readHumidity(); if (!isnan(hum)) { bluetoothChat.send("Feuchtigkeit: " + String(hum, 1) + " %"); } else { bluetoothChat.send("Fehler beim Lesen des Feuchtigkeitssensors"); } } else if (cmd == "ALLE") { float temp = dht.readTemperature(); float hum = dht.readHumidity(); bluetoothChat.send("Temp: " + String(temp, 1) + "°C | Feuchtigkeit: " + String(hum, 1) + "%"); } else if (cmd == "HILFE") { bluetoothChat.send("Befehle: TEMP, FEUCHTIGKEIT, ALLE, HILFE"); } }); }

Relais-Steuerung mit Bestätigung

const int RELAY_1 = 16; const int RELAY_2 = 17; bool relay1State = false; bool relay2State = false; void setup() { pinMode(RELAY_1, OUTPUT); pinMode(RELAY_2, OUTPUT); digitalWrite(RELAY_1, LOW); digitalWrite(RELAY_2, LOW); bluetoothChat.onChatMessage([](const String& message) { String cmd = message; cmd.toUpperCase(); if (cmd == "R1 AN") { digitalWrite(RELAY_1, HIGH); relay1State = true; bluetoothChat.send("Relais 1: AN"); } else if (cmd == "R1 AUS") { digitalWrite(RELAY_1, LOW); relay1State = false; bluetoothChat.send("Relais 1: AUS"); } else if (cmd == "R2 AN") { digitalWrite(RELAY_2, HIGH); relay2State = true; bluetoothChat.send("Relais 2: AN"); } else if (cmd == "R2 AUS") { digitalWrite(RELAY_2, LOW); relay2State = false; bluetoothChat.send("Relais 2: AUS"); } else if (cmd == "STATUS") { bluetoothChat.send("Relais 1: " + String(relay1State ? "AN" : "AUS")); bluetoothChat.send("Relais 2: " + String(relay2State ? "AN" : "AUS")); } else if (cmd == "HILFE") { bluetoothChat.send("Befehle: R1 AN, R1 AUS, R2 AN, R2 AUS, STATUS, HILFE"); } }); }

Erweiterte Programmiertechniken

Periodische Status-Updates

unsigned long lastMessageTime = 0; const unsigned long MESSAGE_INTERVAL = 10000; // 10 Sekunden void loop() { bluetoothServer.loop(); // Periodische Status-Updates senden (nur wenn verbunden) if (bluetooth.isConnected() && millis() - lastMessageTime >= MESSAGE_INTERVAL) { lastMessageTime = millis(); messageCount++; String statusMsg = "Status-Update #" + String(messageCount); statusMsg += " - Betriebszeit: " + String(millis() / 1000) + "s"; statusMsg += " - Heap: " + String(ESP.getFreeHeap()) + " Bytes"; bluetoothChat.send(statusMsg); } delay(10); }

Nachrichten-Protokollierung

// Alle Nachrichten mit Zeitstempel an Serial protokollieren bluetoothChat.onChatMessage([](const String& message) { unsigned long timestamp = millis() / 1000; Serial.print("["); Serial.print(timestamp); Serial.print("s] Empfangen: "); Serial.println(message); // Verarbeiten und antworten String response = processCommand(message); bluetoothChat.send(response); Serial.print("["); Serial.print(millis() / 1000); Serial.print("s] Gesendet: "); Serial.println(response); }); String processCommand(const String& cmd) { if (cmd.equalsIgnoreCase("ping")) return "pong!"; if (cmd.equalsIgnoreCase("status")) return "Alle Systeme betriebsbereit"; if (cmd.equalsIgnoreCase("time")) return "Betriebszeit: " + String(millis() / 1000) + "s"; return "Echo: " + cmd; }

Befehlsparser mit Argumenten

bluetoothChat.onChatMessage([](const String& message) { // Befehl und Argument parsen (Format: "BEFEHL ARG") int spaceIndex = message.indexOf(' '); String command, argument; if (spaceIndex > 0) { command = message.substring(0, spaceIndex); argument = message.substring(spaceIndex + 1); } else { command = message; argument = ""; } command.toUpperCase(); if (command == "PWM") { int value = argument.toInt(); value = constrain(value, 0, 255); analogWrite(16, value); bluetoothChat.send("PWM auf " + String(value) + " gesetzt"); } else if (command == "DELAY") { int ms = argument.toInt(); bluetoothChat.send("Warte " + String(ms) + "ms..."); delay(ms); bluetoothChat.send("Fertig!"); } else if (command == "PIN") { // Format: "PIN 13 HIGH" oder "PIN 13 LOW" int secondSpace = argument.indexOf(' '); if (secondSpace > 0) { int pin = argument.substring(0, secondSpace).toInt(); String state = argument.substring(secondSpace + 1); state.toUpperCase(); digitalWrite(pin, state == "HIGH" ? HIGH : LOW); bluetoothChat.send("Pin " + String(pin) + " auf " + state + " gesetzt"); } } });

Hardware-Integrationsbeispiele

Servo-Steuerung über Chat

#include <ESP32Servo.h> Servo myServo; const int SERVO_PIN = 13; void setup() { myServo.attach(SERVO_PIN); bluetoothChat.onChatMessage([](const String& message) { // Akzeptiert Winkelbefehle wie "90" oder "SERVO 90" String cmd = message; cmd.toUpperCase(); int angle = -1; if (cmd.startsWith("SERVO ")) { angle = cmd.substring(6).toInt(); } else { angle = cmd.toInt(); if (angle == 0 && cmd != "0") angle = -1; // Keine Zahl } if (angle >= 0 && angle <= 180) { myServo.write(angle); bluetoothChat.send("Servo zu " + String(angle) + "° bewegt"); } else if (cmd == "SWEEP") { bluetoothChat.send("Servo bewegt sich..."); for (int a = 0; a <= 180; a += 5) { myServo.write(a); delay(30); } for (int a = 180; a >= 0; a -= 5) { myServo.write(a); delay(30); } bluetoothChat.send("Bewegung abgeschlossen"); } }); }

Motor-Steuerung über Chat

const int MOTOR_PWM = 16; const int MOTOR_DIR1 = 18; const int MOTOR_DIR2 = 19; void setup() { pinMode(MOTOR_PWM, OUTPUT); pinMode(MOTOR_DIR1, OUTPUT); pinMode(MOTOR_DIR2, OUTPUT); bluetoothChat.onChatMessage([](const String& message) { String cmd = message; cmd.toUpperCase(); if (cmd == "VORWAERTS") { digitalWrite(MOTOR_DIR1, HIGH); digitalWrite(MOTOR_DIR2, LOW); analogWrite(MOTOR_PWM, 200); bluetoothChat.send("Motor läuft vorwärts"); } else if (cmd == "RUECKWAERTS") { digitalWrite(MOTOR_DIR1, LOW); digitalWrite(MOTOR_DIR2, HIGH); analogWrite(MOTOR_PWM, 200); bluetoothChat.send("Motor läuft rückwärts"); } else if (cmd == "STOPP") { analogWrite(MOTOR_PWM, 0); bluetoothChat.send("Motor gestoppt"); } else if (cmd.startsWith("SPEED ")) { int speed = cmd.substring(6).toInt(); speed = constrain(speed, 0, 255); analogWrite(MOTOR_PWM, speed); bluetoothChat.send("Motor-Geschwindigkeit: " + String(speed)); } }); }

BLE vs Classic Bluetooth - Welches wählen?

FeatureBLE (Esp32BLE_Chat)Classic Bluetooth (Esp32Bluetooth_Chat)
iOS-Unterstützung✓ Ja✗ Nein
Android-Unterstützung✓ Ja✓ Ja
EnergieverbrauchNiedrigHöher
Reichweite~30-100m~10-100m
DatenrateNiedrigerHöher
Kopplung erforderlichNein (Auto-Verbindung)Ja (Manuelle Kopplung)
Am besten fürBatteriebetrieben, plattformübergreifendHoher Durchsatz, nur Android

Fehlerbehebung

Häufige Probleme

1. Gerät in der App nicht auffindbar

  • Stellen Sie sicher, dass der ESP32 eingeschaltet ist und der Sketch hochgeladen wurde
  • Für BLE: Stellen Sie sicher, dass Bluetooth und Standort Ihres Telefons aktiviert sind
  • Für Classic Bluetooth: Koppeln Sie das Gerät zuerst in den Bluetooth-Einstellungen des Telefons
  • Überprüfen Sie, ob das korrekte Partitionsschema ausgewählt ist (Huge APP)

2. Nachrichten erscheinen nicht in der App

  • Überprüfen Sie den Bluetooth-Verbindungsstatus in der App
  • Überprüfen Sie die Verbindung im Serial Monitor
  • Stellen Sie sicher, dass Nachrichten mit bluetoothChat.send() gesendet werden
  • Versuchen Sie, die Verbindung zu trennen und wieder herzustellen

3. Echo-Nachrichten funktionieren nicht

  • Überprüfen Sie, ob der onChatMessage()-Callback korrekt eingerichtet ist
  • Überprüfen Sie den Serial Monitor auf empfangene Nachrichten
  • Stellen Sie sicher, dass der Chat-App-Bildschirm in der mobilen App ausgewählt ist

4. Verbindung bricht häufig ab

  • Gehen Sie näher zum ESP32 (Entfernung reduzieren)
  • Für BLE: Überprüfen Sie auf Interferenzen von anderen BLE-Geräten
  • Für Classic Bluetooth: Stellen Sie eine stabile Stromversorgung zum ESP32 sicher
  • Überprüfen Sie den Serial Monitor auf

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!