Eine fehlerfreie 433 MHz Datenübertragung mit zwei Arduino Uno

Nach den Störungen bei der AM Daten Übertragung auf 433 MHz aus diesem Artikel muss eine entsprechende Synchronisierung und Fehlerkorrektur her. Hier bietet sich die VirtualWire Library von Mike McCauley an. Sie enthält all das bereits und ist einfach anzuwenden.

Der 433 MHz Sender und der Empfänger sind wieder direkt an den Pins des Arduino angeschlossen, wie im vorherigen Artikel beschrieben.

Der Sender

Nach ein paar Anpassungen sieht die Sender Software für den Arduino dann so aus.

// 433 MHz Sender mit der VirtualWire Library  V 1.27
//
// Matthias Busse 17.5.2014 Version 1.0

// Verbindungen zum Uno
// GND > D5
// VCC > D6
// Daten > D7
 
#include < VirtualWire.h>

char *msg = "Hallo Welt";// Nachricht
 
void setup() {
  pinMode(7, OUTPUT);
  pinMode(5, OUTPUT);   // GND 0V
  digitalWrite(5, LOW);
  pinMode(6, OUTPUT);   // VCC 5V
  digitalWrite(6, HIGH);
  vw_setup(5000);       // Bits pro Sekunde
  vw_set_tx_pin(7);     // Datenleitung
}
 
void loop(){
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx();                         // warten bis alles übertragen ist
  delay(1000);
}

Der Empfänger

Auf der Empfangsseite wird dieses Programm verwendet

// 433 MHz Empfänger mit der VirtualWire Library V 1.27
//
// Matthias Busse 17.5.2014 Version 1.0

// Verbindungen zum Uno
// GND > D4
// Data > D5
// Input > D6
// VCC > D7

#include < VirtualWire.h>

int i;
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

void setup() {
  Serial.begin(38400);
  pinMode(5, INPUT);
  pinMode(6, INPUT);   
  pinMode(4, OUTPUT);   // GND 0V
  digitalWrite(4, LOW);
  pinMode(7, OUTPUT);   // VCC 5V
  digitalWrite(7, HIGH);
  vw_setup(5000);       // Bits pro Sekunde
  vw_set_rx_pin(5);     // Datenleitung
  vw_rx_start();        // Empfänger starten
}
 
void loop() {
  if (vw_get_message(buf, &buflen)) { // überprüfen ob eine Nachricht eingegangen ist
    for (i=0;i< buflen;i++) {
       Serial.print((char)buf[i]);    // Nachricht aus buf ausgeben
    }
    Serial.println("");
  }
}

Damit bekomme ich hier eine stabile und fehlerfreie Datenübertragung.

< Eine simple 433 MHz Funkstrecke mit 2 Arduinos aufbauen

von Matthias Busse

16 Gedanken zu „Eine fehlerfreie 433 MHz Datenübertragung mit zwei Arduino Uno

  1. Robin Schwenzfeier

    Hallo,
    Ich hätte eine Frage…
    und zwar möchte Ich Daten senden über Funk, doch Ich weiß nicht recht wie Ich dies schreiben/machen soll…

    Schon im voraus danke

    Antworten
  2. Volker Block

    Hallo, ich habe Schwierigkeiten. Sende mal einen String der Länge 10 und der Länge 3, abwechselnd.
    Dann wird der längere String auch auf die Länge 3 begrenzt.
    Abhilfe:
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    muss in die Loop, so wie auch im Beispiel. Warum, habe ich noch nicht heraus bekommen. Die Suche hat mich mehrere Stunden gekostet. Verflucht. Hoffentlich irre ich mich nicht. Jedenfalls funktioniert es nun.
    Habe zur Ausgabe ein Nokia Display #include benutzt. Ob das was ausmacht? Vielleicht Doppelbenutzung von Variablen? Wenn gewünscht, dreh ich gerne ein Filmchen darüber.

    Antworten
  3. Volker Block

    Hallo, ich habe Schwierigkeiten. Sende mal einen String der Länge 10 und der Länge 3, abwechselnd.
    Dann wird der längere String auch auf die Länge 3 begrenzt.
    Abhilfe:
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    muss in die Loop, so wie auch im Beispiel. Warum, habe ich noch nicht heraus bekommen. Die Suche hat mich mehrere Stunden gekostet. Verflucht. Hoffentlich irre ich mich nicht. Jedenfalls funktioniert es nun.
    Habe zur Ausgabe ein Nokia Display #include benutzt. Ob das was ausmacht? Vielleicht Doppelbenutzung von Variablen? Wenn gewünscht, dreh ich gerne ein Filmchen darüber.

    so sieht es jetzt aus

    Hallo Welt10
    yxc 3 usw.

    so sah es vorher aus
    Hallo Welt10
    yxc3
    Hal3
    yxc3

    jeweils mit der buflänge zur Kontrolle dahinter

    Antworten
  4. Stephan

    Hallo zusammen,

    kann ich mehrere dieser Sender/Empfänger gleichzeitig betreiben?
    Sprich auf verschiedenen Frequenzen oder Kanälen?
    Oder darf im Umfeld des Senders/Empfänger kein weiteres Gerät sein, welches mit 433 Mhz überträgt?

    Danke,
    Stephan

    Antworten
  5. admin Beitragsautor

    Dieser einfache Empfänger hat keine Kanalwahl, sodaß ein Sender mehrere Empfänger bedienen kann. Es können aber keine Sender auf Grund der Frequenz vom Empfänger unterschieden werden, hier muß der Sender dann ggf. eine eigene Identifikation mit senden.
    Matthias

    Antworten
  6. Haustechno

    Hallo
    bekomme die Fehlermeldung :
    This report would have more information with
    „Show verbose output during compilation“
    enabled in File > Preferences.
    Arduino: 1.0.6 (Windows NT (unknown)), Board: „Arduino Nano w/ ATmega328“
    sketch_jun01a.ino: In function ‚void setup()‘:
    sketch_jun01a:20: error: ‚vw_setup‘ was not declared in this scope
    sketch_jun01a:21: error: ‚vw_set_tx_pin‘ was not declared in this scope
    sketch_jun01a.ino: In function ‚void loop()‘:
    sketch_jun01a:25: error: ‚vw_send‘ was not declared in this scope
    sketch_jun01a:26: error: ‚vw_wait_tx‘ was not declared in this scope

    Kann mir einer Helfen?
    Mfg.

    Antworten
  7. Dennis

    Hallo, ich habe das Problem, dass beim Hochladen für den Empfänger ein Fehler auftritt, den ich hier kopiert habe:
    Arduino: 1.6.11 (Windows 10), Board: „Arduino/Genuino Uno“

    empfaenger:23: error: stray ‚\302‘ in program

      pinMode(6, INPUT);

    ^

    empfaenger:23: error: stray ‚\240‘ in program

    exit status 1
    stray ‚\302‘ in program

    Das einzige, was ich abgeändert habe, ist „#include “ -> „#include
    #include “

    Danke im Voraus

    Antworten
  8. Andi

    Hallo!

    Ich hätte eine Frage zu den 433MHz-Bausteinen. Sind die irgendwie anfällig oder empfindlich oder so?
    Ich habe 4 Sender-Empfänger-Pärchen hier bei mir ausprobiert, aber ich bekomme keine Übertragung zu Stande. Mit Antenne, ohne Antenne, egal. Ich tüftle schon eine Zeit lang nun herum, aber kein Erfolg.

    Ich habe schon den Verdacht, dass meine Sender oder Empfänger Module defekt sind.

    Ich benutze XY-MK-5V + XY-FST 433MHz

    Hat da jemand ähnliche Erfahrung oder einen Tipp?

    Antworten
  9. Reiner

    Hallo zusammen. Das senden und empfangen von Daten ist kein Problem, aber ich wäre nicht ich, wenn ich nicht ein Problem daraus machen würde.
    Folgendes:
    Ich habe eine Gartenbahn. Vieles lässt sich ja mit Timern (NE555 ect) realisieren. Doch da die Anlage an sich recht groß ist, gibt’s da Probleme überall meterweise Kabel zu verlegen.
    Also muss ein entsprechender Sender und Empfänger her, der z.B. eine Schranke öffnet / schließt. Durch einen Impuls beim durchfahren eines gewissen Teilstückes soll ein 433MHZ Sender (durch Impuls) dem Empfänger senden „jetzt“ und der Empfänger wiederum gibt einen Impuls aus um ein „Flip – Flop“ zu sagen Schranke auf oder zu.
    Nun kommt das eigentliche. Die Sketche müssen beide (sowohl Sender als auch Empfänger) auf einen ATTiny85 gepresst werden. Denn ich kann ja nicht 4 oder 6 Arduino Unos verbauen. Das ist ne Kosten sowie Platzfrage. Ich habe da was interessantes gefunden, (sie Link im Beispiel 2 http://funduino.de/nr-03-433mhz-funkverbindung ) aber das will nicht richtig. Beim Sender soll ein Taster den Impuls senden und beim Empfänger soll dann ein LED leuchten. So weit so gut. Der Sender sendet, aber dauerhaft und einen Taster geht nicht. Und der Empfänger empfängt halt permanent und zeigt mir das durch ständiges Blinken der LED. Wo bei ich sagen muss, den Empfänger Sketch krieg ich nicht in einen ATTiny gepresst. Nur wenn ich alle Zeilen mit der Bezeichnung Seriell lösche.
    Könnte mir bitte jemand die Sketche ändern, das es so funktioniert wie ich das gern hätte

    Bisher Pinbelegung beim ATTiny Sender „0“ = Daten und „4“ = Taster VCC und GND erklärt sich von selbst.
    Empfänger läuft momentan auf einem Arduino Uno Pin 12 LED Pin 2 Daten und da muss das auf einen 85iger vllt. auch „0“ als Daten und LED auf „3“ oder so.
    Danke Euch schon mal für die Geduld und Hilfe.
    L.G. Reiner
    DE – SAC – Osterzgebirge – Altenberg

    Antworten
  10. Stefan

    Statt „Hallo Welt“ empfange ich : ⸮⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮⸮ʡՠ⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮ՠ⸮Ǡ⸮ՠ⸮

    Weiß jemand warum? 🙁

    Antworten
  11. Ulli

    Hallo,
    ich habe in den letzten Tagen die Config Ardiono Nano (Sender) und Raspberry Pi Rev3 (Empfänger) in Betrieb genommen. Nach einigem Testen funktionierte es dann wunderbar.
    1. Test Strecke zwischen Arduino Nano (Sender) und Arduino UNO als Empfänger um zu testen dass Sender und Empfänger funktionieren, Das klappte dann nach mehren Anläufen, Fehler saß aber vor dem Gerät 🙂 .
    2. Test Strecke zwischen Nano und Pi, das war ein wenig schwieriger, da wie beim Uno die Herausforderung mit den richtigen PINS bestand, und dann noch mit dem richtigem Signal Level am GPIO Input. Trotz Spannungsteiler um auf 3.3V zu reduzieren funktionierte es dann mit Empfängerbetriebsspannung 3.3Volt und direktem Anschluss an den GPIO endlich. RPI habe ich nach diesem https://quadmeup.com/virtualwire-support-for-raspberry-pi/ Tuturial aufgebaut. Zielsetzung dieser Funkverbindung: Funkübertragung von RFID Codes und 5 Digital Werten vom Nano an den Pi, der dann die SONOS Library mit den zu den RFID Codekarten hinterlegten Kinderhörspielen aufruft und steuern kann. Die SONOS Funktionen habe ich schon erfolgreich implementiert. Das ganze habe ich schon mit WIFI Bausteinen ESP8266 implementiert, mit diesem Aufbau reduziere ich aber den Stromverbrauch im Sender um ein vielfaches.
    Herzlichen Dank an die Ersteller der Virtual Wire Library und an Matthias
    Gruß
    Ulli

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.