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)
- 1200 b/s
- 2400 b/s
- 4800 b/s
- 9600 b/s
- 19200 b/s
- 38400 b/s
- 57600 b/s
- 115200 b/s
Ü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.
- Übertragungsrate 9600 b/s
- Channel 001
- Modus 3
- Sendeleistung 8
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");
*/
}