Ein einfaches Arduino Uno HC-05-System funktioniert nicht

Ich habe ein Arduino Uno, HC-05-Modul und eine LED. Ich möchte den HC-05 mit meinem Telefon verbinden und mit einer App die LED ein- und ausschalten und gleichzeitig eine Nachricht vom Arduino an das Telefon senden, dass die LED aktualisiert wurde.

Ich habe diese Schaltung gebaut: (Aber Rx ist Pin 12 und TX ist Pin 13 und stattdessen mit 1kΩ und 2kΩ Widerständen) thDer HC-05 blinkt richtig (also gehe ich davon aus, dass er nicht kaputt ist).

Hier ist der Arduino-Code: Geben Sie hier die Bildbeschreibung ein(Ich habe versucht, den Code mit der Codebeispiel-Schaltfläche einzufügen, aber es hat nicht richtig funktioniert, sorry)

Jetzt habe ich zwei Probleme mit dem System:
- bt.println(...) sollte Text an das Telefon senden, aber die Telefonseite empfängt nichts.
- Serial.println (LEDState) sollte drucken, was das Telefon an das Arduino gesendet hat, und es tut es, aber es sind alles ASCII-Zeichen und werden in neuen Zeilen gedruckt.

Ich glaube, die Probleme hängen mit der Baudrate zusammen, aber ich habe versucht, 9600, 38400 und beide gemischt zu verwenden, aber es funktioniert nicht. Ich habe auch versucht, die Plätze von Rx und Tx in der SoftwareSerial-Initialisierung umzukehren.

Das Rx-Argument steht an erster Stelle in der Software-Serial-Deklarationszeile - stellen Sie sicher, dass dies in Ihrer Hardware korrekt ist. Überprüfen Sie auch, ob die Widerstände an die richtigen Pins angeschlossen sind - Sie haben möglicherweise die Deklaration umgekehrt, aber der Widerstandsteiler ist möglicherweise immer noch falsch. Ein Bild von Ihrem Setup würde hier wirklich helfen.
@QuickishFM Ich habe die SoftwareSerial RX- und TX-Positionen korrigiert, aber jetzt werden nirgendwo Informationen gesendet oder empfangen.
Könnten Sie versuchen, printlndurch zu ersetzen write? Bitte geben Sie auch ein Bild an, das zeigt, was der Arduino zurücksendet (die "ASCII-Zeichen und neuen Zeilen"), nur damit es klarer ist, zu debuggen, was Sie hier meinen
@QuickishFM Ich habe alle println auf schreiben geändert (außer Serial.println (LEDState), weil es mir nicht erlaubt war) und es fließen immer noch keine Informationen. Ich habe auch versucht, die Baudrate auf 38400 zu ändern, aber es hat nicht funktioniert.
Können Sie eine Verbindung zum HC-05 über eine serielle Hardware herstellen, in den AT-Modus wechseln und die UART-Rate ermitteln? Geben Sie ein AT+UART?. Verbinden Sie TX mit TX (ja, Sie haben richtig gehört) über die Widerstände und RX mit RX
Wenn ich zum Beispiel "Auto" vom Telefon sende, zeigt die serielle Arduino-Konsole es an als: 099 097 114 (aber die Nummern jeweils in einer neuen Zeile)
Gib mir eine Minute, ich werde das AT+UART-Ding machen.
@Novalium: Wenn die Code-Schaltfläche nicht funktioniert, können Sie einfach mit 4 x Leerzeichen einrücken oder, glaube ich, ``` (drei Backticks) in der Zeile davor und der Zeile danach verwenden.

Antworten (1)

Nach einem Chat mit OP zum Debuggen von Verbindungen wurde das Problem (etwas) gelöst:

HC-05 sollte angeschlossen werden:

  • VCC und GND jeweils an VCC und Masse des Arduino
  • TX des Arduino (der bezeichnete TX-Pin; das zweite Argument der SoftwareSerial-Deklaration) geht in einen Widerstandsteiler von 1k:2k, und der Ausgang geht in den RX-Pin des HC-05
  • RX von Arduino direkt in TX von HC-05

Wenn die serielle Hardware verwendet wird, um vom Serial Monitor direkt mit dem HC-05 zu sprechen (dh ihn als USB-zu-TTL-Konverter zu verwenden, indem RESET mit GROUND überbrückt wird), werden RX und TX auf dem Arduino - dem RX des Uno - umgekehrt Pin geht in den Widerstandsteiler und Unos TX geht direkt an HC-05 Tx. Wenn der Arduino eine Verbindung über Serial herstellt (normale Hardware-Seriell, die als Serial.read() und Serial.write() im Code verwendet wird), dann ist es konventionell (nicht umgekehrt), wobei Pin 0 in den TX des HC-05 und Pin geht 1 geht in den Spannungsteiler.

AT-Befehle sollten mit Newline auf "sowohl NL als auch CR" ausgegeben werden - das erwartet der HC-05 und AT-Befehle sollten mit 38400 Baud ausgegeben werden.

Es hatte sich herausgestellt, dass SoftwareSerial hier der Schuldige war, da die Verbindung des HC05 mit den seriellen Pins der Hardware funktionierte (Pin 0 an HC-05 TX und Pin 1 an HC-05 RX durch Spannungsteiler), für:

  • Direkte Kommunikation mit dem HC-05 unter Verwendung des Arduino als USB-zu-TTL-Konverter - bei 9600 Baud können Nachrichten vom Telefon über Bluetooth vom seriellen Monitor gesendet und empfangen werden

  • Das Ersetzen des ursprünglichen Codes SoftwareSerial durch nur Serial, das Einfügen eines Zeichens als Empfangspuffer und das Testen dieses Zeichens gegen '1' und '0', um die LED einzuschalten, funktionierte ebenfalls. Siehe Code unten:

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Serial link established.");

}

char recv;

void loop() { // run over and over
  if (Serial.available()) {
    recv = Serial.read();
    if (recv == '1')
      Serial.write("on"); //No newline produced here
    else if (recv == '0')
      Serial.write("off");
  }
}

Wenn Sie Strings verwenden möchten, müssen Sie ein Zeichenarray erstellen und jedes Mal, wenn Serial verfügbar ist, in ein neues indiziertes Zeichen dieses Arrays schreiben und den Indexer erhöhen - unterbrechen Sie diese Schleife, wenn '\n' (newline) empfangen und zurückgesetzt wird die Indexer-Zählvariable, zum Beispiel. Dies liegt daran, dass Serial.read() jeweils ein Zeichen zurückgibt, sodass eine ganze Zeichenfolge nicht einfach gelesen werden kann, wie es der ursprüngliche Beitrag vermuten lässt. Dies ist auch der Grund, warum Serial.println()das Zeichen nacheinander gedruckt wird, gefolgt von einem Zeilenumbruch - printlnendet mit einem Zeilenumbruch und Serial erhält jeweils ein Byte.

Der OP-Code wurde geändert, um die normale serielle Hardware für die Kommunikation mit dem HC-05 zu verwenden, wodurch die Verwendung der seriellen Software vermieden wurde. Wenn jemand weiß, warum Software Serial dies verursacht, kommentieren Sie bitte warum.