HC-05 Bluetooth Verbindungsprobleme

Hallo Freunde,
ich habe gemäß dieser Anleitung

alles verkabelt, den Sketch geladen bei getrenntem HC-05 Modul, Verbindung aufgebaut mit der App "Arduino Bluetooth Controller". Verbindung steht, Schalter sind wie im Sketch mit 1 und 2 für On und off belegt. Alles sieht schick aus, Das Modul blinkt alle 2 s, wies sein soll. Nix passiert. Was mache ich falsch???,
hier noch mal der Sketch

#define ledPin 9



char zeichen;               // In diese Variable wird die Eingabe gespeichert



void setup() {

  Serial.begin(38400);                         // Standardgeschwindigkeit vom HC05

  Serial.println("bluetooth verfügbar");

  pinMode(ledPin, OUTPUT);

}



void loop() {

  if (Serial.available()) {                    //Wenn Kommunikationspartner vorhanden...

    zeichen = Serial.read();                   // Lese Eingabe ein

    if (zeichen == '1') {                    // Wenn Eingabe = 1 mach LED an...

      digitalWrite(ledPin, 1);

      Serial.println("LED an Pin 13 ist an");

    }
     
    if (zeichen == '2') {                    // Wenn Eingabe = 2 mach LED aus

      digitalWrite(ledPin, 0);

      Serial.println("LED an Pin 13 ist aus");

    }

  }



  delay(1000);

}

Wenn ich den seriellen Monitor zuschalte, kriege ich nur kryptische Zeichen
Seid lieb, es ist Ostern, legt mir ein erkenntnisreiches Ei :wink:

schorsch55:
Wenn ich den seriellen Monitor zuschalte, kriege ich nur kryptische Zeichen

Das ist kein Wunder, wenn du die serielle Schnittstelle doppelt verwendest.
Entweder USB und PC, oder eben BT-Modul.

Und sieh dir mal deinen Link an, der funktioniert so nicht.

Edit:
Man sollte nicht allen Tutorials glauben, dass es auch sicher funktioniert.
Verwende für die Verbindung zu den BT-Modulen die Software-Serial.

Dieser Link sollte funktionieren.
Und der kranke Code steht da tatsächlich so.

@Schorsch: Die kryptischen Zeichen würdest Du vielleicht wegbekommen, wenn Du Deinen seriellen Monitor auch auf 38400bps stellst (rechts unten).

Aber das ist nicht die korrekte Lösung, denn alle Serial.print() gehen nicht nur auf den Monitor, sondern auch an das HC05-Modul. Die Frage ist, ob Du auf der Gegenseite mit dem Text "bluetooth verfügbar" was anfangen kannst.
Du brauchst eine zweite serielle Schnittstelle. Am Mega gibt es die in Hardware, an Uno/Nano nimmst Du z.B. SoftwareSerial. In jedem Fall zwei andere Pins, z.B. 10 und 11 (am Uno) verwenden.

Ich habe Deinen Sketch angepasst hier liegen - kompiliert, aber nicht getestet.
Aber ich hoffe, Du willst es erst selbst probieren.

Hallo Walter,
danke für die Linkkorrektur. Habe es jetzt mit SoftwareSerial probiert. Verbinden klappt, aber ich mache wohl einen Fehler beim Lesen der App-Eingaben, habe mich da "verfranzt". Der hat zwar ohne Fehler kompiliert und hochgeladen, aber- nix da.

#include <SoftwareSerial.h>
const int BTRX = 11;   // für den RX
const int BTTX = 10;   //für den TX am BT-Modul
const int ledPin = 12;
char zeichen;               // In diese Variable wird die Eingabe gespeichert
SoftwareSerial SerialBT (BTRX, BTTX);  // [color=#ff0000]hier bin ich mir auch nicht sicher[/color]

void setup() {
  SerialBT.begin(38400);                         // Standardgeschwindigkeit vom HC05
  Serial.println("bluetooth verfügbar");
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available()) {                    //Wenn Kommunikationspartner vorhanden...
    zeichen = SerialBT.read();                   // Lese Eingabe ein ,[color=#ff0000]OB das so richtig ist??[/color]
    if (zeichen == '1') {                    // Wenn Eingabe = 1 mach LED an...
      digitalWrite(ledPin, 1);
//      Serial.println("LED an Pin 12 ist an");
    }
    if (zeichen == '2') {                    // Wenn Eingabe = 2 mach LED aus
      digitalWrite(ledPin, 0);
//     Serial.println("LED an Pin 13 ist aus");
    }
  }
  delay(1000);
}

Deinen Link solltest du aber auch in deinem Post reparieren.

Und was genau heißt "nix da" ?
Was geht und was geht nicht. Bitte immer etwas genauer beschreiben, wir können nicht auf deinen Arbeitsplatz sehen.

Na, das erste Problem ist noch ein einfaches:
Du wartest auf der "Debug" (Hardware-) Schnittstelle Serial, ob ein Byte eingelaufen ist (Serial.available()). Eigentlich willst Du aber vom Bluetooth-Modul lesen, die Schnittstelle heißt aber anders: SerialBT.available().
Sowas passiert schon mal und beim eigenen Code lesen ist man schnell mal blind.

Der Kommentar dahinter ist übrigens nicht ganz richtig: Der Partner ist immer vorhanden; die Funktion liefert die Anzahl bereits empfangener Bytes.

Bei Rx/Tx musst Du über Kreuz arbeiten: Tx vom Arduino geht an Rx vom HC05 und Rx vom Arduino an Tx vom Modul.

Sonst sieht es gut aus - solange nicht innerhalb einer Sekunde mehr Bytes einlaufen als der interne Puffer von SoftwareSerial aufnehmen kann. Das delay() am Ende kannst Du entfernen: Wenn kein Byte da, dann passiert auch nix.

Hallo Walter,
ich habe mal korrigiert. Das mit über Kreuz verstehe ich jetzt nicht ganz, das müsste doch über die
const int BTRX = 11;
const int BTTX = 10; definiert sein. Ich schicke mal den Fritzing-Plan mit. Und du hast sowas von Recht mit dem "blind". Habe ich schon als Dozent früher gemerkt, wenn du zu lange auf eine fehlerhafte Formel guggst, siehst du den Fehler nie mehr.

schorsch55:
Hallo Walter,
ich habe mal korrigiert. Das mit über Kreuz verstehe ich jetzt nicht ganz, das müsste doch über die
const int BTRX = 11;
const int BTTX = 10; definiert sein. Ich schicke mal den Fritzing-Plan mit. Und du hast sowas von Recht mit dem "blind". Habe ich schon als Dozent früher gemerkt, wenn du zu lange auf eine fehlerhafte Formel guggst, siehst du den Fehler nie mehr.

Über kreuz heißt RX BT-Modul an TX Arduino, TX BT-Modul an RX Arduino.

Upps, vergessen anzuhängen, ich will den Fritzing-Plan als jpg mit hochladen, aber der Admin gibt rote Fehlermeldung aus, Wie den das jetzt wieder??

Sollen wir die Fehlermeldungen erwürfeln?
Bild zu groß? Mal als png probieren.

Gruß Tommy

Vermute ich auch: Wahrscheinlich das Bild zu groß.
Du hast Rx auf Pin 11 definiert, Tx auf 10.
Dann sollte beiliegendes FZZ (Eweiterung .txt bitte entfernen) das korrekt illustrieren.

Uno-HC05-RxTx.fzz.txt (1.78 KB)

Nächster Versuch, die jpg ist 300 kb, als < 2MB. Ich probier eine png

Da haben wir es doch: Pin 11 ist im Sketch Rx und der ist an Rx vom Modul verbunden.
An nur(!!!) einem Ende grün und gelb vertauschen - und glücklich werden :slight_smile:

schorsch55:
Nächster Versuch, die jpg ist 300 kb, als < 2MB. Ich probier eine png

Liest du auch mal unsere Beiträge/Antworten ?

Hallo Dieter,
verstehe deine letzte Frage nicht, wenn ich sie nicht lesen würde...
Hallo Walter,
habe getauscht, kompiliert- fehlerfrei, hochgeladen- fehlerfrei, mit App verbunden -connected, Schalter in app, der mit 1 definiert ist - led bleibt aus. LED noch mal schnell mit einem Blinkdings getestet, geht. Mir fällt nix mehr ein, ist BT wirklich so kompliziert?

Nee, BT an sich ist nicht kompliziert.

Mögliche Fehlerquellen, die ich mir vorstellen kann:

  • Getauscht heißt nicht, die Pin-Definitionen im Sketch zu ändern, sondern die Kabel - nur zur Sicherheit ob wir uns richtig verstehen ;).
  • Kommentiere mal die serielle Ausgabe Deines LED-Status an den seriellen Monitor wieder ein - dann siehst Du, ob die 1 oder 2 angekommen ist.
  • Lt. Deinem Fritzing-Bild hängt die LED in der Luft und nicht an D12 - und der Vorwiderstand (330 oder 560 Ohm) fehlt.

Ein Foto Deines tatsächlichen Aufbaus wäre jetzt hilfreich.

Wenn das nicht hilft, müssen wir mal nachsehen, was Deine App tatsächlich sendet. Dat kriegen wir später.

schorsch55:
Hallo Dieter,
verstehe deine letzte Frage nicht, wenn ich sie nicht lesen würde...

In meinem Post #7 hatte ich dir geschrieben, wie du die Leitungen schalten sollst.
Im Bild hast du es wieder falsch gezeichnet.

Hallo Dieter,
Menschen machen Fehler, d.h. nicht, dass ich deinen Post nicht gelesen hätte, ich hab ihn nur nicht richtig verstanden.
Hallo Walter,
ich habe schon nur an einem Ende getauscht, sonst wäre ja das gleich Problem geblieben. Die serielle Ausgabe wieder aktiviert - keine Meldung. Nehme ich in
SerialBT.begin(38400); // Standardgeschwindigkeit vom HC05
Serial.println("bluetooth verfügbar"); das BT raus, also Serial.begin(38400), dann kommt die Ausgabe "bluetooth verfügbar". Die 1 bzw. 2 werden nicht angezeigt
Ich hoffe, das Foto vom Aufbau ist deutbar

schorsch55:
Hallo Dieter,
Menschen machen Fehler, d.h. nicht, dass ich deinen Post nicht gelesen hätte, ich hab ihn nur nicht richtig verstanden.

Ja.....klar. sorry wenn ich nicht deutlich genug war. Kommt nicht wieder vor.

Rx/Tx sind okay.
Die LED scheint tatsächlich an Pin 12 zu hängen - da war also Dein Fritzing falsch. Der Vorwiderstand fehlt leider immer noch.
Ist das "bluetooth verfügbar" vorher auf Deiner App angekommen?

Ich habe mal Deinen Sketch aus #3 um zwei Zeilen ergänzt:
Einmal im setup() die Initialisierung der Schnittstelle zum Monitor (115200) und direkt nach Einlesen des 'zeichen' die Ausgabe des Bytes das da reingekommen ist als HEX-Wert (damit die Steuerzeichen nix kaputt machen).
Außerdem habe ich den delay stillgelegt, den braucht man nicht.

#include <SoftwareSerial.h>
const byte BTRX = 11;   // für den RX
const byte BTTX = 10;   //für den TX am BT-Modul
const byte ledPin = 12;
char zeichen;               // In diese Variable wird die Eingabe gespeichert
SoftwareSerial SerialBT (BTRX, BTTX);  // 

void setup() {
  Serial.begin(115200); // hier darf es gerne schnell sein, damit der HC05 uns nicht überholt
  SerialBT.begin(38400);                         // Standardgeschwindigkeit vom HC05
  Serial.println("bluetooth verfügbar");
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (SerialBT.available()) {                    //Wenn Kommunikationspartner vorhanden...
    zeichen = SerialBT.read();                   // Lese Eingabe ein
    Serial.println(zeichen, HEX);
    if (zeichen == '1') {                    // Wenn Eingabe = 1 mach LED an...
      digitalWrite(ledPin, 1);
      Serial.println("LED an Pin 12 ist an");
    }
    if (zeichen == '2') {                    // Wenn Eingabe = 2 mach LED aus
      digitalWrite(ledPin, 0);
      Serial.println("LED an Pin 13 ist aus");
    }
  }
  //delay(1000);
}

Damit sollte sichtbar werden, ob überhaupt was von der App ankommt und wenn ja, was genau.
Bitte ausprobieren und die Ausgabe vom seriellen Monitor in code-Tags bereitstellen.