Nr.03 – Funkverbindung über 433mhz mit dem Arduino

Inhaltsverzeichnis

Daten mit einem Funksender- und Empfängermodul zwischen zwei Mikrocontrollern übertragen

Daten via 433mhz Funksender- und Funkempfänger Übertragen

Die Sender und Empfänger für das 433MHz Funksignal sind relativ kleine und günstige Bauteile. Sie eignen sich für kleine Datenverbindungen in einem Abstand von wenigen Metern. Die beiden Module können jedoch mit kleinen Antennen ausgestattet werden, wodurch die Reichweite erhöht werden kann.

Die Antennen können jeweils an der dafür vorgesehenen Stelle an die Module gelötet werden:

Antennen am 433mhz Funksender/Funkempfänger Modul

Auf der 433MHz Frequenz werden die gesendeten Daten unverschlüsselt übermittelt. Man sollte sich also darüber im Klaren sein, dass andere Personen die Daten abfangen könnten. Der Sender kann von ca. 3,5V bis 12V betrieben werden. Je höher die Spannung, desto höher ist die Reichweite.  Mit einer zusätzlichen Antenne lässt sich die Reichweite ebenfalls erhöhen.

Hinweis zur Bibliothek für die Verwendung in der Arduino IDE

Für diese Anleitung wird die RCSwitch Library benötigt: https://github.com/sui77/rc-switch

Die Library muss installiert werden, bevor man den Sketch verwendet.

Aufgabenstellung

Mit dem Sender soll ein 433MHz Signal gesendet werden. Ein zweiter Arduino Mikrocontroller empfängt die Daten und zeigt sie im Serial-Monitor an.

1. Informationen zum 433mhz Funksender Modul

Es gibt bei diesen Modulen verschiedene Sendemöglichkeiten und Protokolle, wie das Senden von Binärcode, Dezimalzahlen oder Tri-state. Wir werden uns in dieser Anleitung auf das Senden von Dezimalzahlen beschränken, da diese am einfachsten weiterverarbeitet werden können.

1. Verkabelung des Funksender Moduls

Der Sender hat drei Anschlüsse.

Beim Blick auf die Vorderseite:
links: GND / in der Mitte: VCC / rechts: DATA

Das 433mhz Funksender Modul

Um den Sender zu verkabeln, wird der Data-Pin mit Pin 10 des Arduinos, VCC mit 5V und GND mit GND verbunden.

433mhz Funksender Modul am Funduino UNO R3 (alte Version)

1. Der Programmcode - 433mhz 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 433mhz Sender versendet die Dezimalzahl „1234“
  delay(1000);  // Eine Sekunde Pause, danach startet der Sketch von vorne
} 

1. Informationen zum 433mhz Funkempfänger Modul​

Auf der 433MHz Frequenz prüft der Empfänger stetig, ob Signale empfangen werden. Sobald der Empfänger ein Signal aufzeichnet, unterbricht der Arduino Mikrocontroller das Programm (Loop). Die empfangenen Daten können dann im Serial Monitor angezeigt und verarbeitet werden. Der Empfänger wird mit 5V betrieben. Eine höhere Spannung führt hier nicht zu einer höheren Reichweite. Jedoch macht eine Antenne auch beim Empfänger Sinn.

1. Verkabelung des 433mhz Funkempfänger Moduls

Der Empfänger hat 4 Anschlüsse.

Beim Blick auf die Rückseite:
links: GND / in der Mitte(2x): Data / rechts: VCC

Das 433mhz Funkempfänger Modul

Zur Verwendung wird ein (beliebiger) Data-Pin mit dem Pin 2 Arduinos verbunden.
Im Sketch wird diese als Pin 0 beschrieben, da dieser der Interrupt-Pin 0 ist.

433mhz Funkempfänger Modul am Funduino UNO R3

1. Der Programmcode - 433mhz 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 Pin2
}

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( mySwitch.getReceivedValue() );
    }

    mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
  }
}

2. Erweiterung des Programms: Übertragung von Signalen zwischen zwei Mikrocontrollern

Wenn beim ersten Arduino ein Taster gedrückt wird, soll beim zweiten Arduino eine LED leuchten. Dazu schließen wir an Pin 12 des Empfänger-Arduinos zusätzlich eine LED an (Die Onboard-LED an Pin13 kann in diesem Fall nicht verwendet werden).

2. Der Schaltplan - Übertragung von Signalen zwischen zwei Controllern - Funksender

Schaltplan - 433 MHz Funksender

2. Der Programmcode - Übertragung von Signalen zwischen zwei Controllern - Funksender

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

int taster=7; //Das Wort „taster“ steht jetzt für den Wert 7.
int tasterstatus=0; //Das Wort „tasterstatus“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable 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 der Pin7 ausgelesen (Befehl:digitalRead). Das Ergebnis wird unter der Variable „tasterstatus“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert.

if (tasterstatus == HIGH)//Verarbeitung: Wenn der taster gedrückt ist (Das Spannungssignal ist hoch)
{//Programmabschnitt des IF-Befehls öffnen.

mySwitch.send(5678, 24); // Der 433mhz 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 433mhz Sender versendet die Dezimalzahl „1234“
} //Programmabschnitt des else-Befehls schließen.
} //Mit dieser letzten Klammer wird der Loop-Teil geschlossen.

2. Der Schaltplan - Übertragung von Signalen zwischen zwei Controllern - Funkempfänger

2. Der Programmcode - Übertragung von Signalen zwischen zwei Controllern - Funkempfänger

#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 Pin2
  pinMode(LED, OUTPUT); //Der Pin mit der LED (Pin13) 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); //dann 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"
  }
  }

3. Erweiterung: Messwerte per Funk übertragen

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

Der Temperatursensor wird mit der Datenleitung an Pin A0 angeschlossen.

3. Der Schaltplan - Messwerte per Funk übertragen - Funksender

3. Der Programmcode - Messwerte per Funk übertragen - Funksender

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
int TMP36 = A0; //Der Sensor soll am analogen Pin A0 angeschlossen werden. 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 433mhz Sender versendet die Temperatur als Dezimalzahl.
delay (1000); // Eine Sekunde Pause.
} //Mit dieser letzten Klammer wird der Loop-Teil geschlossen.

3. Der Schaltplan - Messwerte per Funk übertragen - Funkempfänger

Schaltplan - Messwerte per Funk übertragen - Empfänger

3. Der Programmcode - Messwerte per Funk übertragen - Funkempfänger

#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 Pin2
  pinMode(LED, OUTPUT); //Der Pin mit der LED (Pin12) 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 über 25°C ist...
      { //Programmabschnitt des IF-Befehls öffnen.
       digitalWrite(LED, HIGH); //dann 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"
  }

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE