HC05 BT Modul geht nicht in den AT Modus

Hallöchen :slight_smile:
Ich habe mir auf Amazon vor kurzem ein HC05 Bluetooth Modul bestellt und kann mich mit ihm nicht über mein Android Smartphone verbinden, da sich das HC05 im "Master" Modus befindet...
Ich hab nun seit mehreren Stunden im Internet gesucht, wie ich den AT starte um in den "Slave" Modus zu wechseln... Leider ohne Erfolg. Ich habe alle möglichen Varianten schon ausprobiert: zbsp EN mit 3.3V verbinden, auf dem Daughterboard Pin 34 mit 3.3V verbinden, das Knöpfchen gedrückt halten (immer eins davon und dann erst VCC mit 5V verbinden) aber die onBoard-LED signalisiert mir immer noch nicht im AT zu sein und die Befehle einfach so zu senden klappt auch nicht :frowning:
Ich habe auch schon beide Arduinos (Uno und Mega) angeschlossen...

Weiß jemand, was ich falsch mache, bzw. ob da was kaputt ist?

Hoffe, ich habe alles geschrieben, was ihr wissen müsst... Ich frage das erste mal in einem Forum :confused:

Liebe Grüße
JBN

Willkommen im Forum!

Normalerweise ist das HC05 als Slave konfiguriert und muss von Hand auf Master umgestellt werden.

Ich hab mich immer an diese Anleitung gehalten:

https://arduino-hannover.de/2013/07/20/bluetooth-kochbuch-fur-arduino/

Wenn du unter Android die Geräteadresse des BT herausbekommst kannst du das Modul auch als Master lassen und es sollte sich automatisch mit deinem Handy verbinden sobat du BT einschaltest. Hab das aber bis jetzt nur mit einem HC06 getestet und noch nicht mit einem Handy.

Gruß

Hallo, danke für die schnelle Antwort.

Meins scheint allerdings doch im Master-Modus zu sein. Wenn ich mich mit ihm über Handy verbinden will, wird mir nur angezeigt: "BT05 hat die Verbindung abgelehnt". Ich denke, wenn ich es schaffe ihn in den Slave Modus zu befördern, dann kann ich mich damit auch verbinden. Oder sehe ich das falsch?
Aber wie gesagt, schaffe ich es nicht mal den Chip im, auf deiner empfohlenen Seite, genannten "ProgrammierModus" zu starten...

Die einzige Möglichkeit, die ich bis jetzt gefunden habe, ist die App "Serial Bluetooth Terminal" (Link zum PlayStore)
Da erkennt der Chip sogar meine Befehle. Nur AT-Befehle natürlich nicht .Bis jetzt habe ich auf dem Arduino Mega auch nur ein Sketch zu laufen, dass die Befehle, die ich ihm über die App gebe, wieder zurück gegeben werden. Und das klappt (fast) einwandfrei.
Allerdings würde ich mich gerne richtig mit dem HC05 über die normalen Bluetooth Einstellungen des Android Systems koppeln können.

Wenn du die AT Befehle schickst musst du glaub ich immer die Eingabe mit "Enter" und "Neue Zeile" abschließen. Sprich anstatt "Serial.print" dann "Serial.println" einsetzen.

Zeige mal einen Sketch vom Mega.

Gruß

Die AT-Befehle schicke ich ja über Bluetooth mit der App. Über den Sketch habe ich es noch nicht probiert. :roll_eyes: könnte ich ja auch mal probieren. Meinen derzeitigen Sketch habe ich ja wirklich nur, um zu gucken, ob die Kommunikation zwischen der App und dem Chip klappt.

Hier der Code:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10,11);

void setup()
{

mySerial.begin(9600);
}

void loop()
{
char c = mySerial.read();
delay(300);
mySerial.write(c);

}

Allerdings schickt das Arduino (insofern man ihn nicht füttert) mit diesem anscheinend fehlerhaften Skript immer nur “�” dieses Fragezeichensymbol im Takt von (logischerweise) 300ms zurück.
Aber wenn man ihn füttert, beispielsweise mit “hallo”, dann kommt auch ein freundliches “hallo” zurück.

Wenn du ein Hallo zurückbekommst hat das nichts mit Freundlichkeit zu tun sondern mit deinem falschen Programm. Du schickst dir selbst die Nachricht und nicht dem Modul.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); 

void setup()  
{
  
  Serial.begin(38400);
  while (!Serial) {
    
  }

  mySerial.begin(38400);
  
}

void loop() 
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

So sollte das aussehen wie im Beispiel der Library.

Nagut, das ist jtzt von BT Terminal zu USB Terminal(und umgekehrt). Ich wollte halt zum probieren einfach nur einen Text schreiben und den dann auch wieder zurück bekommen. Als ob ich TX mit RX verbinde. Aber nur am Bluetooth Terminal. Trotzdem danke, erfüllt ja den gleichen Zweck. Musste allerdings beide Baudraten auf 9600 im Skript stellen, damit beidseitig wieder ein vernünftiges hallo herauskommt. Ist das jetzt schlimm?

Nein aber in der Doku auf der verlinkten Seite steht:

Zum Konfigurieren des HC05-Moduls wieder das oben genannte Beispielprogramm zum Softserial laden und jetzt die Kommunikation mit dem Softserial-Anschluß des Bluetooth-Modules auf 38400 Baud stellen, und auf den Arduino uploaden. Wie oben beschrieben das Bluetooth-Modul mit dem Arduino verbinden und zusätzlich den Pin KEY mit +3,3 V verbinden.

Also scheint das Konfigurieren nur mit der Geschwindigkeit zu funktionieren wenn das passt kann auch eine andere gewählt werden.

Ok alles klar, Danke für deine Hilfe bisher.

Aber irgendwie weichen wir gerade vom Thema ab ???
Und zwar in den AT zu starten, obwohl mein 34er Pin bzw. EN Pin anscheinend nicht funktionieren.
Wüsstest du (oder jemand anderes da vllt einen anderen Weg?

achsoo… und wo wir ja jtzt doch schon mal dabei sind, wie frage ich den Wert hallo von serial.read ab, sodass ich es in in ( ist zwar falsch, aber nur zur Veranschaulichung) if (serial.read() == hallo {digitalWrite(ledPin, HIGH)}; beispielsweise benutzen kann, um eine LED zum leuchten zu bringen?

JoBobNenner:
achsoo... wie frage ich den Wert hallo von serial.read ab?

Serial.read liefert allerhöchstens einen einzelnen Buchstaben zurück.

michael_x:
Serial.read liefert allerhöchstens einen einzelnen Buchstaben zurück.

Naja...
Bei dem in Posting #5 vorgestelltem Programm wird *.read() wohl meist den Integer Wert -1 zurück liefern.

Naja, was heißt abfragen, ich glaube ich hab meine Frage falsch gestellt… Entschuldigt.
Ich möchte über die Bluetooth Serial App ein Wort (“on” zum Beispiel oder halt “hallo” :slight_smile: ) an das HC05 schicken, sodass eine LED an sagen wir mal Pin 13 aufleuchtet
Habe es jetzt hiermit probiert:

#include <SoftwareSerial.h>

 

#define ledPin 13

#define rxPin 10

#define txPin 11

 

SoftwareSerial btSerial(rxPin, txPin);

String btData;

 

void setup() {

  btSerial.begin(9600);

  btSerial.println("bluetooth available");

  pinMode(ledPin,OUTPUT);

}

 

void loop() {

  if (btSerial.available()){

    btData = btSerial.readString();

      if(btData=="on"){

        digitalWrite(ledPin, HIGH);

        btSerial.println("LED on Pin 13 is on");

      }

      if (btData=="off"){

        digitalWrite(ledPin,LOW);

        btSerial.println("LED on Pin 13 is off");

      }

    }

    delay(100);

}

Aber wieder ohne Erfolg. Weder die LED geht an, noch bekomme ich eine Rückmeldung.

Heißt, es würde theoretisch nur gehen, wenn ich statt “on” eine “1” oder eine andere Zahl hätte?

if(btData=="on")

So funktioniert in c/C++ der Stringvergleich nicht.

Vielleicht suchst du ja: strcmp()

combie:
So funktioniert in c/C++ der Stringvergleich nicht.

Vielleicht suchst du ja: strcmp()

Hatte den Code von diesem Blog hier, ich dachte dann wirds schon stimmen

combie:
So funktioniert in c/C++ der Stringvergleich nicht.

Vielleicht suchst du ja: strcmp()

Hmmm... Kann ich denn die Codes einfach so in die Arduino IDE übernehmen? Ich schreibe die Codes normalerweise über einen Text-Editor am Handy und lade die Sketches dann mit ArduinoDroid via OTG aufs Board.
Und ich habe mal weiter gesucht: In den Standard-Examples von arduino.cc habe ich das hier gefunden und das Script vom Blog (Link in Post#15) ist aufgebaut nach genau dem gleichen Prinzip vom String her und so.

OK!

Du verwendest das readString() ...
Vorher nur read(), den Wechsel habe ich übersehen.

Alles gut... :slight_smile:

Najaa und wie komme ich jtzt nun weiter? Habe es jetzt auch schon mit einzelnen Zahlen probiert. Funzt auch nicht... :confused:

Habe hier ein Skript, das funktioniert doch noch super:

   char data = 0; //Variable for storing received data

void setup() 

{

  Serial.begin(9600); //Sets the data rate in bits per second (baud) for serial data transmission

  pinMode(13, OUTPUT); //Sets digital pin 13 as output pin

}

void loop()

{

  if(Serial.available() > 0) // Send data only when you receive data:

  {

    data = Serial.read(); //Read the incoming data and store it into variable data

    Serial.print(data); //Print Value inside data in Serial monitor

    Serial.print("\n"); //New line 

    if(data == '1') //Checks whether value of data is equal to 1 

      digitalWrite(13, HIGH); //If value is 1 then LED turns ON

    else if(data == '0') //Checks whether value of data is equal to 0

      digitalWrite(13, LOW); //If value is 0 then LED turns OFF

  } 

 

}

Aber beachtet, dass RX und TX die Normalen RX (D0) und TX(D1) am Arduino sind. Aber das kann man ja nach belieben ändern mit Softserial

Edit: sorry, ich hab es ja gleich bemerkt, aber muss ja immer fünf min warten... Jetzt ist es doch hoffentlich human-readable... :slight_smile:
Ändert sich die Wartezeit, wenn ich aktiver im Forum werde?