Da ich bisher noch recht wenig (also gar keine) Erfahrung mit Wireless Kommunikation auf 433MHz Basis machen konnte, habe ich mir 2x HC-12 433Mhz Funkmodule bestellt um damit eine drahtlose bidirektionale Verbindung zwischen den beiden Modulen herzustellen. Besonders die Tatsache, dass die Module eine Reichweite von bis zu 1000 Meter haben, hat mich sehr gereizt.
Technische Daten des HC-12 433Mhz Funkmoduls
- 433MHz ISM-Band Region 1 (Europa, Afrika, Nachfolgestaaten der UdSSR und Mongolei)
- Frequenz 433,4 – 473,0 MHz
- 400kHz Kanalbreite
- 100 mögliche Kanäle
- Bis 1000m Reichweite mit externer Antenne
- Versorgungsspannung: 3.2V – 5.5V
- Max. 100mW (20dBm)
- Empfänger Empfindlichkeit von -100 dBm bis -117 dBm bei 5000 bps
- Modulgröße: 27.8mm*14.4mm*4mm
- Baudrate von 1.2Kbps bis 115,2 Kbps
- UART/TTL Interface
- IPEX20279-001E-03 Standard-HF-Buchse
HC-12 433Mhz Funkmodul Anschlüsse
Pin 1 | VCC | DC 3,2V-5,5V min. 200mA |
Pin 2 | GND | Ground |
Pin 3 | RXD | UART Eingang (3,3V TTL) |
Pin 4 | TXD | UART Ausgang (3,3V TTL) |
Pin 5 | SET | Settings Pin (10k Pull-Up) |
Anschlüsse für die Antenne befinden sich auf der anderen Seite des Moduls. Hier kann man die beigefügte Antenne anlöten oder eine externe Antenne über die IPEX20279-001E-03 HF-Buchse anschließen.
HC-12 433Mhz Funkmodul AT-Kommandos
Um das Modul zu konfigurieren werden AT-Befehl verwendet. Die Konfiguration des Moduls bleibt auch nach dem Ausschalten erhalten und geht nicht verloren. Um in den AT-Modus zu wechseln muss der Pin 5 (SET) mit GND verbunden werden.
Folgende AT-Befehle stehen dann zur Verfügung:
- AT
Das übliche Test-Kommando wird mit OK vom Modul bestätigt - AT+Bxxxx
Befehl zum Ändern der UART-Baudrate.
Standardwert: 9600bps
Mögliche Werte:
1200bps
2400bps
4800bps,
9600bps
19200bps
38400bps
57600bps
115200bps
Beispiel: AT+B19200
Antwort: OK+B19200
- AT+Cxxx
Befehl zum Ändern des Kommunikationskanals der drahtlosen Verbindung
Mögliche Werte: 001 -127 (Ab einem Kanal > 100 ist die Distanz nicht garantiert)
Standardwert: 001
Beispiel: AT+C002
Antwort: OK+C002
- AT+FUx
UART-Übertragungsmodus ändern
Mögliche Werte:FU1, FU2, FU3 und FU4.
Standardmodus: FU3
Beispiel: AT+FU1
Antwort: OK+FU1
- AT+Px
Einstellen der Sendeleistung
Mögliche Werte: 1-8
Standardmodus: 8 (20dBm)
Beispiel: AT+P5
Antwort: OK+P5
- AT+Ry
Abfragen der eingestellten Parameter für Baudrate, Kommunikationskanal, Übertragungsmodus und Sendeleistung
Mögliche Werte: B, C, F, P
Beispiel: AT+RB
Antwort: OK+B9600
- AT+RX
Abfragen aller Parameter des Moduls
Beispiel: AT+RX
Antwort:
OK+FU3
OK+B9600
OK+C001
OK+RP:+20 dBm
- AT+Uxxx
Kann verwendet werden, um die Datenbits, Paritätsbits und Stoppbits der UART-Kommunikation zu konfigurieren.
Beispiel: AT+U8O1
Antwort: OK+U8O1
- AT+V
Abfrage der Modul-Firmware Versionsinformationen
Beispiel: AT+V
Antwort: www.hc01.com HC-12_V2.4
- AT+SLEEP
Dieser Befehl versetzt das Modul beim Verlassen des AT-Befehls-Modus in den Deep-Sleep. Der Betriebsstrom beträgt dann etwa 22μA, und das Modul kann die UART-Daten nicht weiterleiten. Um den Deep-Sleep Modus wieder zu verlassen, muss das Modul erneut in den AT-Befehlsmodus-Zustand versetzt werden. Durch den Wechsel in den AT-Modus mit der SET Pin verlässt das Modul automatisch den Schlafmodus.
Beispiel: AT+SLEEP
Antwort: OK+SLEEP
- AT+DEFAULT
Restore Factory Default
Beispiel: AT+DEFAULTAntwort: OK+DEFAULT
Ein erster Test
Für den ersten Test habe ich die Antennen die ein paar Male-Header auf die HC-12 Module aufgelötet und mit einem Arduino Nano verbunden. Es wird zwar empfohlen, noch einen Kondensator zwischen VCC und Masse zu setzen um die Versorgungsspannung zu glätten, aber ich habe erstmal darauf verzichtet und wie es scheint, funktioniert es auch so ganz gut.
Nur ein Arduino und 4 Jumper-Kabel sind für einen funktionierenden Testaufbau nötig.
Adruino | HC-12 |
3.3 Volt | VCC |
GND | GND |
P4 | TXD |
P5 | RXD |
Um die Kommunikation zu testen habe ich dann einfach das folgende kleine Stück C-Code von Dejan Nedelkovski übernommen, den RX und TX Port angepasst und auf beide Arduinos ausgespielt.
/*
Arduino Long Range Wireless Communication using HC-12 Example 01
by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <SoftwareSerial.h>
SoftwareSerial HC12(4, 5); // HC-12 TX Pin, HC-12 RX Pin
void setup() {
Serial.begin(9600); // Serial port to computer
HC12.begin(9600); // Serial port to HC12
}
void loop() {
while (HC12.available()) { // If HC-12 has data
Serial.write(HC12.read()); // Send the data to Serial monitor
}
while (Serial.available()) { // If Serial monitor has data
HC12.write(Serial.read()); // Send that data to HC-12
}
}
Zum Testen der Kommunikation muss man nun nur 2 serielle Monitore über die Arduino IDE starten. Nun wird alles, was wir in den ersten seriellen Monitor eingibt über die Funkverbindung an den Anderen Arduino gesendet und auf dem zweiten seriellen Monitor wieder ausgegeben.
In meinem Fall waren beide Arduinos an den gleichen Computer angeschlossen und man muss schon viel Fantasie und technisches Verständnis haben, um die Faszination in dem Moment zu verstehen, denn alles was man sieht ist, dass in einem Fenster etwas eingegeben wird und in einem anderen Fenster der Text wieder ausgegeben wird ….
Aber das war ja auch nur ein erster Test und die echte Herausforderung über eine größere Distanz steht noch aus.
HC-12 Distanz Test
Für den Test über die Distanz habe ich die Module auf Werkseinstellungen gelassen und auch keine externen Antennen verwendet. Ich wollte einfach mal prüfen, was das Modul mit der Gummiwurst (Spulenantenne) und den Werkseinstellungen so schafft. Statt des Sketches von Dejan Nedelkovski habe ich 2 unterschiedliche Sketeches auf die Module aufgespielt. Eine Sketch hat im Sekundentakt gesendet und der Andere hat kurz geblinkt, wenn etwas empfangen wurde. Auch die beiden Sketches sind super-simpel.
#include <SoftwareSerial.h>
SoftwareSerial HC12(5, 4); // HC-12 TX Pin, HC-12 RX Pin
void setup() {
Serial.begin(9600); // Serial port to computer
HC12.begin(9600); // Serial port to HC12
}
void loop() {
HC12.write(1);
delay(1000);
}
#include <SoftwareSerial.h>
const int LED = 13;
SoftwareSerial HC12(5, 4); // HC-12 TX Pin, HC-12 RX Pin
void setup() {
Serial.begin(9600); // Serial port to computer
HC12.begin(9600); // Serial port to HC12
pinMode(LED, OUTPUT);
}
void loop() {
while (HC12.available()) { // If HC-12 has data
HC12.read();
digitalWrite(LED, HIGH);
}
delay(200);
digitalWrite(LED, LOW);
}
Nun habe ich den Sender auf den Gartentisch gelegt und bin mit dem Empfänger losgegangen. Nach ca. 200 Metern wurde die Verbindung instabil und das Blinken wurde unregelmäßiger. Allerdings habe ich auch festgestellt, dass die Verbindung noch ca. 50 Meter weiter OK war, wenn ich stehengeblieben bin und die Antenne in Richtung des Senders gehalten habe. Scheinbar ist die Verbindung schlechter, wenn man sich bewegt.
Aber 200 Meter sind schon mal eine ordentliche Distanz, wenn man bedenkt, dass die Module im Werkszustand waren. Mit einem anderen Übertragungsmodus und einer externen Antenne lässt sich hier ganz bestimmt noch eine Menge rausholen.
Hinweis
Ich habe die Module von AZ-Delivery über Amazon bestellt. Dort kosten die Module etwas mehr als bei Aliexpress oder Banggood allerdings bekommt man hier Original-Teile und keine billigen Nachbauten.
Die DIY TECH BROS zeigen in dem Video „2 KM SUCCESS STORY with HC-12 – going beyond 1800 meters!“ unter https://www.youtube.com/watch?v=awOPJK5He28&t=2s dass man nach Möglichkeit keine billigen Nachbauten verwenden sollte, wenn man Reichweite benötigt und welche Antenne eine Reichweite bis zu 2 km möglich macht.
Fazit
Das HC-12 433 MHz Modul macht einen sehr guten Eindruck. Man kann sehr schnell und einfach einen Funkverbindung aufbauen und hat geeignete Möglichkeiten, die Sendeleistung, Distanz und die Übertragungsgeschwindigkeit zu steuern ohne sich gleich mit fortgeschrittenen Kommunikationsprotokollen wie z.B. I2C oder SPI befassen zu müssen. Dabei muss man aber immer berücksichtigen, dass es keine Security-Features im Übertragungskanal gibt. Jeder 433 MHz Transceiver mit den gleichen Kanal-Einstellungen in Reichweite kann Daten Senden und Empfangen. Es ist also eine Art Broadcast (https://de.wikipedia.org/wiki/Broadcast) Kommunikation in der Jeder Teilnehmer mit jeden anderen Teilnehmer in Reichweite kommuniziert.