Diese Seite ist Teil des Projekts Automatische Gewächshauslüftung.

Das HC-05 ist ein preiswertes Bluetooth-Modul zum Aufbau einer drahtlosen seriellen Verbindung. Neben der "Roh-Fassung" ist es auch als Breakout-Board erhältlich. Auf Grund der auf dem Board angebrachten Spannungsregler und Schutzschaltungen ist hierbei auch Spannungsversorgung von 5 V möglich. Auch die Eingänge können mit 5 V betrieben werden. Die Ausgänge liefern natürlich weiterhin nur 3,3 V. Diese Spannung reicht aber aus, auch bei mit 5 V betrieben Geräten sicher zwischen 0 und 1 unterscheiden zu können.

HC-05 Breakout  Datenblatt

Je nach Board werden zwischen 5 und 6 Pins herausgeführt. Dies sind

Auf der Rückseite des Boards befindet sich eine blaue LED (an PIO8), die den Verbindungsstaus anzeigt:

Im fabrikneuen Zustand hat das Gerät den Namen "HC-05", arbeitet im Slave-Modus, wartet also, dass von außen eine Verbindung aufgebaut wird,  und überträgt mit 9600 Baud. Schaltet man in den AT-Mode ist die Übertragungsrate 37800 Baud. Das Passwort ist "1234". Bei Makezine und Google Docs habe ich die folgende Dokumentation gefunden, die vieles erklärt.

Interessant ist das Umschalten in den AT-Modus und zurück. Hierfür ist der Eingang mit der Bezeichnung "Key" zuständig. Liegt dieser Eingang auf low befindet sich der HC-05 im normalen Übertragungsmodus. Wird dieser Eingang auf high gelegt, wechselt er in den AT-Modus.

Das Umschalten in den AT-Modus klappt prinzipiell im auch im lfd. Betrieb. Dann ist die Baudrate identisch mit der regulären Übertragungsrate. Zum zurückschalten muss der Key wieder auf low gelegt werden und "AT+RESET" gesendet werden. Diese Umschaltmethode hat bei mir nicht einwandfrei geklappt. Erst nach der Übertragung von 2 - 3 Mal "AT", jeweils mit einer längeren Pause dazwischen, ist das Gerät in den AT-Modus gewechselt. Außerdem kann man diese Methode nicht anwenden, wenn die Baudrate nicht bekannt ist.

Zuverlässig hat es geklappt, wenn man das Modul von der Stromversorgung getrennt hat, Key mit dem passenden Wert belegt hat und danach die Stromversorgung wieder eingeschaltet wurde. Da der HC-05 problemlos über einen auf Output geschalteten MCU-Pin mit Strom versorgt werden kann, ist es kein Problem, diese Methode in einer Applikation anzuwenden. Die Trennung von der Stromversorgung muss genügend lange erfolgen, damit alle Kondensatoren zuverlässig entladen werden.

Das folgende Programm dient zum Test der Ansteuerung eines HC-05. Zeichen, die von der regulären seriellen Arduino-Schnittstelle empfangen werden, werden an den HC-05 weitergeleitet, der über eine serielle Software-Schnittstelle verbunden ist (Pins HC05_RX und HC05_TX). Zeichen, die von der serielle Schnittstelle gesendet werden, werden dorthin zurück übertragen (Echo).

Wird ein '@' gesendet, wird der HC-05 in den AT-Modus umgeschaltet. Ein '$' schaltet ihn zurück in den Übertragungsmodus.

Das Umschalten geschieht durch

Das Atmel Studio-Projekt zum Download. Die Zeitentabelle für das Modul SoftwareSerial musste ich anpassen, da die Übertagung ansonsten nicht einwandfrei funktionierte. Hier muss also geprüft und ggf. angepasst werden.

/*
 * HC-05 Control
 *
 * hc-05-control.cpp
 *
 */

#include "Arduino.h"
#include "AppVersion.h"
#include "SoftwareSerial.h"


/*
Das folgende Programm dient zum Test der Ansteuerung eines HC-05.
Zeichen, die von der regulären seriellen Arduino-Schnittstelle empfangen werden,
werden an den HC-05 weitergeleitet, der über eine serielle Software-Schnittstelle
verbunden ist (Pins HC05_RX und HC05_TX). Zeichen, die von der serielle Schnittstelle gesendet werden,
werden dorthin zurück übertragen (Echo).

Wird ein '@' gesendet, wird der HC-05 in den AT-Modus umgeschaltet.
Ein '$' schaltet ihn zurück in den Übertragungsmodus.

Das Umschalten geschieht durch
- Trennen von der Stromversorgung (Pin HC05_POW)
- Serielle Datenübertragung zum HC-05 beenden
  (Die Schnittstelle muss mit einer neuen Baudrate neu initialisiert werden)
- Wartezeit 1.000 ms
- Key mit dem passenden Wert belegen (Pin HC05_KEY)
- Stromversorgung wieder herstellen
- Wartezeit 100 ms
- ev. Übertragungsreste löschen
- Serielle Datenübertragung zum HC-05 neu initialisieren
*/

#define SerialBaud 9600
#define HC05_Baud 9600
#define HC05_RX 2
#define HC05_TX 3
#define HC05_KEY 7
#define HC05_POW 6

SoftwareSerial SoftwareSerial(HC05_RX, HC05_TX); // RX, TX

void setup()
{ pinMode(HC05_POW, OUTPUT);    // Pins zur Kontrolle des HC-05 auf Output
  pinMode(HC05_KEY, OUTPUT);

  digitalWrite(HC05_POW, HIGH); // Stromversorgung für den HC-05 einschalten
  digitalWrite(HC05_KEY, LOW);  // HC-05 in den Normal-Modus versetzen

  Serial.begin(SerialBaud);     // Serielle Schnitstelle öffnen

  SoftwareSerial.begin(HC05_Baud); // Serielle Software-Schnittstelle öffen
  Serial.println("");


  Serial.println(F("HC-05: Serial-IO ready. Version: " VERSIONSTRING));
  Serial.print(F("Normal-Mode, Baudrate: "));
  Serial.println(HC05_Baud);
  Serial.print(F("TX Pin ")); Serial.println(HC05_TX);
  Serial.print(F("RX Pin ")); Serial.println(HC05_RX);
}

void loop() // run over and overchar c;
  if (SoftwareSerial.available())
    { c = SoftwareSerial.read();
      Serial.write(c);
    }

  if (Serial.available())
   { c = Serial.read();

     if(c == '@') // in den AT-Modus schalten
     { Serial.println(F("Wait..."));
       digitalWrite(HC05_POW, LOW);
       SoftwareSerial.flush();
       SoftwareSerial.end();
       delay(1000);

       digitalWrite(HC05_KEY, HIGH);
       digitalWrite(HC05_POW, HIGH);
       delay(100);

       Serial.flush();
       SoftwareSerial.begin(38400);
       Serial.println(F("Switched to AT-Mode"));

       return;
     }

     if(c == '$') // in den Normal-Modus schalten
     { Serial.println(F("Wait..."));
       digitalWrite(HC05_POW, LOW);
       SoftwareSerial.flush();
       SoftwareSerial.end();
       delay(1000);

       digitalWrite(HC05_KEY, LOW);
       digitalWrite(HC05_POW, HIGH);
       delay(100);

       Serial.flush();
       SoftwareSerial.begin(HC05_Baud);
       Serial.println(F("Switched to Normal-Mode"));

       return;
     }

     SoftwareSerial.write(c);
     Serial.write(c);
   }
}