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

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:

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.

Sender:

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.

Empfänger:

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.

Für den Empfänger und für den Sender gibt es in den folgenden Anleitungen jeweils unterschiedliche Sketche, da beide völlig unterschiedliche Aufgaben zu erfüllen haben.

In dieser Anleitung verwenden wir die RCSwitch Library. Sie enthält neben der notwendigen Library auch einige einfache Beispielcodes, die wir für diese Anleitung verwenden und erweitern werden.

Material: Arduino / Breadboard / Breadboardkabel / 433Mhz Sender und Empfänger / Stromversorgung oder ein zweites Arduino-Board, da Sender und Empfänger nicht gleichzeitig an einem Board betrieben werden.

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.

 

Sketch 1: Senden und empfangen

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

Der Sender:

Der Sender hat drei Anschlüsse.

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

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

Der Sketch (Sender):

#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
}  


Der Empfänger

Material: Arduino / Breadboard / Kabel (3x) / 433Mhz XY-MK-5V-Receiver / Stromversorgung


Der Empfänger hat 4 Anschlüsse.

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

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

Der Sketch (Empfä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"
  }
}

Sketch 2: Kommunikation zwischen Arduino 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).

Aufbau Sender:

Sketch für den Sender:

#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.

 

Aufbau Empfänger:

Sketch für den Empfä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 taster gedrückt ist (Das Spannungssignal ist hoch)
{ //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"
  }
  }

Sketch 3: 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.

Sketch für Sender:

#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.

Aufbau Empfänger:

Sketch für Empfä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"
  }