Arduino Mikrocontroller Tutorials - Module

HC-12 Funkmodul

HC-12 Funkmodul

Das HC-12 ist ein Funkmodul das sehr einfach in der Anwendung ist und mit über einem Kilometer Reichweite gleichzeitig sehr leistungsstark. Man benötigt keine eigene Bibliothek sondern man steuert das Modul über eine serielle Schnittstelle (UART) an. Das Protokoll zum senden und empfangen der Daten mit 433Mhz läuft komplett im Hintergrund zwischen zwei HC12-Modulen.

Das HC-12 hat nur 5 Anschlüsse. Die Spannungsversorgung VCC(+5V) und GND, die UART Anschlüsse RX und TX und zum ändern der Einstellungen einen SET Pin. Der RX und TX Anschluss kann an der hardware UART Schnittstelle des Arduinos angeschlossen werden. Wenn man wie beim Uno nur eine solche Schnittstelle hat und diese für die Programmierung und zur Kommunikation mit dem PC verwendet kann mit der Bibliothek SoftwareSerial.h eine zusätzliche Schnittstelle softwareseitig emuliert werden.

Einstellungen ändern

Mit AT Befehlen kann man die Einstellung des HC-12 Moduls anpassen. Damit die Befehle ausgeführt und nicht übertragen werden muss der SET Pin zur Änderung der Einstellungen auf GND gelegt werden. Im Anschluss an eine 200ms Pause werden dann die Befehle mit myHC12.write("AT+xxxxx") übertragen. Sollen mehrere Befehle übertragen werden folgt nach jedem Befehl eine Pause von mindestens 200ms.

Ändern der Übertragungsrate (Baudrate)

Mit AT+B9600 wird die Baudrate der seriellen Schnittstelle geändert. Folgende Baudrate können ausgewählt werden (mit Änderung der seriellen Baudrate ändert sich auch die Over the Air Baudrate)

Übertragungsfrequenz einstellen (Channel)

Beim HC-12 Modul kann die Übertragungsfrequenz zwischen 433.4 und 473.0 MHz in 400 Hz Schritten eingestellt werden. Mit AT+C001 nimmt man diese Änderung mit einem Wert zwischen 001 und 100 vor.

Einstellen des Übertragungsmodus

Mit AT+FU1 wird der Modus eingestellt. Mögliche Werte sind 1,2,3 oder 4.

Übertragungsmodus 1 2 3 4
Stromverbrauch (Idle) 3,6mA 80µA 16mA 16mA
Sende-Verzögerung 20ms 500ms 4-80ms 1000ms
Mögliche Baudrate alle bis 4800 b/s alle 1200 b/s

Einstellen der Sendeleistung (Power)

Mit AT+P1 wird die Sendeleistung eingestellt. Die möglichen Einstellwerte liegen zwischen 1 und 8.

Power Level 1 2 3 4 5 6 7 8
Sendeleistung 0,8mW 1,6mW 3,2mW 6,3mW 12mW 25mW 50mW 100mW
-1dBm 2dBm 5dBm 8dBm 11dBm 14dBm 17dBm 20dBm

Aktuelle Einstellung abfragen

Mit AT+RX können alle Einstellungen abgefragt und angezeigt werden.

Auf Werkseinstellung zurücksetzen

AT+DEFAULT setzt alle Einstellungen auf die Grundeinstellung zurück.

Programmcode zum Ändern der Einstellung über die serielle Schnittstelle #include "SoftwareSerial.h" #define RX 4 #define TX 3 #define SET 2 SoftwareSerial hc12(TX, RX); void setup() { Serial.begin(115200); hc12.begin(9600); pinMode(SET, OUTPUT); digitalWrite(SET, HIGH); } void loop() { if (Serial.available() > 0) hc12.print(Serial.readString()); if (hc12.available() > 0) Serial.println(hc12.readString()); }
Programmcode zum Ändern der Einstellung im Programmablauf #include "SoftwareSerial.h" #define RX 4 #define TX 3 #define SET 2 SoftwareSerial hc12(TX, RX); void setup() { Serial.begin(115200); hc12.begin(9600); pinMode(SET,OUTPUT); // ab hier wird ein AT Befehl gesendet digitalWrite(SET, LOW); delay(200); hc12.print("AT+B9600"); delay(200); digitalWrite(SET, HIGH); } void loop() { //.... }

Programmcode zum Senden und Empfangen

Mit hc12.write() kann man einzelne Bytes an das HC-12 Modul senden, dass dieses dann per Funk weitergibt. Auch ein komplettes Array aus Bytes kann man dieser Funktion übergeben.Möchte man Buchstaben oder einen ganzen String davon übertragen verwendet man die Funktion hc12.print().

Einzelne Bytes nacheinander ließt man über die Funktion hc12.read(), einen ganzen String über hc12.readString().

#include "SoftwareSerial.h" #define RX 4 #define TX 3 #define SET 2 SoftwareSerial hc12(TX, RX); void setup() { Serial.begin(115200); hc12.begin(9600); pinMode(SET, OUTPUT); digitalWrite(SET, HIGH); } void loop() { // Kommunikation über den seriellen Monitor if (Serial.available() > 0) hc12.print(Serial.readString()); if (hc12.available() > 0) Serial.println(hc12.readString()); /* // Senden von einzelnen Bytes hc12.write(B11001101); // einem Array von Bytes (Variable, Länge) byte var[5] = {1,5,7,34,9}; hc12.write(var, 5); // Senden von Zeichen(ketten) hc12.print("Hallo"); */ }