Bauteile · 13 Min. Lesezeit

433 MHz Funkmodul Arduino: Sender, Empfänger, Antenne und Code

433 MHz Funkmodul am Arduino: FS1000A Sender und XY-MK-5V Empfänger anschließen, 17,3-cm-Antenne, Nachrichten mit RadioHead, Fernbedienung per RCSwitch klonen.

Ein 433 MHz Funkmodul ist der günstigste Weg, einem Arduino-Projekt eine Funkverbindung zu geben: Ein Set aus Sender (FS1000A) und Empfänger (XY-MK-5V) kostet sehr wenig, wird mit einer einzigen Datenleitung angeschlossen und überträgt mit einer 17 cm langen Drahtantenne ein Signal über Dutzende Meter. Funksteckdosen, Funkklingeln, Rollladen-Fernbedienungen, Tür- und Fensterkontakte sowie die Außensensoren von Wetterstationen nutzen meist dieselbe Frequenz. Mit diesen Modulen kannst du also Daten zwischen zwei Arduinos senden und außerdem die Codes der Fernbedienungen in deinem Zuhause auslesen und vom Arduino aus erneut senden.

In dieser Anleitung lernst du, wie die Module mit ASK-(OOK-)Modulation arbeiten, warum die Antenne 17,3 cm lang sein sollte und wie du sie an Arduino Uno, ESP32 und Raspberry Pi Pico anschließt. Danach sendest du mit der RadioHead-Bibliothek Text und Sensordaten zwischen zwei Arduinos, liest mit der RCSwitch-Bibliothek den Code einer Funksteckdose aus und klonst ihn, erfährst, wie du die Reichweite erhöhst, und vergleichst das Modul mit dem nRF24L01.

Was ist ein 433 MHz Funkmodul und wie funktioniert es?

Das Set besteht aus zwei getrennten Platinen. Der kleine, quadratische Sender FS1000A (auch als XY-FST verkauft) schaltet je nach Signal an seinem DATA-Pin eine Trägerwelle von 433,92 MHz ein und aus. Der längere Empfänger XY-MK-5V fängt dieses Signal aus der Luft auf und gibt es an seinem DATA-Pin wieder als 0 und 1 aus. Die Module selbst haben also weder Protokoll noch Adresse oder Fehlerprüfung; ihre einzige Aufgabe ist es, ein digitales Signal drahtlos zur Gegenseite zu bringen. Daten verpacken, prüfen und entschlüsseln ist die Aufgabe der Bibliothek auf dem Arduino. Die Kommunikation ist unidirektional: Der Sender sendet nur, der Empfänger hört nur zu.

EigenschaftFS1000A (Sender)XY-MK-5V (Empfänger)
Frequenz433,92 MHz (es gibt auch eine 315-MHz-Version)433,92 MHz
Versorgungsspannung3–12 V5 V
StromBeim Senden etwa 9–40 mA (je nach Spannung)Etwa 4 mA
ModulationASK / OOKASK / OOK, Pendelempfänger (superregenerativ)
DatenrateBis ~10 kbit/s (in der Praxis 1–4 kbit/s)Gleiche Grenze wie beim Sender
Sendeleistung / EmpfindlichkeitEtwa 10 mW, steigt mit der SpannungEtwa −105 dBm
PinsDATA, VCC, GND + ANT-LötpunktVCC, DATA, DATA, GND + ANT-Lötpunkt
GrößeEtwa 19 × 19 mmEtwa 30 × 14 mm

Die beiden DATA-Pins des Empfängers sind auf der Platine miteinander verbunden; es ist egal, welchen du verwendest. Der XY-MK-5V ist ein günstiger, aber wenig trennscharfer Pendelempfänger (superregenerativ): Seine Frequenz wird von einer einstellbaren Spule auf der Platine bestimmt, und er reagiert empfindlich auf Störungen in der Nähe. Dreh nicht an der Schraube dieser Spule; geht die Werkseinstellung verloren, hört der Empfänger den Sender nicht mehr. Für stabilere Ergebnisse sind Superhet-Empfänger wie der RXB6 empfindlicher und laufen auch mit 3,3 V. Das Set gibt es auch als 315-MHz-Version; Sender und Empfänger müssen dieselbe Frequenz haben, und auf dem Metallresonator der Senderplatine steht meist die Frequenz.

ASK-(OOK-)Modulation: Warum brauchst du eine Bibliothek?

Bei OOK (On-Off Keying), der einfachsten Form von ASK (Amplitude Shift Keying, Amplitudenumtastung), wird der Träger für ein 1-Bit ein- und für ein 0-Bit ausgeschaltet. Das klingt einfach, aber der Empfänger hat eine Eigenheit: Seine automatische Verstärkungsregelung (AGC) dreht die Verstärkung ohne Signal ganz auf, hält das Rauschen in der Luft für Daten und gibt am DATA-Pin ständig zufällige Impulse aus. Deshalb endet der Versuch, den Sender direkt an den TX-Pin und den Empfänger an den RX-Pin des Arduino anzuschließen und mit Serial.print zu kommunizieren, meist in wirren Zeichen.

Der Treiber RH_ASK der RadioHead-Bibliothek löst dieses Problem so: Vor jedem Paket sendet er eine 36-Bit-Präambel und ein 12-Bit-Startsymbol, damit sich die Verstärkung des Empfängers einpendeln kann. Danach wandelt er jedes Byte in zwei gleichspannungsfreie 6-Bit-Symbole um (4-zu-6-Kodierung) und hängt am Ende des Pakets eine 16-Bit-CRC an. Pakete mit falscher CRC verwirft der Empfänger stillschweigend; so kommen nur unversehrte Daten bei dir an. RCSwitch dagegen entschlüsselt die Pulsweitenkodierung der Fernbedienungschips: Jedes Bit wird durch Impulse dargestellt, die bestimmte Zeiten HIGH und LOW bleiben.

433 MHz Antenne: Warum 17,3 cm?

Die Module haben keine Antenne, nur einen Lötpunkt mit der Aufschrift ANT. Ohne Antenne funktioniert ein Set nur über 1–3 Meter. Die effizienteste einfache Antenne ist ein gerader Draht mit einem Viertel der Wellenlänge: λ = c / f = 300.000.000 / 433.920.000 ≈ 0,69 m, ein Viertel davon sind etwa 17,3 cm. Bei 315-MHz-Modulen ergibt dieselbe Rechnung 23,8 cm. Löte ein Ende eines Volldrahts an den ANT-Punkt und halte den Draht gerade und senkrecht; löte auch an den Empfänger einen gleich langen Draht und richte beide Antennen gleich aus.

AntenneLängeUngefähre Reichweite (freies Feld)Hinweis
Ohne Antenne—1–3 mNur für Tests auf dem Schreibtisch
Gerader Draht (λ/4), Sender an 5 V17,3 cm20–50 mDie einfachste und effizienteste Lösung
Gerader Draht (λ/4), Sender an 9–12 V17,3 cm50–100 m und mehrSichtverbindung und Höhe wirken sich stark aus
Fertige Spiral-(Feder-)Antenne2–4 cm langKürzer als mit geradem DrahtPasst ins Gehäuse

433 MHz Funkmodul anschließen: Arduino Uno, ESP32 und Pico

Modul-PinArduino Uno (RadioHead)Arduino Uno (RCSwitch)ESP32Raspberry Pi Pico
FS1000A VCC5V oder extern 9–12 V5VVIN (5 V)VBUS (5 V)
FS1000A DATAD12D10GPIO 26GP15
FS1000A GNDGNDGNDGNDGND
XY-MK-5V VCC5V5VVIN (5 V)VBUS (5 V)
XY-MK-5V DATAD11D2 (Interrupt-Pin)GPIO 27 (über Spannungsteiler)GP14 (über Spannungsteiler)
XY-MK-5V GNDGNDGNDGNDGND
Der DATA-Ausgang des XY-MK-5V liefert bis zu 5 V. Die Pins von ESP32 und Pico sind nicht 5-V-tolerant; wenn du den Empfänger an diese Boards anschließt, setze in die DATA-Leitung unbedingt einen Spannungsteiler (zum Beispiel oben 10 kΩ, unten 20 kΩ; ergibt etwa 3,3 V) oder nimm einen Empfänger, der mit 3,3 V läuft. Wenn du den Sender mit 12 V versorgst, darf diese Spannung nie an einen Board-Pin gelangen, und alle GNDs müssen verbunden sein.

Der Sender funktioniert auch mit einem 3,3-V-Signal am DATA-Pin problemlos; an ESP32 und Pico kannst du ihn also mit 5 V versorgen und DATA direkt an einen GPIO legen. Die Reichweite hängt am stärksten von der Senderspannung ab: Bei 3,3 V sinkt sie deutlich, bei 9–12 V steigt sie um ein Mehrfaches. Ein 100-nF-Keramik- und ein 10-µF-Elektrolytkondensator direkt an VCC und GND des Empfängers verringern Störungen aus der Versorgung und verbessern den Empfang sichtbar.

Nachrichten zwischen zwei Arduinos mit RadioHead senden

  1. Öffne in der Arduino IDE den Bibliotheksverwalter, suche nach RadioHead und installiere die Bibliothek von Mike McCauley. Details findest du im Artikel Bibliothek in Arduino hinzufügen.
  2. Schließe den Sender an den ersten Arduino an: DATA → D12, VCC → 5V, GND → GND.
  3. Schließe den Empfänger an den zweiten Arduino an: DATA → D11, VCC → 5V, GND → GND.
  4. Löte an den ANT-Punkt beider Module je einen 17,3 cm langen Draht.
  5. Lade den Sendercode auf das erste und den Empfängercode auf das zweite Board und öffne auf der Empfängerseite den seriellen Monitor mit 9600 Baud.
C++ (Arduino IDE)
1#include <RH_ASK.h>
2#include <SPI.h>                  // RadioHead derlemesi için / needed for RadioHead to compile
3
4RH_ASK rf(2000, 11, 12);          // hız (bps), RX pini, TX pini / speed (bps), RX pin, TX pin
5unsigned int sayac = 0;
6
7void setup() {
8  Serial.begin(9600);
9  if (!rf.init()) Serial.println("RF init hatasi / failed");
10}
11
12void loop() {
13  char mesaj[24];
14  snprintf(mesaj, sizeof(mesaj), "Merhaba %u", sayac++);
15  rf.send((uint8_t *)mesaj, strlen(mesaj));
16  rf.waitPacketSent();            // paket bitene kadar bekle / wait until the packet is sent
17  Serial.print("Gonderildi / sent: ");
18  Serial.println(mesaj);
19  delay(1000);
20}
C++ (Arduino IDE)
1#include <RH_ASK.h>
2#include <SPI.h>                  // RadioHead derlemesi için / needed for RadioHead to compile
3
4RH_ASK rf(2000, 11, 12);          // vericiyle aynı hız / same speed as the transmitter
5
6void setup() {
7  Serial.begin(9600);
8  if (!rf.init()) Serial.println("RF init hatasi / failed");
9}
10
11void loop() {
12  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN + 1];   // +1: metin sonu için / +1 for the string terminator
13  uint8_t len = RH_ASK_MAX_MESSAGE_LEN;      // her turda yeniden ayarla / reset on every pass
14  if (rf.recv(buf, &len)) {                  // yalnız CRC doğruysa true / true only if the CRC is valid
15    buf[len] = '\0';
16    Serial.print("Alindi / received: ");
17    Serial.println((char *)buf);
18  }
19}
BefehlFunktion
RH_ASK rf(2000, 11, 12)Geschwindigkeit 2000 bit/s, Empfänger an D11, Sender an D12; die Geschwindigkeit muss auf beiden Seiten gleich sein
rf.init()Richtet Timer und Pins ein; gibt bei einem Problem false zurück
rf.send(daten, laenge)Beginnt, ein Paket mit bis zu 60 Bytes zu senden
rf.waitPacketSent()Wartet, bis das Paket vollständig gesendet ist
rf.recv(buf, &len)Kopiert ein neues Paket mit gültiger CRC nach buf, aktualisiert len und gibt true zurück
RH_ASK_MAX_MESSAGE_LENGrößte Datenmenge pro Paket: 60 Bytes

Im Empfängercode ist es wichtig, die Variable len bei jedem Durchlauf neu zu setzen: recv() schreibt die Größe des empfangenen Pakets hinein, und beim nächsten Aufruf wird dieser Wert als Puffergröße verstanden; ohne Zurücksetzen werden längere Nachrichten abgeschnitten. Wenn alles stimmt, siehst du im seriellen Monitor jede Sekunde die Zeilen "Merhaba 0", "Merhaba 1". Fehlen Zahlen, sind unterwegs Pakete verloren gegangen; prüfe dann Antenne und Stromversorgung.

RH_ASK nutzt auf dem Arduino Uno Timer1. Da auch die Servo-Bibliothek Timer1 braucht, lassen sich beide nicht im selben Sketch kompilieren und du bekommst den Fehler "multiple definition of `__vector_11'"; außerdem funktioniert PWM an D9 und D10 nicht mehr. Standardmäßig belegt der Treiber zudem D10 als Sende-Freigabe-Pin (PTT). Brauchst du ein Servo, entferne das Kommentarzeichen vor der Zeile RH_ASK_ARDUINO_USE_TIMER2 am Anfang von RH_ASK.cpp (dann funktioniert tone() nicht) oder verwende die Bibliothek ServoTimer2.

Sensordaten senden: ein Paket mit struct

In echten Projekten ist es effizienter, Zahlen statt Text zu senden. Du kannst deine Messwerte in einem struct sammeln und dessen Bytes unverändert senden. Der Sender unten schickt fünfmal pro Sekunde den Wert eines LDR oder Potentiometers an A0 und den Zustand des Tasters an D2. Der Empfänger schaltet die LED an D13 ein, wenn der entfernte Taster gedrückt wird, und bemerkt verlorene Pakete.

C++ (Arduino IDE)
1#include <RH_ASK.h>
2#include <SPI.h>
3
4struct __attribute__((packed)) Paket {   // iki tarafta birebir aynı olmalı / must be identical on both sides
5  uint16_t no;                           // paket numarası / packet number
6  int16_t deger;                         // analog değer / analog value
7  uint8_t buton;                         // 1 = basılı / 1 = pressed
8};
9
10RH_ASK rf;                               // varsayılan: 2000 bps, RX 11, TX 12 / defaults
11Paket p = {0, 0, 0};
12
13void setup() {
14  pinMode(2, INPUT_PULLUP);              // buton D2-GND / button D2-GND
15  rf.init();
16}
17
18void loop() {
19  p.no++;
20  p.deger = analogRead(A0);              // örneğin LDR ya da potansiyometre / e.g. LDR or potentiometer
21  p.buton = (digitalRead(2) == LOW);
22  rf.send((uint8_t *)&p, sizeof(p));
23  rf.waitPacketSent();
24  delay(200);
25}
C++ (Arduino IDE)
1#include <RH_ASK.h>
2#include <SPI.h>
3
4struct __attribute__((packed)) Paket {
5  uint16_t no;
6  int16_t deger;
7  uint8_t buton;
8};
9
10RH_ASK rf;
11const int LED = 13;
12uint16_t sonNo = 0;
13
14void setup() {
15  Serial.begin(9600);
16  pinMode(LED, OUTPUT);
17  rf.init();
18}
19
20void loop() {
21  Paket p;
22  uint8_t len = sizeof(p);
23  if (rf.recv((uint8_t *)&p, &len) && len == sizeof(p)) {
24    digitalWrite(LED, p.buton ? HIGH : LOW);   // uzaktaki buton LED'i yakar / remote button lights the LED
25    if (sonNo != 0 && p.no != (uint16_t)(sonNo + 1)) {
26      Serial.println("Paket kaybi / packet lost");
27    }
28    sonNo = p.no;
29    Serial.print(p.no);
30    Serial.print("  A0 = ");
31    Serial.println(p.deger);
32  }
33}

Das Schlüsselwort __attribute__((packed)) verhindert, dass der Compiler Füllbytes zwischen die Felder einfügt. Das ist wichtig: Dasselbe struct kann auf dem Arduino Uno 5 und auf dem ESP32 6 Bytes belegen, und wenn zwei verschiedene Boards kommunizieren, verrutschen die Daten. Dank der Paketnummer kann der Empfänger verlorene Pakete zählen. Da 433-MHz-Module keine Empfangsbestätigung kennen, ist es eine gute Gewohnheit, wichtige Befehle mehrmals zu senden. Baust du auf beiden Seiten Sender und Empfänger ein, kannst du mit der Klasse RHReliableDatagram von RadioHead auch eine bestätigte Kommunikation mit Wiederholungen aufbauen.

Codes von Funkfernbedienungen mit RCSwitch auslesen

Viele Funksteckdosen, Funkklingeln, Rollladen- und Gartentor-Fernbedienungen sowie Tür-, Fenster- und PIR-Alarmsensoren verwenden Codechips wie den EV1527 oder PT2262. Bei jedem Tastendruck senden diese Chips denselben 12- bis 24-Bit-Code mehrmals hintereinander, getrennt durch Synchronisationspausen. Die Bibliothek RCSwitch (im Bibliotheksverwalter rc-switch) entschlüsselt diese Codes. Schließe den DATA-Pin des Empfängers am Uno an einen Interrupt-Pin an, also D2 oder D3, und lade den folgenden Code hoch:

C++ (Arduino IDE)
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4
5void setup() {
6  Serial.begin(9600);
7  rf.enableReceive(digitalPinToInterrupt(2));   // alıcı DATA -> D2 (kesme pini) / receiver DATA -> D2 (interrupt pin)
8  Serial.println(F("Kumandanin tusuna bas / press a remote button"));
9}
10
11void loop() {
12  if (rf.available()) {
13    Serial.print(F("Kod / code: "));
14    Serial.print(rf.getReceivedValue());
15    Serial.print(F("  Bit: "));
16    Serial.print(rf.getReceivedBitlength());
17    Serial.print(F("  Protokol / protocol: "));
18    Serial.print(rf.getReceivedProtocol());
19    Serial.print(F("  Darbe / pulse: "));
20    Serial.print(rf.getReceivedDelay());
21    Serial.println(F(" us"));
22    rf.resetAvailable();                         // bir sonraki koda hazırlan / get ready for the next code
23  }
24}

Öffne den seriellen Monitor und drücke eine Taste der Fernbedienung; du siehst eine Zeile wie "Kod / code: 5393 Bit: 24 Protokol / protocol: 1 Darbe / pulse: 350 us". Notiere für jede Taste Code, Bitlänge, Protokoll und Pulslänge; zum Klonen brauchst du alle vier. Bei Fernbedienungen mit EV1527 sind die ersten 20 der 24 Bits die Kennung der Fernbedienung und die letzten 4 die gedrückte Taste; deshalb liegen die Tastencodes derselben Fernbedienung sehr nah beieinander. Bei Protokoll 1 dauert eine Einheit etwa 350 µs: Ein 0-Bit ist 1 Einheit HIGH und 3 Einheiten LOW, ein 1-Bit 3 Einheiten HIGH und 1 Einheit LOW, und die Synchronisation 1 Einheit HIGH und 31 Einheiten LOW.

Fernbedienungs-ChipCode-AufbauMit RCSwitch klonbar?
EV1527 (lernender Code)20 Bit Kennung + 4 Bit Taste, insgesamt 24 BitJa
PT2262 / SC226212 dreiwertige Bits (0, 1, F); Adresse per DIP-SchalterJa
HT6P20BFestcode, RCSwitch-Protokoll 6Ja
Rolling-Code-Chips wie HCS301 (KeeLoq)Verschlüsselter Code, der sich bei jedem Druck ändertNein
Autoschlüssel, Alarmanlagen-Fernbedienungen und neuere Garagentor-Handsender nutzen Rolling Codes (Wechselcodes): Der Code ändert sich bei jedem Druck, und ein aufgezeichneter Code wird kein zweites Mal akzeptiert. Solche Systeme zu klonen funktioniert nicht und führt bei fremden Geräten zu rechtlichen Problemen. Nutze diese Methode nur für deine eigenen Steckdosen, Klingeln und Sensoren.

Den Fernbedienungscode vom Arduino senden

Um den ausgelesenen Code zu senden, verbinde den DATA-Pin des Senders mit D10 und zwei Taster zwischen D4 bzw. D5 und GND. Bei jedem Tastendruck wiederholt der Arduino den Code 10-mal, genau wie die Fernbedienung; die Ein- und Aus-Tasten der Steckdose sitzen jetzt auf deinem Arduino:

C++ (Arduino IDE)
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4const int BTN_AC = 4;            // "aç" butonu D4-GND / "on" button D4-GND
5const int BTN_KAPAT = 5;         // "kapat" butonu D5-GND / "off" button D5-GND
6
7void setup() {
8  pinMode(BTN_AC, INPUT_PULLUP);
9  pinMode(BTN_KAPAT, INPUT_PULLUP);
10  rf.enableTransmit(10);         // verici DATA -> D10 / transmitter DATA -> D10
11  rf.setProtocol(1);             // önce protokol... / protocol first...
12  rf.setPulseLength(350);        // ...sonra okuduğun darbe süresi / ...then the pulse length you read
13  rf.setRepeatTransmit(10);      // her gönderim 10 kez tekrarlanır / each send is repeated 10 times
14}
15
16void loop() {
17  if (digitalRead(BTN_AC) == LOW) {
18    rf.send(5393, 24);           // okuduğun "aç" kodu ve bit sayısı / the "on" code and bit length you read
19    delay(300);
20  }
21  if (digitalRead(BTN_KAPAT) == LOW) {
22    rf.send(5396, 24);           // okuduğun "kapat" kodu / the "off" code you read
23    delay(300);
24  }
25}

Da setProtocol() die Pulslänge auf den Standardwert des Protokolls zurücksetzt, musst du setPulseLength() immer danach aufrufen. Reagiert die Steckdose nicht, trage zuerst exakt die ausgelesene Pulslänge ein (z. B. 320 oder 420 µs) und erhöhe dann die Wiederholungen auf 15. Lernfähige Steckdosen bieten noch eine Abkürzung: Versetzt du die Steckdose in den Anlernmodus und sendest vom Arduino einen beliebigen 24-Bit-Code, speichert sie diesen Code. So kannst du eigene Codes erzeugen, ohne überhaupt eine Fernbedienung zu klonen.

433 MHz Empfänger am ESP32: Relais per Fernbedienung schalten

Der ESP32 ist eine ideale Brücke, um 433-MHz-Fernbedienungen mit der WLAN-Welt zu verbinden. RCSwitch läuft auch auf dem ESP32, und da jeder GPIO des ESP32 Interrupts auslösen kann, kannst du den Empfänger an jeden sicheren Pin anschließen. Der folgende Code liest die Codes eines Empfängers an GPIO 27 (über Spannungsteiler); kommt der Code deiner eigenen Fernbedienung, schaltet er die LED an GPIO 2 oder ein Relaismodul um. Weil eine Fernbedienung ihren Code bei einem Druck mehrfach sendet, schaltet das Programm erst wieder um, nachdem der Code 600 ms lang ausgeblieben ist:

C++ (Arduino IDE)
1#include <RCSwitch.h>
2
3RCSwitch rf = RCSwitch();
4const int RX_PIN = 27;              // alıcı DATA, gerilim bölücüyle / receiver DATA, through a divider
5const int ROLE_PIN = 2;             // dahili LED ya da röle girişi / onboard LED or relay input
6const unsigned long KOD = 5393;     // kendi kumandanın kodu / your own remote's code
7bool durum = false;
8unsigned long sonGorulme = 0;
9
10void setup() {
11  Serial.begin(115200);
12  pinMode(ROLE_PIN, OUTPUT);
13  rf.enableReceive(digitalPinToInterrupt(RX_PIN));   // ESP32'de her GPIO kesme alır / every GPIO takes interrupts on the ESP32
14}
15
16void loop() {
17  if (rf.available()) {
18    unsigned long kod = rf.getReceivedValue();
19    Serial.printf("Kod / code: %lu  %u bit  protokol %u\n", kod, rf.getReceivedBitlength(), rf.getReceivedProtocol());
20    if (kod == KOD) {
21      // kumanda kodu art arda tekrarlar; yalnız yeni basışta değiştir / the remote repeats the code; toggle only on a new press
22      if (millis() - sonGorulme > 600) {
23        durum = !durum;
24        digitalWrite(ROLE_PIN, durum ? HIGH : LOW);
25      }
26      sonGorulme = millis();
27    }
28    rf.resetAvailable();
29  }
30}

Auf dieser Grundlage kannst du viel aufbauen: Leite empfangene Codes per MQTT an Home Assistant weiter, um günstige 433-MHz-Türsensoren in dein Smart Home einzubinden, oder steuere Steckdosen per Handy mit einem Sender an GPIO 26. Auch RadioHead unterstützt den ESP32; der einzige Unterschied ist, dass du die Pins im Konstruktor ausdrücklich angibst: RH_ASK rf(2000, 27, 26, 25); (Empfänger 27, Sender 26 und 25 als freier Pin für PTT). Wenn der ESP32 neu für dich ist, wirf einen Blick auf Was ist der ESP32?.

433 MHz Sender mit Raspberry Pi Pico und MicroPython

Für MicroPython gibt es kein fertiges Gegenstück zu RCSwitch, aber das Timing von Protokoll 1 ist so einfach, dass du es mit wenigen Zeilen selbst schreiben kannst. Verbinde VCC des FS1000A mit dem VBUS-Pin (5 V) des Pico, DATA mit GP15 und einen Taster zwischen GP16 und GND. Drückst du den Taster, sendet der Pico wie RCSwitch die 24 Bits beginnend mit dem höchstwertigen Bit, hängt den Synchronisationsimpuls an und wiederholt das ganze Paket 10-mal. Wenn du noch nicht weißt, wie du MicroPython auf den Pico bringst, beginne mit Was ist der Raspberry Pi Pico?.

MicroPython
1from machine import Pin
2import time
3
4tx = Pin(15, Pin.OUT, value=0)        # FS1000A DATA -> GP15
5buton = Pin(16, Pin.IN, Pin.PULL_UP)  # buton GP16-GND / button GP16-GND
6T = 350                               # darbe süresi µs (RCSwitch protokol 1) / pulse length µs (RCSwitch protocol 1)
7
8def darbe(yuksek, dusuk):             # süreler T cinsinden / durations in units of T
9    tx.value(1)
10    time.sleep_us(yuksek * T)
11    tx.value(0)
12    time.sleep_us(dusuk * T)
13
14def gonder(kod, bit=24, tekrar=10):
15    for _ in range(tekrar):
16        for i in range(bit - 1, -1, -1):   # en anlamlı bitten başla / start from the most significant bit
17            if (kod >> i) & 1:
18                darbe(3, 1)                # "1" biti: 3T HIGH, 1T LOW / bit "1"
19            else:
20                darbe(1, 3)                # "0" biti: 1T HIGH, 3T LOW / bit "0"
21        darbe(1, 31)                       # senkron: 1T HIGH, 31T LOW / sync
22
23while True:
24    if buton.value() == 0:                 # butona basıldı / button pressed
25        gonder(5393)                       # okuduğun kodu yaz / put the code you read here
26        time.sleep_ms(300)

Für den 125-MHz-Prozessor des Pico sind Impulse von 350 µs ein gemütliches Tempo; die kleinen Verzögerungen von Python bleiben weit unter der Zeittoleranz von 60 % der RCSwitch-Empfänger. Du kannst den Code sofort testen, indem du einen Arduino mit dem RCSwitch-Lesecode danebenlegst: Im seriellen Monitor sollte die gesendete Zahl erscheinen. Für den Empfang müsstest du die Pulslängen mit Zeitstempeln messen und entschlüsseln; dafür ist ein Arduino oder ESP32 mit RCSwitch praktischer.

Reichweite und Störungen: das Signal weiter tragen

  • Vergiss die Antenne nicht: Löte auf beiden Seiten einen geraden 17,3-cm-Draht an; das hat den größten Einfluss auf die Reichweite.
  • Erhöhe die Senderspannung: Mit 9–12 V am FS1000A steigen Sendeleistung und Reichweite deutlich. Vergiss die gemeinsame Masse nicht.
  • Senke die Geschwindigkeit: 1000 statt 2000 bit/s in RadioHead lassen jedes Bit länger dauern, sodass der Empfänger auch schwächere Signale entschlüsseln kann. Stelle auf beiden Seiten dieselbe Geschwindigkeit ein.
  • Sichtverbindung und Höhe: Stahlbetonwände, Metallgehäuse und eine Montage nahe am Boden können die Reichweite halbieren; führe die Antennen aus Metallgehäusen heraus und so hoch wie möglich.
  • Saubere Versorgung: Motoren, Relais und Schaltnetzteile machen den Empfänger taub. Gib dem Empfänger eine gefilterte Versorgung und halte die Leitungen kurz.
  • Besserer Empfänger: Ein Superhet-Empfänger wie der RXB6 statt des XY-MK-5V erreicht mit demselben Sender oft deutlich größere Entfernungen.
  • Mehrfach senden: Da es keine Bestätigung gibt, sende wichtige Befehle 3- bis 5-mal und filtere Doppelte beim Empfänger über die Paketnummer heraus.

Denk daran, dass 433 MHz ein geteiltes Band ist: Die Wetterstation der Nachbarn, Autoschlüssel und Funkklingeln senden auf derselben Frequenz. In Europa und der Türkei ist der Bereich 433,05–434,79 MHz für Funkanwendungen mit geringer Reichweite (SRD) anmeldefrei nutzbar, die Sendeleistung ist aber auf 10 mW (ERP) begrenzt, und du darfst den Kanal nicht dauerhaft belegen. Daten in Abständen oder nur bei einer Änderung statt ununterbrochen zu senden, hält die Regeln ein und verlängert die Akkulaufzeit; für einen batteriebetriebenen Sender kannst du den Akkulaufzeit-Rechner nutzen.

433 MHz Funkmodul oder nRF24L01?

nRF24L01 2,4-GHz-Funkmodul
nRF24L01: eine 2,4-GHz-Alternative, die per SPI angeschlossen wird, in beide Richtungen funktioniert und eine Fehlerprüfung in der Hardware hat.
Eigenschaft433 MHz (FS1000A + XY-MK-5V)nRF24L01
Frequenz433,92 MHz2,4 GHz
ModulationASK / OOKGFSK
RichtungUnidirektional (Sender und Empfänger getrennt)Bidirektional (ein Transceiver-Modul)
DatenrateIn der Praxis 1–4 kbit/s (RadioHead-Standard 2 kbit/s)250 kbit/s – 2 Mbit/s
AnschlussEin DatenpinSPI (7 Leitungen)
VersorgungSender 3–12 V, Empfänger 5 V1,9–3,6 V
FehlerprüfungIn Software (RadioHead-CRC)CRC in Hardware, automatische Bestätigung und Wiederholung
Reichweite20–100 m mit 17,3-cm-Antenne50–100 m, ~1 km mit PA+LNA-Version
Durchdringung von WändenBesser (niedrigere Frequenz)Schwächer
Kompatibel mit FertiggerätenFernbedienungen für Steckdosen, Klingeln und SensorenNein
PreisSehr günstigGünstig

Kurz gesagt: Wenn du unidirektional, selten und kleine Datenmengen senden willst (einen Taster, einen Temperaturwert, die Meldung, dass eine Tür geöffnet wurde) oder mit fertigen Steckdosen und Sensoren arbeiten möchtest, ist das 433-MHz-Modul die günstigste und einfachste Lösung. Für ein ferngesteuertes Auto, einen Joystick oder Sensornetze mit vielen Knoten, die schnelle, bidirektionale und bestätigte Kommunikation brauchen, ist der nRF24L01 die bessere Wahl. Brauchst du Kilometer an Reichweite, sieh dir LoRa-Module an; alle Optionen im Vergleich findest du im Artikel Funkmodule für Arduino.

Projektideen mit dem 433 MHz Funkmodul

  • Funkklingel: Spiele im Haus eine Melodie, wenn der Taster am Gartentor ein Signal sendet; für den Ton reicht ein Summer.
  • Steckdosen per Arduino steuern: Klone die Codes von Funksteckdosen und schalte Lampen nach Uhrzeit oder Helligkeit.
  • Funk-Türsensor: Bringe einen Reedkontakt und einen kleinen Arduino mit Sender an der Tür an; öffnet sich die Tür, löst die Empfängerseite Alarm aus.
  • Alarmanlage: Baue eine Arduino-Alarmanlage, die fertige 433-MHz-Bewegungsmelder und Türkontakte in einer Zentrale bündelt.
  • Gartensensor-Station: Sende Bodenfeuchte oder Temperatur alle paar Minuten mit einem batteriebetriebenen Sender ins Haus.
  • 433-MHz-zu-WLAN-Brücke: Steuere mit einem ESP32 alle 433-MHz-Geräte im Haus per Handy und Smart-Home-System.

Häufige Fehler und ihre Lösungen

SymptomMögliche UrsacheLösung
Beim Empfänger kommen keine Pakete an (RadioHead)Geschwindigkeit oder Pins auf beiden Seiten verschieden, keine AntenneAuf beiden Seiten denselben Konstruktor verwenden (2000, 11, 12) und an beide Module 17,3 cm Draht löten
Funktioniert nur über wenige ZentimeterKeine Antenne oder zu niedrige SenderspannungAntenne anlöten, Sender mit 5–12 V versorgen
Fehler multiple definition of `__vector_11'RadioHead und die Servo-Bibliothek können sich Timer1 nicht teilenRH_ASK_ARDUINO_USE_TIMER2 oder ServoTimer2 verwenden
PWM an D9 und D10 geht nicht, das Gerät an D10 verhält sich seltsamRH_ASK belegt Timer1 und D10 (PTT)Diese Pins frei lassen oder im Konstruktor einen anderen PTT-Pin wählen
RCSwitch zeigt überhaupt keine CodesDATA des Empfängers hängt an einem Pin ohne InterruptAm Uno und Nano D2 oder D3 verwenden
Unbekannte Codes erscheinen auf dem BildschirmWetterstationen und Sensoren der Nachbarn oder RauschenNur auf bekannte Codes, Bitlängen und Protokolle reagieren
Der geklonte Code schaltet die Steckdose nichtPulslänge oder Protokoll weicht ab, oder die Fernbedienung nutzt Rolling CodesDen Wert von getReceivedDelay() in setPulseLength() eintragen, Wiederholungen erhöhen
Der ESP32 empfängt keine Codes oder arbeitet instabilDer 5-V-Ausgang des Empfängers hängt direkt am GPIOSpannungsteiler oder 3,3-V-Empfänger verwenden
Daten brechen ab, sobald ein Motor läuftStörungen und Spannungseinbrüche in der VersorgungEmpfänger separat versorgen, 100 nF + 10 µF Kondensatoren ergänzen
Teste bei der Fehlersuche die beiden Module zuerst mit 1 Meter Abstand, mit Antennen und an 5 V. Klappt es auf diese Entfernung, liegt das Problem nicht an der Verdrahtung, sondern an Reichweite und Störungen; vergrößere den Abstand schrittweise und beobachte den Einfluss von Antenne, Senderspannung und Datenrate. Klappt es gar nicht, prüfe Pins, Geschwindigkeit und die Beispiele der Bibliothek selbst.

433-MHz-Funkmodule verleihen deinen Projekten für sehr wenig Geld einen drahtlosen Arm und gehören zu den wenigen Modulen, die mit fertigen funkgesteuerten Geräten in deinem Zuhause sprechen können. Wenn du die Logik der Funksteuerung verstanden hast, lernst du auch andere Wege wie IR-Fernbedienungen und Bluetooth leicht. In der BlueGrays-App findest du Projekte wie die Kommunikation zwischen zwei Arduinos, eine 220-V-Lampe per Fernbedienung schalten, einen Türsensor mit Reedkontakt und eine ESP32-Bewegungsalarmanlage, jeweils mit Schaltplan und Schritt-für-Schritt-Code.

Häufige Fragen

Wie groß ist die Reichweite eines 433 MHz Funkmoduls?

Ohne Antenne funktioniert ein Set nur über 1–3 Meter. Mit 17,3 cm langen Drahtantennen auf beiden Seiten und dem Sender an 5 V sind im Freien 20–50 Meter möglich, mit dem Sender an 9–12 V über 100 Meter. In Gebäuden verringern Wände und Störungen diese Werte deutlich.

Wie lang muss eine 433 MHz Antenne sein?

Die effizienteste einfache Antenne ist ein gerader Draht mit einem Viertel der Wellenlänge: etwa 17,3 cm für 433 MHz und 23,8 cm für 315 MHz. Löte den Draht an den ANT-Punkt des Moduls und halte ihn gerade und senkrecht; die Antennen von Sender und Empfänger sollten gleich ausgerichtet sein.

Können 433 MHz Sender und Empfänger in beide Richtungen kommunizieren?

Mit einem einzelnen Paar geht die Übertragung nur vom Sender zum Empfänger. Baust du auf beiden Seiten Sender und Empfänger ein, kannst du in beide Richtungen arbeiten; die Klasse RHReliableDatagram von RadioHead ergänzt dann sogar Bestätigungen und Wiederholungen. Praktischer sind dafür aber von Haus aus bidirektionale Module wie der nRF24L01 oder das HC-12.

Kann man einen Autoschlüssel oder Garagentoröffner mit einem 433 MHz Modul klonen?

Autoschlüssel und moderne Garagentor-Handsender nutzen Rolling Codes: Der Code ändert sich bei jedem Druck, und ein aufgezeichneter Code wird abgelehnt, deshalb kann RCSwitch sie nicht klonen. Fernbedienungen mit Festcode für Steckdosen, Klingeln und Sensoren lassen sich dagegen klonen. Nutze die Methode nur an deinen eigenen Geräten; der Zugriff auf fremde Systeme führt zu rechtlichen Problemen.

Funktioniert ein 433 MHz Funkmodul mit dem ESP32?

Ja. Den Sender FS1000A kannst du mit 5 V versorgen und seinen DATA-Pin direkt an einen GPIO anschließen; ein 3,3-V-Signal reicht aus. Da der Ausgang des Empfängers XY-MK-5V 5 V liefert, brauchst du einen Spannungsteiler oder einen Empfänger, der mit 3,3 V läuft, etwa den RXB6. Die Bibliotheken RCSwitch und RadioHead unterstützen beide den ESP32.

Was ist der Unterschied zwischen 433 MHz und 315 MHz Modulen?

Beide Versionen sind gleich aufgebaut, nur die Betriebsfrequenz unterscheidet sich. In Europa nutzen Fernbedienungen meist 433,92 MHz, während in den USA und einigen asiatischen Ländern 315 MHz verbreitet ist. Sender und Empfänger oder die Fernbedienung, die du klonen willst, müssen exakt dieselbe Frequenz haben.

Alle Projekte ansehen
Einweg-Kommunikation zwischen 2 Arduinos
#57Mittel
Premium

Einweg-Kommunikation zwischen 2 Arduinos

Du bringst zwei Arduinos über ein einziges Kabel zum Reden: Drückst du den Knopf am einen, geht die LED am anderen an, drückst du noch einmal, geht sie aus. Die sendende Platine meldet den Knopfdruck

4.4(37)
50
Bidirektionale Kommunikation zwischen 2 Arduinos
#58Mittel
Premium

Bidirektionale Kommunikation zwischen 2 Arduinos

Zwei Arduinos werden per Kabel verbunden und unterhalten sich: Drückst du den Knopf am einen, geht am anderen das Licht an, drückst du noch einmal, geht es aus. Auf beiden Platinen läuft dasselbe Prog

4.5(20)
26
220-V-Glühbirne mit Fernbedienung schalten
#21Fortgeschritten
Premium

220-V-Glühbirne mit Fernbedienung schalten

Schalte eine echte Glühbirne in deiner Wohnung mit einer Fernbedienung ein und aus, ohne vom Sofa aufzustehen. Der Arduino liest das unsichtbare Lichtsignal der Fernbedienung; die Einschalttaste lässt

4.4(22)
30
Türsensor mit Reedschalter
#38Anfänger
Premium

Türsensor mit Reedschalter

Erkenne an einem Licht, ob deine Tür offen oder zu ist. An der Tür befestigst du einen kleinen Magneten, am Rahmen einen Schalter, der Magnete spürt; ist die Tür zu, liegen beide nebeneinander und die

4.7(34)
44
Led ein- und ausschalten mit IR-Empfänger und Fernbedienung
#17Mittel
Premium

Led ein- und ausschalten mit IR-Empfänger und Fernbedienung

Wie drei Lampen steuern, ohne aus dem Sessel aufzustehen: Die Tasten 1, 2 und 3 der Fernbedienung schalten die blaue, rote und grüne LED ein, die Tasten 4, 5 und 6 schalten sie in derselben Reihenfolg

4.7(45)
66
ESP32 IR-Universalfernbedienung (IR-Empfänger + Fernbedienung + 3 LEDs + Summer + OLED)
#143Fortgeschritten
Premium

ESP32 IR-Universalfernbedienung (IR-Empfänger + Fernbedienung + 3 LEDs + Summer + OLED)

Mit dem ESP32 kannst du eine fertige IR-Fernbedienung auslesen und dein eigenes Gerät steuern! In diesem Projekt erfassen wir mit einem Infrarotempfänger (NEC-Protokoll, 38 kHz) die Signale einer IR-Fernbedienung mit 20 Tasten. Für jede Taste haben wir eine andere Aktion definiert: Die Tasten 1/2/3 schalten drei separate LEDs ein und aus, die PWR-Taste schaltet alle aus, die Ziffern 4–9 sorgen für eine spezielle Anzeige auf dem OLED-Display. Auf dem SSD1306-OLED-Display werden die zuletzt gedrüc

4.5(9)
16
LED per Bluetooth mit dem Handy steuern
#34Anfänger
Premium

LED per Bluetooth mit dem Handy steuern

Eine kleine Probe dafür, das Licht in deinem Zimmer vom Handy aus ein- und auszuschalten. Das Bluetooth-Modul leitet die Buchstaben, die du vom Handy schickst, an den Arduino weiter; ein Buchstabe sch

4.8(68)
89