Inhaltsverzeichnis
Für dieses Projekt benötigst du
Daten mit einem Funksender- und Empfängermodul zwischen zwei Mikrocontrollern ü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:
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
Um den Sender zu verkabeln, wird der Data-Pin mit Pin 10 des Arduinos, VCC mit 5V und GND mit GND verbunden.
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
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.
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
2. Der Schaltplan - Übertragung von Signalen zwischen zwei Controllern - 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
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 bis zu 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.