Comunicación inalámbrica a través de 433 MHz con Arduino

FunduinoÚltima actualización el

Daten drahtlos zwischen zwei Arduinos übertragen

Die Sender und Empfänger für das 433-MHz-Funksignal sind relativ kleine und günstige Bauteile. Sie eignen sich für kleine Datenverbindungen über einen Abstand von wenigen Metern. Die beiden Module kannst du jedoch mit kleinen Antennen ausstatten und so die Reichweite erhöhen. Die Antennen lötest du jeweils an der dafür vorgesehenen Stelle an die Module.

Auf der 433-MHz-Frequenz werden die gesendeten Daten unverschlüsselt übermittelt. Du solltest dir also darüber im Klaren sein, dass andere Personen die Daten abfangen könnten. Den Sender kannst du mit ca. 3,5 V bis 12 V betreiben – je höher die Spannung, desto höher ist die Reichweite.

Für diese Anleitung brauchst du die RCSwitch-Library (github.com/sui77/rc-switch). Du musst sie installieren, bevor du die Sketche verwendest.

Aufgabenstellung: Mit dem Sender sendest du ein 433-MHz-Signal. Ein zweiter Arduino-Mikrocontroller empfängt die Daten und zeigt sie im Serial Monitor an.

433-MHz-Funksender und Funkempfänger zur Datenübertragung zwischen zwei Arduinos
Daten per 433 MHz zwischen zwei Mikrocontrollern übertragen
Lötstellen für die Antennen am 433-MHz-Funksender und -Funkempfänger
Antennen am 433-MHz-Funksender und -Funkempfänger
1 / 2

Das 433-MHz-Funksender-Modul

Bei diesen Modulen gibt es verschiedene Sendemöglichkeiten und Protokolle, zum Beispiel das Senden von Binärcode, Dezimalzahlen oder Tri-State. In dieser Anleitung beschränken wir uns auf das Senden von Dezimalzahlen, da du diese am einfachsten weiterverarbeiten kannst.

Der Sender hat drei Anschlüsse. Um ihn zu verkabeln, verbindest du den Data-Pin mit Pin 10 des Arduinos, VCC mit 5V und GND mit GND.

Anschlüsse des Senders beim Blick auf die Vorderseite: links GND, in der Mitte VCC, rechts DATA.

433-MHz-Funksender-Modul, Anschlüsse: links GND, Mitte VCC, rechts DATA
Das 433-MHz-Funksender-Modul
Verkabelung des 433-MHz-Funksenders am Arduino: DATA an Pin 10, VCC an 5V, GND an GND
433-MHz-Funksender-Modul am Funduino UNO R3 (alte Version)
1 / 2
Programmcode – 433-MHz-Funksender
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
  mySwitch.enableTransmit(10);  // Der Sender wird an Pin 10 angeschlossen
}
void loop() {
  mySwitch.send(1234, 24); // Der 433-MHz-Sender versendet die Dezimalzahl "1234"
  delay(1000);  // Eine Sekunde Pause, danach startet der Sketch von vorne
}

Das 433-MHz-Funkempfänger-Modul

Auf der 433-MHz-Frequenz prüft der Empfänger ständig, ob Signale eintreffen. Sobald er ein Signal aufzeichnet, unterbricht der Arduino-Mikrocontroller das Programm (Loop). Die empfangenen Daten kannst du dann im Serial Monitor anzeigen und weiterverarbeiten.

Der Empfänger wird mit 5V betrieben. Eine höhere Spannung führt hier nicht zu einer höheren Reichweite. Eine Antenne ist aber auch beim Empfänger sinnvoll.

Der Empfänger hat vier Anschlüsse. Zur Verwendung verbindest du einen (beliebigen) Data-Pin mit Pin 2 des Arduinos. Im Sketch wird dieser als Pin 0 beschrieben, da es sich um den Interrupt-Pin 0 handelt.

Anschlüsse des Empfängers beim Blick auf die Rückseite: links GND, in der Mitte (2x) DATA, rechts VCC.

433-MHz-Funkempfänger-Modul, Anschlüsse: links GND, Mitte 2x DATA, rechts VCC
Das 433-MHz-Funkempfänger-Modul
Verkabelung des 433-MHz-Funkempfängers am Arduino: DATA an Pin 2, VCC an 5V, GND an GND
433-MHz-Funkempfänger-Modul am Funduino UNO R3 (alte Version)
1 / 2
Programmcode – 433-MHz-Funkempfänger
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup()
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Empfänger ist an Interrupt-Pin "0" - das ist am UNO der Pin 2
}
void loop() {
  if (mySwitch.available()) // Wenn ein Code empfangen wird...
  {
    int value = mySwitch.getReceivedValue(); // Empfangene Daten werden unter der Variable "value" gespeichert.
    if (value == 0) // Wenn die empfangenen Daten "0" sind, wird "Unbekannter Code" angezeigt.
    {
      Serial.println("Unbekannter Code");
    }
    else // Wenn der empfangene Code brauchbar ist, wird er hier an den Serial Monitor gesendet.
    {
      Serial.print("Empfangen: ");
      Serial.println( value );
    }
    mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
  }
}

Erweiterung: Signale zwischen zwei Mikrocontrollern übertragen

Wenn du beim ersten Arduino einen Taster drückst, soll beim zweiten Arduino eine LED leuchten. Dazu schließt du an Pin 12 des Empfänger-Arduinos zusätzlich eine LED an.

Die Onboard-LED an Pin 13 kannst du in diesem Fall nicht verwenden.

Schaltplan des Funksenders mit Taster an Pin 7 und Sendemodul an Pin 10
Schaltplan – Funksender mit Taster
Schaltplan des Funkempfängers mit LED an Pin 12 und Empfangsmodul an Pin 2
Schaltplan – Funkempfänger mit LED
1 / 2
Programmcode – Funksender mit Taster
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
int taster = 7; // Das Wort "taster" steht jetzt für den Wert 7.
int tasterstatus = 0; // Unter dieser Variable wird gespeichert, ob der Taster gedrückt ist oder nicht.
void setup() // Hier beginnt das Setup.
{
  mySwitch.enableTransmit(10);  // Der Sender wird an Pin 10 angeschlossen
  pinMode(taster, INPUT); // Der Pin mit dem Taster (Pin 7) ist jetzt ein Eingang.
}
void loop()
{ // Mit dieser Klammer wird der Loop-Teil geöffnet.
  tasterstatus = digitalRead(taster); // Hier wird Pin 7 ausgelesen (Befehl: digitalRead).
  if (tasterstatus == HIGH) // Verarbeitung: Wenn der Taster gedrückt ist (das Spannungssignal ist hoch)...
  { // Programmabschnitt des IF-Befehls öffnen.
    mySwitch.send(5678, 24); // Der 433-MHz-Sender versendet die Dezimalzahl "5678"
    delay(50); // 50 Millisekunden Pause
  } // Programmabschnitt des IF-Befehls schließen.
  else // ...ansonsten...
  { // Programmabschnitt des else-Befehls öffnen.
    mySwitch.send(1234, 24); // Der 433-MHz-Sender versendet die Dezimalzahl "1234"
  } // Programmabschnitt des else-Befehls schließen.
} // Mit dieser letzten Klammer wird der Loop-Teil geschlossen.
Programmcode – Funkempfänger mit LED
#include <RCSwitch.h>
int LED = 12;
RCSwitch mySwitch = RCSwitch();
void setup()
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Empfänger ist an Interrupt-Pin "0" - das ist am UNO der Pin 2
  pinMode(LED, OUTPUT); // Der Pin mit der LED (Pin 12) ist jetzt ein Ausgang.
}
void loop() {
  if (mySwitch.available()) // Wenn ein Code empfangen wird...
  {
    int value = mySwitch.getReceivedValue(); // Empfangene Daten werden unter der Variable "value" gespeichert.
    if (value == 0) // Wenn die empfangenen Daten "0" sind, wird "Unbekannter Code" angezeigt.
    {
      Serial.println("Unbekannter Code");
    }
    else // Wenn der empfangene Code brauchbar ist, wird er hier an den Serial Monitor gesendet.
    {
      Serial.print("Empfangen: ");
      Serial.println( value );
      if (value == 5678)   // Verarbeitung: Wenn der Arduino die Zahl "5678" empfängt, dann...
      {   // Programmabschnitt des IF-Befehls öffnen.
        digitalWrite(LED, HIGH); // ...soll die LED leuchten
        delay(500);   // und zwar für 0,5 Sekunden (500 Millisekunden).
        digitalWrite(LED, LOW); // Danach soll die LED aus sein.
      }   // Programmabschnitt des IF-Befehls schließen.
    }
    mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
  }
}

Erweiterung: Messwerte per Funk übertragen

Am Arduino mit dem Sendemodul ist zusätzlich ein Temperatursensor angeschlossen. Den Messwert des Sensors sendest du per 433 MHz an einen zweiten Arduino und zeigst ihn dort im Serial Monitor an. Außerdem soll am Empfänger-Arduino eine Warn-LED leuchten, wenn die Temperatur 25 °C oder höher ist.

Den Temperatursensor schließt du mit der Datenleitung an Pin A0 an.

Der Sender überträgt die Temperatur als Dezimalzahl. Minusgrade lassen sich auf diesem Weg nicht korrekt übertragen – der Sketch eignet sich daher für Temperaturen ab 0 °C.

Schaltplan des Funksenders mit Temperatursensor an A0 und Sendemodul an Pin 10
Schaltplan – Funksender mit Temperatursensor
Schaltplan des Funkempfängers mit Warn-LED an Pin 12 und Empfangsmodul an Pin 2
Schaltplan – Funkempfänger mit Warn-LED
1 / 2
Programmcode – Funksender mit Temperatursensor
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
int TMP36 = A0; // Der Sensor wird am analogen Pin A0 angeschlossen. Wir nennen den Pin ab jetzt "TMP36".
int sensorwert; // Erstellen einer Variablen für den Sensorwert.
int temperatur = 0; // Unter der Variablen "temperatur" wird später der Temperaturwert abgespeichert.
void setup() // Hier beginnt das Setup.
{
  mySwitch.enableTransmit(10);  // Der Sender wird an Pin 10 angeschlossen
}
void loop()
{ // Mit dieser Klammer wird der Loop-Teil geöffnet.
  sensorwert = analogRead(TMP36); // Auslesen des Sensorwertes.
  temperatur = map(sensorwert, 0, 410, -50, 150); // Umwandeln des Sensorwertes mit Hilfe des "map"-Befehls.
  mySwitch.send(temperatur, 24); // Der 433-MHz-Sender versendet die Temperatur als Dezimalzahl.
  delay(1000); // Eine Sekunde Pause.
} // Mit dieser letzten Klammer wird der Loop-Teil geschlossen.
Programmcode – Funkempfänger mit Warn-LED
#include <RCSwitch.h>
int LED = 12;
RCSwitch mySwitch = RCSwitch();
void setup()
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Empfänger ist an Interrupt-Pin "0" - das ist am UNO der Pin 2
  pinMode(LED, OUTPUT); // Der Pin mit der LED (Pin 12) ist jetzt ein Ausgang.
}
void loop() {
  if (mySwitch.available()) // Wenn ein Code empfangen wird...
  {
    int value = mySwitch.getReceivedValue(); // Empfangene Daten werden unter der Variable "value" gespeichert.
    Serial.print("Temperatur: ");
    Serial.println( value );
    if (value >= 25) // Verarbeitung: Wenn die Temperatur 25 °C oder mehr beträgt...
    { // Programmabschnitt des IF-Befehls öffnen.
      digitalWrite(LED, HIGH); // ...soll die LED leuchten
    } // Programmabschnitt des IF-Befehls schließen.
    else // ...ansonsten...
    { // Programmabschnitt des else-Befehls öffnen.
      digitalWrite(LED, LOW); // ...soll die LED aus sein.
    } // Programmabschnitt des else-Befehls schließen.
    mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
  }
}
Calificar la guía

Comentarios

Haz una pregunta o comparte tu experiencia

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Revisamos cada comentario antes de publicarlo. Tu dirección de correo electrónico permanece con nosotros.