Bei der Steuerung der Pistenraupe fällt die relativ schwierige Steuerung der beiden Ketten über die Schieberegler auf, die über den ESPAsyncWebServer laufen. Eine verbesserte Steuerung muss her! Ich habe mit als Ziel gesetzt, diese über eine Android App zu realisieren, die mit der Bluetooth Schnittstelle des ESP32 kommunizieren soll. Das macht das Projekt dann auch unabhängig von einem vorhandenen WLAN.
Bluetooth auf dem ESP32
Glücklicherweise ist die Nutzung von Bluetooth auf dem ESP32 sehr einfach. Mit der entsprechenden Bibliothek wartet der ESP32 unter einem definierten Namen auf die Kopplung mit einem Handy und kann dann eine serielle Verbindung aufbauen über die Daten ausgetauscht werden können. Das geht ähnlich einfach wie die Ausgabe von Diagnosedaten auf dem seriellen Monitor der Arduino IDE.
#include "BluetoothSerial.h"
// init Bluetooth Class:
BluetoothSerial SerialBT;
const char* btname = "Pistenraupe"; // Unter diesem Namen findet man den ESP32 auf dem Handy
bool BTisConnected = false;
void setup() {
// Start Serial
Serial.begin(115200);
delay(100);
Serial.println("++++Neustart++++");
Serial.println("Starting Bluetooth...");
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
SerialBT.register_callback (btStatus);
SerialBT.begin(btname); //Name des Bluetooth interface, wird oben gesetzt
delay(500);
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 1); //enable brownout detector
Serial.print("Bluetooth started: "); Serial.println(btname);
}
void btStatus (esp_spp_cb_event_t event, esp_spp_cb_param_t*param) {
if(event == ESP_SPP_SRV_OPEN_EVT){
Serial.println("Bluetooth Client Connected");
BTisConnected = true;
}
else if (event == ESP_SPP_CLOSE_EVT ) {
Serial.println ("Bluetooth Client Disconnected");
BTisConnected = false;
}
}
Zunächst wird ein Objekt der Klasse BluetoothSerial erzeugt. Ich habe es „SerialBT“ genannt, um es von anderen seriellen Verbindungen einfach unterscheiden zu können. Dann werden noch zwei Hilfsvariablen erzeugt.
In der Setup-Funktion wird dann zunächst der sogenannte Brownout-Detector des ESP32 abgeschaltet. Dieser würde den ESP nach einem Spannungsabfall unter eine gewisse Grenze neustarten. Je nach Qualität der Spannungsversorgung hatte ich das Problem, dass beim Einschalten des Bluetooth Moduls kurzzeitig die Spannung offenbar eingebrochen ist. Daher habe ich diese Anweisungen drin behalten. Solltest Du keine Probleme mit Reboots nach Bluetooth Aktivierung haben, können die beiden Anweisungen auch entfallen.
Mit
SerialBT.begin(btname);
wird dann die Bluetooth Schnittstelle gestartet. Auf einem Handy kann man dann in den Bluetooth Einstellungen „Neues Gerät koppeln“ anwählen und sollte den ESP32 unter dem angegebenen Namen finden und koppeln. Wichtig: Die reine Kopplung ist noch nicht der Aufbau einer seriellen Verbindung zu einem Client, daher wird zu diesem Zeitpunkt auch noch nicht der Event ESP_SPP_SRV_OPEN_EVT (Bluetooth Client Connected) ausgelöst.
Die Client App
Die Client App baue ich wieder mithilfe des MIT App Inventor, wie schon im Beitrag zur App Entwicklung gezeigt. Ich habe in meinen Apps ein paar Funktionen zusammengestellt, die eine einmal erfolgreich aufgebaute Bluetooth Verbindung beim Start der App wieder versuchen aufzubauen. Diese „Autoconnect“ Bausteine will ich hier zeigen.
Wir brauchen im Design-Teil des MIT App Inventors non-visible Components „BluetoothClient1“ und „File1“. Zusätzlich wird ein ListPicker und ein Button benötigt. Am einfachsten importierst Du das komplette Projekt in deinen MIT App Inventor Bereich zum nachvollziehen. Die Datei gibts ganz unten als Download.
Beim Initialisieren des App-Screen1 wird zunächst nach der Berechtigung für „BLUETOOTH_CONNECT“ gefragt. Wird diese erteilt, wird zusätzlich nach der Berechtigung „BLUETOOTH_SCAN“ gefragt.
Im ListPickerConnectBluetooh werden dann alle in der Umgebung gefundenen Bluetooth-Addressen und die zugehörigen Namen angezeigt. Tritt nach einer Auswahl das Event „AfterPicking“ ein, wird versucht zu dieser Adresse eine Verbindung aufzubauen. Diese wird dann mithilfe der Prozedur BluetoothSaveAddress abgespeichert, wenn die Verbindung erfolgreich aufgebaut wurde:
Als Dateinamen wird die ganz oben festgelegte „bluetooth.txt“ im für die App dedizierten Speicherpfad auf dem Handy genutzt. Einziger Inhalt die Bluetooth Adresse.
Bei einem erneuten Aufruf der App wird der Verweis aud die Prozedur „BluetoothAutoConnect“ schon beim Initialisieren des Screen1 prüfen, ob diese Datei vorhanden ist und falls ja, die Bluetooth Adresse auslesen. Dadurch wird der Event „File1.GotText“ getriggert und es wird ein Verbindungsaufbau versucht. Schlägt dieser fehl, wird die Datei gelöscht, so dass der Zustand wie bei der ersten Nutzung der App hergestellt wird.
Im Serial Monitor des ESP32 werden nun die aufgebauten oder wieder getrennten Verbindungen angezeigt.
Die App als Download
MIT App Inventor Projekt und APK Installer im ZIP-Archiv: