Kommunikation zwischen zwei Arduinos mit Virtual Wire und 433 Mhz

Nachdem nun meine China-Bestellungen eingetroffen sind, konnte ich mit meinen ersten Gehversuchen beginnen, um batteriebetriebene, Funk-Sensoren mit ATTiny-Chips umzusetzen.

Ganz am Anfang steht: Wie bekomme ich die Sensor-Daten von den ATTiny-Nodes (die Sensor-Aktoren) an meinen Master-Arduino.

Ein wirkliches HowTo, wie man Daten zwischen zwei Arduinos per 433 Mhz-Sender/Empfänger austauscht habe ich nicht gefunden – zwar viele Verweise auf Librarys und Beispiele, aber eben kein einfaches HowTo von A bis Z – und deswegen dürft ihr weiter lesen.Was wir benötigen:

  • Zwei (oder mehr) Arduinos, ATTiny, Arduino-Derivate
  • Ein 433 Mhz Sender/Empfängerpärchen (gibts günstig bei eBay)
  • Die Virtual Wire-Library für Arduino

Zu allererst bauen wir die beiden Arduinos mit dem Sender/Empfänger auf.

Ich habe da ganz einfache Outlets von eBay besorgt; je mit einem VCC-, GND– und DATA-Beinchen. Verbindet jeweils VCC mit 5V, GND mit Ground und den DATA-Pin mit einem freien, nicht-PWM-PIN.

Achtet bei den 433 Mhz Sendern/Empfängern darauf, dass ihr eine externe Antenne anklemmt, sollte diese nicht bereits auf dem Outlet aufgelötet sein. Für 433 Mhz kann man ein 17,5cm langes Kabel nehmen, dass man um einen Stift wickelt, um eine spiralförmige, kurze Antenne zu basteln.

Nun benötigen wir noch zwei Sketche; für den Empfänger und für den Sender:

433 Mhz Sender

In folgendem Sketch ist der 433Mhz-Sender an PIN7 eines Arduino UNO angeschlossen:

433 Mhz Empfänger

Bei folgendem Sketch ist der 433 Mhz Empfänger an PIN 8 eines Arduino Ethernet angeschlossen:

Daten auswerten

Startet nun die serielle Konsole des Empfänger-Arduinos. Ihr solltet die erhaltenen Datenpakete sehen:

Serieller Output

Bastian

Seit 2006 bin ich täglich im IT-Umfeld unterwegs und interessiere mich für technische Lösungen im Hard- und Softwarebereich, die einem den Alltag erleichtern. Zu meinen Hobbies zählt ein 3D-Drucker, das auch (handwerkliche) Tüfteln, Scripten sowie der unqualifizierte Umgang mit dem Lötkolben.

Das könnte Dich auch interessieren …

28 Antworten

  1. Björn sagt:

    Erstmal danke für die ganzen Berichte die du hier über deine Arbeit mit den Attiny etc. rein stellst. Ich arbeite gerade an ähnlich Sachen im 433MHz Bereich mit fast denselben Komponenten, und finde das ganze sehr interessant.

    Nur habe ich eine Frage: Wie kommst du auf eine Antennenlänge von 13,5cm?
    Müssten es bei 433MHz nicht ca. 17,5cm für eine lambda/4 Antenne sein?

    • Bastian sagt:

      Hallo Björn,
      da hast du natürlich recht – war ein Rechtschreibfehler; ist korrigiert.
      Halt mich doch mal auf dem Laufenden, was du mit deinen 433 Mhz-Sendern so anstellst!

  2. John sagt:

    Soweit war ich auch schon. Ich hab auch einen zweiten Arduino laufen der mir die Wetterdaten auf dem Display anzeigt.
    Mein nächstes Projekt klemmt aber da die Ethernetsoftware (Ether.h und SPI.h) nicht mehr läuft wenn Virtual Wire läuft.
    Hat irgenjemand ne Idee ?
    http://crazy-electronic.de/index.php/start/95-wetterdaten.html

    • Bastian sagt:

      Hi,
      ich „glaube“ zu wissen, dass du – sofern du das Ethernet-Shield oder den Arduino Ethernet nutzt – Probleme haben wirst, weitere SPI-Geräte anzusteuern. Der Ethernet-Chip reicht wohl das SPI-Signal nicht korrekt an weitere Geräte durch, weshalb die dann nicht funktionieren.
      Hatte das gleiche Problem, als ich mich informiert habe, wie ich RFM12B an einem Arduino Ethernet zum laufen bekommen kann – und habe es dann schlicht gelassen.

  3. Christoph Seggewiße sagt:

    Hi Bastian,

    funktioniert das auch mit arduino nano bzw arduino mini. Oder nur mit dem Uno?

    • Bastian sagt:

      Hi,
      es sollte funktionieren. Die einfachen 433-Empfänger benötigen ja kein SPI/I2C o.ä., sondern lediglich ein paar digitale PINs.
      Ich habe damals bewusst keinen Mini/Uno/Nano genommen, weil deren Stromverbrauch im Vergleich zu den ATTiny’s sehr hoch ist und dadurch die Batterielaufzeit unter 1-2 Monaten liegen würde (bei dem Setup mit 2-3 AAA-Batterien).

      • Christoph S sagt:

        Hi, habe noch eine Frage. Ich benutze jetzt einen Attiny85 und beim programmieren taucht der folgende Fehler auf:
        This report would have more information with
        „Show verbose output during compilation“
        enabled in File > Preferences.
        Arduino: 1.0.6 (Windows 7), Board: „ATtiny85 (internal 1 MHz clock)“
        c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o:(.init9+0x2): relocation truncated to fit: R_AVR_13_PCREL against symbol `exit‘ defined in .fini9 section in c:/program files (x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_exit.o)

        Hast du vielleicht eine Lösung ?

        Danke schon mal.

        • Bastian sagt:

          Tut mir leid; leider nicht – habe schon länger nix mehr mit den ATTiny’s gemacht und hatte nie einen 85.
          Hört sich für mich aber nach einem Problem mit der IDE aus – nicht mit dem ATTiny.

  4. Tom sagt:

    Hi,
    Danke für dein Projekt mit Code und Beschreibung. Gibt es einen Weg statt Text int werte zu senden, mit denen der empfangende Arduino dann rechnen kann?

    Vielen Dank Schonmal…

    • Bastian sagt:

      Hi,
      google doch mal – die Variablentypen lassen sich konvertieren :) Ist meistens eine Frage des Platzes… auf dem ATTiny84 funktionieren manche dieser Libs/Funktionen nicht, weil der Platz zu gering ist :/

  5. pete sagt:

    Hallo! Die Anleitung hilft mir schon etwas – ich kann jetzt meine vom 1. Arduino gesendeten Texte empfangen. Nun möchte ich am Empfänger ein Display betreiben und die empfangenden Daten dort ausgeben. Ich käme einfacher damit zurecht, wenn ich den empfangenen String nicht in einzelnen Zeichen ausgeben müsste, sondern daraus zuerst einen einzelnen String bilden könnte, den ich dann intern weiter verwende. Mangels Programmierkenntnisse in dieser Sprache gelingt es mir aber einfach nicht, aus den einzelnen Zeichen einen Komplettstring zu machen. In Basic würde ich eine Schleife programmieren (wie diese, die Du für die Ausgabe einzelner Zeichen verwendest) und so zusammenketten: strErgebnis = strErgebnis + (char)buf[i]
    Das geht natürlich hier nicht … ich weiß aber nicht, warum! Kann jemand helfen?!

  6. Maxe sagt:

    ich finde auf ebay aber nur sender und empfänger wo einer von beiden 4 statt drei beinen hat wie schliesse ich die dann an und muss das script da verändert werden?

  7. Maxe sagt:

    ok ich habe gerade einen anderen artikel gesehen den ich aber nicht verstanden habe aber dort war(anscheinend mit frizing) ein aufbau dargestellt wo ein beinchen einfach ignoriert wurde
    ist das richtig so?
    welches beinchen muss da verwendet werden oder ist das egal?

  8. Maxe sagt:

    oh ok aber es steht über beiden groß: DATA welches ist dann das für die antenne und welches das zum anschliessen an den arduino?

  9. Maxe sagt:

    ich wollte es mir erst bestellen wenn ich sicher bin das es so funktioniert! nicht das ich einen monat lang auf meine bestellung aus china warte mich dann noch mit dem zoll rumärgere und dann funktioniert es nicht! hier: http://www.ebay.de/itm/433Mhz-WL-RF-Wireless-Modul-Transmitter-Empfanger-1-Set-MX-FS-03V-MX-05-Hot-/271634453751?pt=LH_DefaultDomain_77&hash=item3f3eacd4f7 würde ich das bestellen. (die bilder komen erst weiter unten)

  10. mattiXx sagt:

    Hallo
    Funktioniert das ganze auch z.b. von verschicken und empfangen von Temperatur und Luftfeuchtigkeit Daten?
    Wenn ja, wie könnte das aussehen

  11. Jo sagt:

    Hallo,

    ich würde gerne einen Abstandswert von einem Ultraschallsensor auf den Empfänger übertragen.
    Wie bekomme ich es hin, dass der Sender den Wert des Ultraschallsensors auf den Empfänger überträgt und dort via Seriellen Monitor ausgibt?

  12. Florian sagt:

    Hi Bastian,

    herzlichen Dank für dein Tutorial. Ich bastle derzeit an kleinen Messdrohnen für mein SmartHome-Project. Mit Bluetooh laufen die im Test schon ganz gut, verbrauchen aber zuviel Strom. Dementsprechend habe ich mir einen Sack 433MHz Sender (FS1000A) und ein paar Empfänger gekauft. Damit erhoffe ich mir deutlich längere Batterielaufzeiten.

    Ich habe mir nun dein Tutorial genommen und alles aufgebaut wie du beschrieben hast. Leider bekomme ich kein Signal übertragen. Ich kann mir eigentlich nur vorstellen, dass ich irgendwas bei der Verkabelung falsch gemacht habe. Könntest du ein Bild von der Verkabelung ergänzen oder mir ersatzweise folgende zwei Fragen beantworten?

    Du schreibst in deinem Example Code für den Sender.
    vw_set_tx_pin(7); // pin 3 is used as the transmit data out into the TX Link module, change this as per your needs
    und für den Empfänger
    vw_set_rx_pin(8); // We will be receiving on pin 4 i.e the RX pin from the module connects to this pin.

    Sehe ich das richtig, dass du am Sender DATA mit D7 verbindest und beim Empfänger ATAD mit D8?

    Viele Grüße & frohe Osterfeiertage,

    Florian

  13. Lukas sagt:

    Hi,
    Danke für das gute Tutorial! Ich habejetzt allerdings ein Problem: Die VirtualWire.h muss ja erst implementiert werden, oder? Ich habe damit leider noch keine Erfahrung. Könntest du mir bitte kurz erklären, wie das geht? Bzw. wo ich VirtualWire überhaupt herunterladen kann?

    Danke schonmal!

    Lukas

  14. Morton sagt:

    Hi,
    vielen Dank für den Artikel. Frage dazu: Ich stehe bezüglich der Übertragung noch etwas auf der Leitung ;)
    Kann man mehrere Arduinos so verbinden und muß man für jede Übertragung jedes Mal eine Übertragung initialisieren so ähnlich wie bei einer seriellen Schnittstelle?
    Angenommen es handelt sich um eine Haussteuerung die 24/7 arbeiten soll. Bleiben dann sagen wir mal 40 Verbindungen ständig aktiv oder inititialisiert man besser jedesmal wenn daten gesendet oder empfangen werden sollen? Bleiben initialisierte verbindungen über tage und monate stabil?
    Kann man das ganze auch ohne funkktechnik mit virtual wire oder einem anderen empfohlenenen Protokoll machen, also die zahlreichen arduinos über ein oder mehrere kabel irgendwie aneinanderkoppeln?

    Mit fruendlichen Grüßen

    M.

  15. Christopher Aicher sagt:

    Vielleicht mach ich was falsch, aber meine Funkmodule mit 433 kommen bei 5V nur etwa 5-8cm trotz der richtigen Antenne.
    Was mach ich falsch?
    Die Bitrate zu verringern bringt auch nichts.

  16. Sebastian sagt:

    Hat jemand einen Tipp wie ich über die 433 MHz Sende und Empfangsmodule die Daten des DHT 22 ( Temperatur und Luftfeuchtigkeit) übertragen kann? Ich habe das Problem dass ich den Datentyp Float vom Sensor bekomme und ich das aber nicht als Float übertragen kann, sondern das erst in den Datentyp String konvertieren muss. Ich bekomme das jedoch leider nicht hin, selbst mit Google.
    Über Hilfe wäre ich dankbar :)

  1. 24. November 2013

    […] Die Basis-Station, die die Daten der einzelnen Sensoren empfängt und an ein PHP-Webscript übergibt, ist relativ einfach gestrickt und basiert auf meinem HowTo der VirtualWire-Library. […]

  2. 13. Januar 2014

    […] dieser Seite habe ich eine interessante Anleitung zur Verbindung zweier Arduinos via 433MhZ Funkmodulen […]

Schreibe einen Kommentar

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