Projekte mit dem Handy steuern - AZ-Delivery

Bluetooth BLE als „virtuelles USB-Kabel“

Die Idee

Mit Freude habe ich gesehen, wie viele engagierte Elektroniker einzelne Projekte, wie z.B. das „TDMM das sprechende Multimeter“ nachgebaut haben. Dabei kam immer wieder die Frage auf, wie die Steuerung solcher Projekte auch ohne PC möglich gemacht werden kann.

Bislang ist z.B. das TDMM entweder komplett eigenständig und wird über seine Schalter bedient. Oder man möchte den gesamten Funktionsumfang nutzen, wozu bislang noch ein PC + USB-Kabel nötig sind. Denn das TDMM bietet etliche Befehle mit bis zu vier Parametern an, die einzugeben sind.

Es geht ab sofort ohne PC, wenn man ein Bluetooth Serial Modul nachrüstet, z.B. das HM-10 und sowohl das Modul, als auch das angeschlossene Gerät autonom versorgt werden (d.h. nicht via USB).

Diese Bauteile werden benötigt

 

HM-10 Bluetooth-Modul

ESP8266 D1 Mini

Jumper Wire

Breadboard


 

Das Bluetooth Serial Modul HM-10

 

Das Modul ist kompakt, preisgünstig und einfach an zu wenden. Die Anschlüsse sind selbst erklärend. Die Pins ENABLE und STATE werden für unsere Anwendung nicht benötigt.

 

Um das Modul mit einem Mikrocontroller zu verbinden, verbindet man Rx - Tx des HM-10 mit den Rx - Tx  des Mikrocontrollers „über Kreuz“. Fertig! Dann schließt man beide Baugruppen an die gleiche Stromversorgung an. Ein wirklich narrensicherer Hardwareaufbau, der es uns dennoch erlaubt, unsere Projekte künftig über Bluetooth zu steuern. Das ist ein echter Nutzen und macht richtig Spass.


 

                        Foto 3:  Fritzing - Aufbau

Kommen wir nun zu den Herausforderungen.

Im Sketch liegt die Herausforderung

 

Unsere Aufgabe ist nun, die Steuerung im Sketch zu verankern. Die Sketches meiner letzten Projekte waren ja teils umfangreich, doch durch den verwendeten Commandprozessor recht klar gegliedert.

Um das Vorgehen deutlich zu machen, habe ich eine Test-Anwendung geschrieben. Sie greift die schon bekannten Elemente z.B. aus dem TDMM oder dem LabSupply M401 wieder auf. Dreh- und Angelpunkt ist immer der Commandprozessor. Schauen wir uns dazu den Code etwas genauer an:

 

//mit diesem Testprogramm kann erprobt werden, wie Projekte über BT
//gesteuert werden. 
//Michael Klein | DL1MKP | für AZ-Blog 4-2025
//Andere Projekte auch unter art-of-electronics.blog

#include <MD_cmdProcessor.h> //Bibliothek des Commandprozessors CP
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))

void handlerHelp(char* param); //Hilfefunktion des CP

void handlerW(char* param) // Meldung auslösen
{
  Serial.print("Hello World - bin hier\n");
  Serial.print("Geht es dir gut?\n");
}

void handlerU(char* param) // Simulation: Spannung einstellen
{
  float  u = strtod(param, nullptr);
  String result = "U=" + String(u) + "V\n";
  Serial.println(result);
}

void handlerB(char* param) // 5x Blinken
{
  int n = 5;
  while (n > 0) {
    digitalWrite(2, LOW);  
    delay(300);                      
    digitalWrite(2, HIGH); 
    delay(300);  
    n--;
  }
  digitalWrite(2, HIGH); 
}

void handlerN(char* param) // Buffer leeren
{
  Serial.print("\n"); //neue Zeile erzeugen ohne Fehlermeldung
}

const MD_cmdProcessor::cmdItem_t PROGMEM cmdTable[] =
{
  { "@?",  handlerHelp,  "",    "Help", 0 },
  { "@h",  handlerHelp,  "",    "Help", 0 },
  { "@b",  handlerB,     "",    "Blinken", 0},
  { "@w",  handlerW,     "",    "Hello World - bin hier", 0 },
  { "@u",  handlerU,     "u",   "Usoll: [V]", 0 },
  { "@",   handlerN,     "",    "Show Buffer", 0 }, //Neue Zeile ohne Fehlermeldung auszulösen
};

MD_cmdProcessor CP(Serial, cmdTable, ARRAY_SIZE(cmdTable)); //Instanz des CP bilden

void handlerHelp(char* param)
{
  Serial.print("LF einstellen.\n");
  CP.help();
}

void setup()
{
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH); 
  CP.begin();
  CP.help();
}

void loop() { //Kompaktes Hauptprogramm
CP.run();
}

 

Wir sehen in den ersten x Zeilen die Vorbereitung des Commandprozessors. Noch vor dem Setup werden die „handler“-Funktionen definiert. Diese sind hier:

handlerW        Löst beim Aufruf eine Text-Meldung aus.
handlerU         Simuliert eine Spannungsmessung- oder Einstellung, wie beim TDMM genutzt.
handlerB         Lässt die LED_BUILTIN des D1 Mini V3 fünf Mal blinken.

 

Die Funktionen zeigen die Eingabe und Ausgabe von Daten. Sie werden ganz genau so bedient, wie die Funktionen, die Sie von meinen anderen Projekten kennen.

handlerN ist eine spezielle Funktion, die sich aus der Praxis ergeben hat. Wir kommen darauf zurück, sobald wir uns mit der Bluetooth-App beschäftigen, mit der wir unsere Projekte steuern wollen.

 

Es folgt die Anweisungstabelle für den Commandprozessor mit seiner speziellen Syntax, die wir schon bei früheren Projekten kennengelernt haben.

 

Wie gewohnt folgen unterhalb dieser Tabelle der handlerHelp. Erst dann wird das Setup vorgenommen. Die void loop() ist ganz kompakt: Sie enthält nur die Anweisung an den Commandprozessor: CP.run().

Soweit ist alles recht übersichtlich und sicher gut zu verstehen. Mit dem Programmierbeispiel wird auch klar, wie die Bluetooth-Steuerung integriert wird. Der Aufwand beschränkt sich völlig darauf, die Anweisungstabelle anzupassen. Wir werden gleich sehen, warum dies erforderlich ist.

Die Bluetooth Serial App

 

Trotz intensiver Recherche habe ich im iPhone App-Store nur diese eine, geeignete App gefunden. BT-Apps gibt es zwar zahlreich, doch nur diese eine App bietet seriellen Datenverkehr an. Ich bitte um Nachricht, falls es doch andere Apps gibt und ich diese nicht gefunden habe.

(Ein Freund bestätigte mir, dass es eine entsprechende App auch für Android gibt.)


            Foto 4: Foto der BT-App vom Mobiltelefon

 

Die App ist etwas gewöhnungsbedürftig und so darf ich das Vorgehen erklären, bevor Frust aufkommt.

Hinter Bluetooth Serial steht eine Anwendung für ATmega- oder ESP-Mikrocontroller mit eigenen Bibliotheken und Funktionen. Damit kann man „virtuelle Knöpfe“ auf dem Mobiltelefon drücken und damit Funktionen auslösen, einen Joystick benutzen und Texte ein- und ausgehend verarbeiten. Nur die letztere Funktion nutzen wir.


Für unser Projekt brauchen wir diese Bibliotheken nicht! Wir nutzen die App, wie sie kommt und dort nur den Textmodus. Wie man damit eine Anwendung erstellt, erkläre ich hier Schritt für Schritt.

Zunächst öffnen Sie die Anwendung. Sie bekommen diese Auswahl angeboten:



            Foto 5: Startscreen

 

Sie wählen bitte „Connect Board“ aus und sehen jetzt Ihren HW-10 Adapter als „BT-05“ zum Anklicken. Nachdem Sie verbunden haben - das geht ganz fix - sehen Sie eine Auswahl aktuell vorhandener Boards:



            Foto 6: Board-Auswahl

 

Wir wollen ein Board haben, das ausschließlich Textnachrichten verarbeitet. Das obere Board auf dem Foto, das symbolisch auf einem Bildschirm „123“ zeigt, ist genau was wir brauchen.

 

Wir machen jetzt einen „Schritt zur Seite“ und besprechen, wie man sich selbst ein solches Board erstellen kann, wenn es nicht angeboten wird. Ich musste es selbst erstellen.

Eigenes Board erstellen

 

Dazu betätigen Sie die Schaltfläche „+“ ganz unten am Bildschirmrand. Danach wählen Sie „Custom Board“ aus.

Sie bekommen sofort eine Auswahl angeboten mit „Rows“ und „Columns“. Bitte wählen Sie hier für beides jeweils die „1“, denn wir wollen ja nur ein Textfeld haben. Diese Auswahl treffen Sie mit „SELECT“.

Als nächstes sehen Sie einen komplett leeren Bildschirm. Etwas verwirrend …

Drücken Sie wieder die „+“-Schaltfläche und Sie sehen diesen Bildschirm, am linken Rand auch das Textfeldsymbol. Tippen Sie dort drauf und verlassen diesen Screen mit dem „Pfeil nach unten“.

Das Ergebnis sieht so aus:


            Foto 7: Text-Board

 

Nun möchten Sie die Textfunktion benutzen und tippen das „123“-Symbol einmal an. Sie sehen:


 

            Foto 8: Black-Screen

 

Verwirrend - oder? Der schwarze Kreis mit drei Strichen wird erst aufgeklappt, wenn Sie darauf tippen. Für dieses Foto habe ich es schon gemacht. Diese schwarze Fläche kann mit Funktionen aus der Library BluetoothSerial belebt werden. Wir nehmen jetzt den direkten Weg.

Hinter dem Icon, das so etwas wie einen Aktenbehälter zeigt (?), verbirgt sich das Ziel unserer Wünsche, die Textein-/ ausgabe:

            Foto 9: Text E-A

 

Im Feld „Send“ geben Sie die Anweisungen ein und schicken Sie mit „send“ an Ihren D1 Mini. Die Antworten kommen in einem etwas eigenwilligen Format zurück. Das schauen wir uns an.

Kommunikation über BluetoothSerial

 

Zur App gibt es keine wirklich gute Beschreibung und kaum Konfigurationsmöglichkeiten. Schauen wir uns die Besonderheiten an.

Jeder Anweisung wird ein „@” vorangestellt

Warum das so sein muss?! … Es bedeutet aber, dass wir die Anweisungstabellen, die wir z.B. vom TDMM kennen, nicht 1:1 übernehmen können. Sie haben sich vielleicht gefragt, warum ich im Beispielsketch jede Anweisung mit einem „@” beginnen lasse. Die App akzeptiert das leider nur so. Man kann in den Einstellungen zum Textfeld (das berühmte Zahnrädchen) durchaus das Feld für ein voran gestelltes Zeichen leeren. Dennoch kommt das „@” immer.  Auch wenn in den Einstellungen kein „@“ steht.

Also empfehle ich, die Anweisungsliste zu verdoppeln. Ein handlerXY kann von fünf verschiedenen Anweisungen aus gestartet werden. Es muss nur der richtige handlerXY eingetragen werden. Bei HELP gibt es ja auch „?“ oder „h“ als Möglichkeit.

 

Das kann dann so aussehen:

           

const MD_cmdProcessor::cmdItem_t PROGMEM cmdTable[] =

{

  { "?",   handlerHelp,  "",    "Help", 0 },

  { "@?",  handlerHelp,  "",    "Help", 0 },

  { "h",   handlerHelp,  "",    "Help", 0 },

  { "@h",  handlerHelp,  "",    "Help", 0 },

  { "st",  handlerST,  "",      "Systemeinstellungen anzeigen", 0 },

  { "@st", handlerST,  "",      "Systemeinstellungen anzeigen", 0 },

};


Mehr Mühe brauchen Sie sich auch nicht mehr zu machen. Das ist die ganze Modifikation Ihres Projektes und damit auch in laufenden Projekte prima nach zu rüsten.

 

Der Textbuffer

BLE arbeitet mit Textpuffern. Das führt dazu, dass längere gesendete Informationen - manchmal auch nur eine Zeile - nicht sofort auf dem Bildschirm dargestellt werden. Man schickt eine Anweisung - und bekommt keine Rückmeldung. Drückt man bei leeren Sendetext-Feld den „send“-Button, dann gibt der Buffer die restlichen Zeichen aus. Es ist nicht wirklich lästig, aber man sollte Bescheid wissen.

 

Das erklärt auch, warum wir eine Anweisung für handlerN geschaffen haben. Dieser Händler schickt lediglich einen LF. Damit es dabei nicht zu einer Fehlermeldung kommt, wird dieser „Leerbefehl“ in unseren Sketch aufgenommen.

Schauen wir uns ein paar Beispiele mit unserem Sketch an:



            Foto 10: @h_Help

 

Hier habe ich (erste Zeile) ein einzelnes „h“ eingegeben. Er macht ein „@h“ daraus. Weiss unterlegt ist stets die eigene Eingabe. Grün erscheinen die Rückantworten.

Was Sie als ersten Text sehen, ist „LF einstellen“. Das ist eine Nachricht, die vom Start des Rechners her rührt, der als erste Ausgabe vor der Anweisungstabelle darauf hin weist, dass am Zeilenende einer Anweisung ein LF stehen sollte, damit die Anweisung erkannt wird. Den Code dazu finden Sie in void handlerHelp(char* param) direkt vor dem void setup().

Direkt danach tut er, was er sollte, bis einschließlich der Anweisung „w“. Dann muss ich noch einmal SEND drücken (er zeigt dafür eine weiße Zeile mit einem einzelnen „@”). Dann erst kommt der letzte Teil der Anweisungsliste, die ich mit „h“ abrufen wollte.

Für längere Texte ist dieses Dialogverhalten ungeeignet. Das war auch nicht unser Ziel.

 

Hinter die Anweisung „w“ haben wir einen zweizeiligen „Hello World …“ Text gelegt. Indem wir ein einfaches „w“ versenden, wird diese Funktion abgerufen und erscheint so:


            Foto 11: @w_Hello World

Genau so wollen wir es haben.

Es gibt, wegen des Bezugs zum TDMM und dem LabSupply M401 noch eine Anweisung „u“, mit der ein Spannungswert übermittelt wird.  In unserem Fall heißt die Anweisung „u 5.0“. Bitte den „.“ beim Zahlenwert beachten.

Diese Anweisung kann so genutzt werden, um im LabSupply einen Spannungswert einzustellen. Auf dem Bildschirm sieht es so aus:



            Foto 12: @u_Eingabe_Spannung

 

Auch hier tut das System wieder genau das, was es soll.

 

Mit der Anweisung „b“ lösen Sie ein 5-faches Blinken der LEDBUILT_IN des D1 mini V3 aus.

Beim Upload eines Sketches zu beachten

Wenn Sie die Module verbunden haben und einen Sketch via USB auf den Rechner laden wollen, sollten Sie vorher unbedingt die Stromversorgung für das HW-10 Modul abhängen. Denn die Rx-Tx Anschlüsse werden über den CH340-UART für die Kommunikation benötigt. Das kann dazu führen, dass der Upload fehlschlägt.

Wer weiter experimentieren möchte

Wir hatten bereits festgestellt, dass wir die Library BluetoothSerial nicht benötigen. Wer damit experimentieren möchte, findet Informationen dazu auf der Website: https://docs.henhen1227.com/docs/intro

Das Beste kommt zum Schluss

Nachdem ich den Beitrag abgeschlossen und eingeschickt hatte, ließ es mir keine Ruhe, dass mir die Lösung zwar ganz gut gefällt, wenn man die Bibliothek „BluetoothSerial“ benutzt, um mit Buttons, Joystick und Text eine Anwendung zu bauen, aber eben nicht für reinen Text. Mit allen möglichen Suchbegriffen und KI-Unterstützung kam ich im iPhone AppStore auf die Anwendung BLESerial tiny. Diese Anwendung entspricht 100% genau dem, was Sie für die Steuerung meiner Projekte haben wollen: Eine ganz einfache App, komplett auf Text ausgerichtet. Sie brauchen sich auch nicht mehr mit einem vorangestellten „@“ zu plagen. Sie können Ihr laufendes TDMM-Projekt (oder jedes andere Projekt) einfach hernehmen, mit vier Lötstellen den HM-10 einbauen - fertig! Denken Sie daran, den HM-10 abschaltbar zu machen (elegante Lösung: Power-On-/ Off per Transistor, der an einem nicht belegten Pin angeschlossen wird). So sieht die App im AppStore aus:

 

Foto 13:  BLESerial tiny

 

Sie starten die App. Diese zeigt unter „CONNECT“ die möglichen BLE-Verbindungen an. BT05 ist dort schon erkannt. Einmal anklicken - fertig! Sie können sofort alle Anweisungen eingeben und erhalten eine saubere Textausgabe ohne Kompromisse und Bufferprobleme. Ein echter Traum! So wollten wir’s eigentlich von Anfang an haben.

 

Hier ein Dialog als Beispiel:

Foto 14: Dialogbeispiel mit BLESerial tiny

 

Nun wünsche ich Ihnen viel Spaß mit diesem Projekt und freue mich über Ihre Rückmeldungen und Kommentare. Wer z.B. ein TDMM gebaut hat, möchte vielleicht die Bluetooth - „Fernbedienung“ nachrüsten? 



Esp8266Für arduinoProjekte für anfänger

Laat een reactie achter

Alle opmerkingen worden voor publicatie gecontroleerd door een moderator

Aanbevolen blogberichten

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery