Nr.03 – 433mhz Funkverbindung

Funkverbindung über 433mhz Signale mit dem Arduino

by Simon Spettmann

(In Bearbeitung: Fotos und abschließende Tests stehen noch aus)

Aufgabe: Mit einem Sender soll ein 433mhz Signal gesendet werden.

Hierbei wird das Protokoll 2 mit 24bit länge verwendet.

Material: Arduino / Breadboard / Kabel (3x) / 433Mhz XY-FST-Transmitter / Stromversorgung

Für diese Aufgabenstellung wird die RCSwitch Library gebraucht:
https://github.com/sui77/rc-switch

Die Library der Arduino IDE hinzufügen:
-Lade die Library herrunter und speichere sie (bsp: Desktop)
-Öffne die Arduino IDE
-Gehe auf Sketche→Bibliothek einbinden→.zip Bibliothek einbinden
-Wähle die entsprechende Library aus
-Bestätige die Eingabe und warte eine Sekunde
-Fertig !

Der Sender überträgt auf der 433mhz Frequenz Funksignale, wobei Bitlänge und Pulslänge variiert werden können. Die Signale sind nicht verschlüsselt, können also auch von jedem Empfangen werden. Man sollte also aufpassen was man sendet. Die meisten Sender können von 2,6V bis 12V betrieben werden. Hierbei gilt: Desto höher die Spannung, umso höher die Reichweite!
Zusätzlich braucht der Sender eine „Antenne“, da diese nicht von Werk aus nicht installiert ist. Hierzu reicht ein ca. 17cm langes Jumpercable (normales Kabel/Draht) !
Dieses wird an die freie Öse am Sender angelötet. Für erste Versuche kann man diese weglassen, jedoch beträgt die Reichweite dann ~4cm.
Der Sender hat drei Anschlüsse.

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

Um den Sender zu versenden, verbinden wir den Data-Pin mit Pin 10 des Arduinos, VCC mit 5V und GND mit GND.

Bild folgt!

Der Sketch (Sender):

#include <RCSwitch.h>  // Einfügen der RCSwitch Library
RCSwitch mySwitch = RCSwitch(); // Ab hier kann der Sender mit mySwitch angesprochen werden

void setup()
{
  Serial.begin(9600); // Initialisiert die Serielle Übertragung mit 9600baud
  mySwitch.enableTransmit(10); // Der Sender ist an Pin 10 angeschlossen
  mySwitch.setProtocol(2); // Das Protokoll 2 wird verwendet
}


void loop()
{
  mySwitch.send(1010, 24); // Sende 1010 mit 24bit länge
  delay(1000); // Warte 1000 milisekunden
  mySwitch.send(0101, 24); // Sende 0101 mit 24bit länge
  delay(1000); // Warte 1000 milisekunden

  delay(2000); // Warte 20000 milisekunden
}


 

 

Aufgabe: Mit dem Empfänger soll ein 433mhz Signal empfangen und am Serial-Monitor angezeigt werden.

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

Der Empfänger zeichnet 433Mhz Signale auf, überträgt diese an den Arduino welcher sie dann decodiert. Sobald der Empfänger ein Signal aufzeichnet, unterbricht er den Arduino in seinem Programm (Loop). Die empfangenen Daten können dann Serial Monitor angezeigt, oder für Andere Aktionen genutzt werden. Im Gegensatz zum Sender verträgt der Empfänger nur 5V, da er ja auch nur „hören“ muss und nicht, wie der Sender, laut/weit „rufen“ muss. Um Signale zu empfangen braucht aber auch der Empfänger eine Antenne. Hier reicht auch ein ca. 17cm langes Stück eines Jumperkables, welches an die freie Öse gelötet wird.
Wenn auf eine Antenne verzichtet wird, beträgt die Reichweite nur ca. 4cm.
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.

BILD folgt

Der Sketch (Empfänger):

// Sketch zum Empfangen von 433mhz Signalen mit passendem Empfänger

#include <RCSwitch.h> // Inkludiere dieRCSwitch Library
RCSwitch mySwitch = RCSwitch(); // Ab hier kann der Empfänger mit mySwitch angesprochen werden

void setup()
{
  Serial.begin(9600); // Initialisiert die Seriele Übertragung mit 9600 Baud
  mySwitch.enableReceive(0); // Hier wird festgelegt, das der Empfänger den Interrupt 0 angeschlossen ist, welcher auf dem Board Pin 2 entspricht
}

void loop()
{
  if (mySwitch.available()) // Wenn etwas Empfangen wurde
  {    
    int value = mySwitch.getReceivedValue(); // Soll value dem Empfangen entsprechen
        
    if (value == 0) // Wenn das Empfangene 0 entspricht
    {
      Serial.print("Unbekannte Codierung"); // Schreibe „Unbekannte […]
    }
    else // sonst
    {
      Serial.print("Empfangen: "); // Übertrage das Signal und weitere Informationen an den PC
      Serial.print( mySwitch.getReceivedValue() );
      
      Serial.print(" / ");
      
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      
      Serial.print("Protokol:: ");
      Serial.println( mySwitch.getReceivedProtocol() );
    }
    mySwitch.resetAvailable(); // Bereite den Empfänger auf neue Signale vor
  }
}


 

Aufgabe: Zwei Arduinos sollen mit einander kommunizieren: Wenn beim ersten Arduino ein Knopf gedrückt wird, soll beim zweiten Arduino eine Lampe angehen.

Sketch für den Sender:

#include <RCSwitch.h> // Einfügen der RCSwitch Library
RCSwitch mySwitch = RCSwitch();
#define LedAn 1010 // Definiere LedAn als 1010
#define LedAus 0101 // Definiere LedAus als 0101
#define taster 7 // Definiere taster als (Pin) 7

boolean count; // Boolean kann je true ode false sein. Er wird hier genutzt, um den Taster für zwei Anwendungszwecke zu nutzen.

void setup()
{
  Serial.begin(9600); // Initalisiere die Seriele Übertragung
  pinMode(taster, INPUT); // Der Taster (Pin7) ist jetzt ein Eingang
  mySwitch.enableTransmit(10); // Der Sender ist an Pin 10 angeschlossen
}


void loop()
{ 
 if (digitalRead(taster)==HIGH) // Wenn der Taster gedrückt ist...
 {
  if(count=false) // und vorher noch nicht gedrückt wurde
  {
    mySwitch.send(LedAn, 24); // ...Sende LedAn (1101)
    delay(1000); // Warte 1 Sekunde
    count=true; // Merke dir, das der Taster vorher gedrückt wurde
  }
  else // sonst...
  {
    mySwitch.send(LedAus, 24); // Sende LedAus (0101)
    delay(1000); // Warte 1 Sekunde
    count=false; // Beim nächsten Tastendruck soll die Led wieder angehen
  }
 }
}


 

Sketch für den Empfänger:

#include <RCSwitch.h> // Einfügen der RCSwitch Library

RCSwitch mySwitch = RCSwitch();

#define Led 13 // Definiere Led als 13. Ab hier kann der Begriff "Led" als Ersatz für 13 genommen werden



void setup()
{
  Serial.begin(9600); // Initalisiere die Seriele Übertragung
  pinMode(Led, OUTPUT); // Der Pin mit der LED (Pin 13) ist jetzt ein Ausgang
  mySwitch.enableReceive(0); // Der Empfänger ist an Pin 2 angeschlossen
}


void loop()
{
  if (mySwitch.available()) // Wenn etwas Empfangen wurde...

  {
    int value = mySwitch.getReceivedValue(); // Entspricht value dem Empfangenen

    switch (value) // Wenn value...
    {
      case 1010: // Fall1: 1010 entspricht, dann...

        digitalWrite(Led, HIGH); / ...schalte die Led an.

        break;

      case 0101: // Fall2: 0101 entspricht, dann...

        digitalWrite(Led, LOW); // schalte die Led aus.

        break;

      default: // Fall3: etwas anderem entspricht,

        Serial.println("Error, Übertragung entsprich: "); // Teile uns den Fehler mit

        Serial.print(value); // und nenne uns die Übertragung

        break;
    }
  }
}