433 Mhz Sender und Empfänger

Heute geht es um eine einfache (unidirektionale) drahtlose Übertragung mit einem 433 Mhz Sender und Empfänger. Dabei wird in diesem Beispiel die Verbindung zwischen einem ATtiny und Arduino hergestellt. Ein Raspberry Pi als 433 Mhz Sender oder Empfänger soll auch möglich sein, habe ich aber noch nicht ausprobiert.433 Mhz Sender und Empfänger

Was man damit anfangen kann? Ich habe da mal ein paar Ideen deren Umsetzung ich teilweise bereits geplant bzw. vorbereitet habe. Zusammen mit z. B. dem Arduino Ethernet Shield lassen sich interessante Projekte realisieren.

  • Ein kleiner Funksensor für den Garten mit Temperatur- und Bodenfeuchtesensor mit Stromversorgung über Batterie/Akku und/oder Solar.
  • Ein kleiner Funksensorkontakt für z. B. Fenster-, oder Türüberwachung, Türklingel oder Brief/Zeitungskasten.
  • Ein Funkschalter mit dem man batteriebetriebene Beleuchtung ( z. B. kleine LED Lichterketten die zur Weihnachtszeit überall rumliegen 😉 ) steuern.

Wenn ihr noch gute Ideen habt würde ich mich und andere Leser sich sicherlich auch über ein Kommentar von euch freuen!

In dem HowTo geht es aber erstmal wieder nur darum eine LED blinken zu lassen bzw. diese per Funk zu steuern. Wie das ganze dann in das Smart Home eingebunden werden kann, könnt ihr in den nächsten Beiträgen lesen.

In dem folgenden Beispiel ist der ATtiny Sender und der Arduino Uno Empfänger. Das ganze funktioniert aber auch anders herum, es müssen dazu im Skript nur die Pins angepasst werden.

Spannungsversorgung Sender und Empfänger Modul

Leider sind beim Empfänger und Sender die Betriebsspannung unterschiedlich. Der Sender arbeitet bei 3V-12V wobei mindestens 5V empfohlen sind. Der Empfänger unterstützt jedoch nur 5V. Ich habe den Empfänger aber noch mit 3,5 Volt und provisorischer Antenne schräg durch zwei Wände erfolgreich getestet. Es sind alle Befehle angekommen.

Die passende Antenne

Beide Module haben eine Bohrung in der Platine für eine Antenne. Beim Sender ist die dafür vorgesehene Bohrung beschriftet und beim Empfänger ist diese neben dem gewickelten Kupferdraht. Bis jetzt habe ich immer gelesen das eine Antenne bei beiden 433 Mhz Modulen 17cm lang sein soll.

Aufbau und Verkabelung Sender (ATtiny)

Zum senden habe ich ein FS1000A Modul (auf dem Bild rechts zu sehen) genommen. Beim 433 Mhz Sender erklären sich die Pins GND und VCC von selbst und ATAD (DATA nur umgedreht) kommt wie im Bild zu sehen an Pin 2 des ATtiny. Die LED mit 220 Ohm Widerstand kommt an Pin 3 des ATtiny. Eine Anleitung zur ATtiny Programmierung mit einem Arduino gibt es natürlich auch. Es muss aber kein ATtiny sein!

Arduino 433 Mhz Sender Steckplatine

Sketch Sender

Hier habe ich erstmal für eine einfache Variante entschieden. Der Sender 1 (hier kann später ein längerer Code stehen) schickt im Beispiel in der Schleife einmal eine 0 und dann wieder eine 1. Natürlich könnte man hier auch einen Kontakt abfragen und dann je nach Zustand eine 0 oder 1 schicken aber es soll ja erstmal übersichtlich bleiben.

#include <VirtualWire.h>
char *controller;

#define txPin 2
#define ledPin 3

void setup() {
  pinMode(ledPin,OUTPUT);

  vw_set_ptt_inverted(true);
  vw_set_tx_pin(txPin);
  vw_setup(100); // Bits per sec
}

void loop(){
// Sende Befehl => Sender = 1 LOW = 0
  controller="10";
  vw_send((uint8_t *)controller, strlen(controller));
  vw_wait_tx();
  digitalWrite(ledPin, HIGH);
  delay(4000);

// Sende Befehl => Sender = 1 HIGH = 1
  controller="11";
  vw_send((uint8_t *)controller, strlen(controller));
  vw_wait_tx();
  digitalWrite(ledPin, LOW);
  delay(4000);
}

 Aufbau und Verkabelung Empfänger (Arduino Uno)

Als Empfänger habe ich ein XY-MK-5V (auf dem Bild links zu sehen) genommen. VCC und GND vom Empfänger werden wieder mit dem Arduino verbunden und DATA mit dem Pin 12. Die LED ist bei einem UNO ja bereits auf Pin 13 vorhanden.

Sketch Empfänger

Die eigentlich interessante Stelle ist die If-Bedingung >> if (buf[0]== ‘1’ && buf[1]== ‘1’) << die den empfangenen Befehl im Buffer prüft und dann eine Aktion auslöst. Also wenn richtig dann LED einschalten sonst abschalten. Die Serial Befehle sind auskommentiert damit es keine Fehler gibt wenn man den Sketch auf einen ATtiny schreiben will.

#include <VirtualWire.h>

#define rxPin 12
#define ledPin 13

void setup(){
//  Serial.begin(9600);

  pinMode(ledPin, OUTPUT); 

  vw_set_ptt_inverted(true);
  vw_set_rx_pin(rxPin);
  vw_setup(100); // Bits per sec
  vw_rx_start();
}

void loop(){
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
/*
    for (int i = 0; i < buflen; i++)
    {
      Serial.print(buf[i]);
      Serial.print(' ');
    }
*/
    if (buf[0]== '1' && buf[1]== '1')
    {
//    Serial.println("AN");
      digitalWrite(ledPin, HIGH);
    }  
    else
    {
//    Serial.println("AUS");
      digitalWrite(ledPin, LOW);
    }  
  }
}

24 Gedanken zu „433 Mhz Sender und Empfänger“

  1. Ja, das ist schon ein tolle Sache.
    Ich habe z.B. mit 2 Arduinos einen 433Mhz Funk RGB-Transmitter gebaut.
    Damit kann ich über´s Smart Home die Gartenbeleuchtung Farblich an meine Stimmung anpassen :-).

    1. Genau so was in der Art bin ich gerade am ausprobieren. Wäre nett wenn du den Code veröffentlichen würdest. Bekomm das nicht so ganz auf die Reihe. Ich habe gerade einen Wemos D1 mini als AP und RF Sender konfiguriert. Dieser sendet aktuell dann die Farbe 1,2 oder 3 über RF an einen Arduino Nano.

      Das klappt soweit. Nur hätte ich gerne die VirtualWire genutzt und eine Oberfläche als HTTP konfiguriert um die Mischfarben schön zu senden. Aktuell ohne VirtualWire bekomm ich gerade mal so die drei farben geregelt via
      bei Empfang Code 1233 empfangen ROT an bei Code 1234 BLAU an usw…..

  2. Wo finde ich die Library VirtualWire.h die zusammen mit dem ATtiny45 funktioniert?
    Ich erhalte die Fehlermeldung
    D:ArduinoSketchbooklibrariesVirtualWireVirtualWire.cpp:391:18: error: ‘WGM12’ was not declared in this scope
    TCCR1B = _BV(WGM12); // Turn on CTC mode

    1. Hallo Helmut,

      ich habe meine Library von http://www.airspayce.com und diese funktioniert bei mir mit dem ATtiny85 und einem 433Mhz Modul. Was ich nicht weiß, ob damit auch automatisch die “kleineren” Versionen funktionieren?! Wenn du nicht weiterkommst, kann ich deinen Sketch einmal bei mir kompilieren und schauen ob er durchläuft.

      Viele Grüße
      Stefan

      1. Der Tiny85 ist in der Virtualwire Library definiert, der Tiny45 aber nicht. Wenn man den hinzufuegt, ist dann allerdings der Sketch zu gross (bei mir um36 byte).

        In VirtualWire.cpp nach __AVR_ATtiny85__ suchen und
        #ifdef __AVR_ATtiny85__
        ersetzen mit
        #if defined (__AVR_ATtiny85__) || defined(__AVR_ATtiny45__)

        und if __AVR_ATtiny85__ um || __AVR_ATtiny45__ ergaenzen.

  3. Hallo,

    ich versuche auch gerade eine Funkstrecke zu erstellen, allerdings bekomme ich die Fehlermeldung beim Compilieren:

    /VirtualWire.h:14:20: fatal error: wiring.h: No such file or directory
    #include

    und wenn ich wiring.h einbinde wird aus der Fehlermeldung:

    73:17: error: ‘boolean’ has a previous declaration as ‘typedef uint8_t boolean’
    typedef uint8_t boolean;

    hattest du das Problem auch?

    1. Hallo Lucas,

      ich habe gerade beide Sketches auf Basis vom Arduino Uno und ATtiny 85 mit der Arduino IDE Version 1.6.1 verifiziert und keine Fehlermeldung erhalten?! Bitte schreibe einmal welche Arduino IDE Version, welches Board du nutzt und schick mir am besten auch deinen Sketch, wenn du nicht mit meinem Beispiel testest.

      Viele Grüße
      Stefan

  4. Hi Stefan,

    ich benutze IDE Version 1.6.7, die Programmierung ist sauber erfolgt und funktioniert auch am ATtiny85.
    LED blinkt … nur kommt kein Signal an Pin 12 Arduino UNO an , bzw. die LED13 blinkt nicht. Empfänger und Sender benutze ich die Selben wie beschrieben. Wie kann ich noch den Empfänger testen, bzw. liegt es an der IDE Version?

    Danke
    Niels

    1. Hallo Niels,

      woran es liegt kann ich aus der Ferne schwer sagen! Wenn du die 1.6.7 in Verdacht hast, lade dir doch einfach mal die 1.6.4 runter und probiere es damit. Die verwende ich aktuell noch überall. Ich glaube aber das Problem liegt wo anders! Wenn du Fehler beim Kompilieren und Laden bekommen würdest, wäre es etwas anderes.

      Wenn Verkabelung, Entfernung und die Programmierung passen, kann natürlich noch was kaputt sein?! Hast du den identischen Sketch und die gleichen Pins verwendet oder etwas angepasst? Wenn möglich tausche mal den ATtiny gegen einen Arduino Uno. Wenn es Probleme geben sollte, würde ich auf der Seite anfangen zu suchen.

      Viele Grüße
      Stefan

  5. Hallo Stefan,

    ich habe jetzt einen 2. Arduino als Sender eingesetzt und es funktioniert!
    Offensichtlich ist etwas bei der Programmierung schiefgegangen. Ich habe
    bisher keinen Kondensator am Reset PIN benutzt. Also geht der Sketch auch
    mit der neuen IDE Version.

    Woher bekomme ich die Info ob mit 1 oder 8 Mhz internen Takt gearbeitet wird?

    Vielen Dank
    Niels

    1. Hallo Niels,

      freut mich, dass es funktioniert hat! Ich kann dir leider nicht sagen wie du das abfragen kannst. Zum Anpassen der Geschwindigkeit müssen, soweit ich weiß, über einen geeigneten ISP die Clock Speed Fuses gesetzt werden. Wie das genau funktioniert, kann ich dir leider nicht sagen, da ich mich mit dem Thema noch nicht beschäftigt habe. Sorry!

      Viele Grüße
      Stefan

  6. Also Ich hatte mit diesem Funkmodul NUR Probleme bei meiner Diplomarbeit an der HTL. Wir wollten eine automatische Raumsteuerung für den Innenbereich realisieren, Das Funkmodul weiste Probleme mit der Datenübertragung und der Reichweite auf, was uns sehr viel Zeit gekostet hatte und wir das Projekt nicht wirklich vollenden konnten.

    1. Hallo Hermann,

      ich habe bisher nichts schlechtes gehört?! Meinst du damit das Modul oder die Übertragungsart (433 Mhz)? Baumarktsteckdosen funktionieren nach dem gleichen Prinzip und sind sogar mit dem Sender Modul kompatibel! Natürlich gibt es wesentlich bessere Möglichkeiten Daten zu übertragen. Für eine unidirektionale Übertragung von nicht kritischen Daten, wie von einem Temperatursensor, völlig ausreichend. Mit der richtigen Antenne am Sender UND Empfänger und der richtigen Übertragungsgeschwindigkeit klappt es auch durch zwei Wände noch sehr zuverlässig.

      Viele Grüße
      Stefan

  7. Andere Vorschlag. Was muss ich im Sender Sketch verändern um einen Pin mit Taster zu belegen, das am Empfänger eine LED angeht? Ergo: Was mus ich am Empfänger Sketch ändern, damit dieser erkennt, aha… LED einschalten.
    Danke

    1. Hallo Reiner,

      hier der Sketch für den Sender und Empfänger. Ich hoffe so hast du dir das vorgestellt?!

      Viele Grüße
      Stefan

      ######################## SENDER #########################
      #include <VirtualWire.h>
      char *controller;

      #define buttonPin 1
      #define txPin 2
      #define ledPin 3

      void setup() {
      pinMode(ledPin,OUTPUT);

      pinMode(buttonPin, INPUT);
      digitalWrite(buttonPin, HIGH);

      vw_set_ptt_inverted(true);
      vw_set_tx_pin(txPin);
      vw_setup(100); // Bits per sec
      }

      void loop()
      {
      // Sende Befehl => Sender = 1 HIGH = 1
      if (digitalRead(buttonPin) == LOW)
      {
      controller="11";
      vw_send((uint8_t *)controller, strlen(controller));
      vw_wait_tx();
      digitalWrite(ledPin, LOW);
      delay(4000);
      }
      }

      ###################### EMPFÄNGER ######################
      #include <VirtualWire.h>

      #define rxPin 2
      #define NE555 3

      void setup(){
      // Serial.begin(9600);

      pinMode(NE555, OUTPUT);

      vw_set_ptt_inverted(true);
      vw_set_rx_pin(rxPin);
      vw_setup(100); // Bits per sec
      vw_rx_start();
      }

      void loop(){
      uint8_t buf[VW_MAX_MESSAGE_LEN];
      uint8_t buflen = VW_MAX_MESSAGE_LEN;

      if (vw_get_message(buf, &buflen)) // Non-blocking
      {
      if (buf[0]== '1' && buf[1]== '1')
      {
      // Serial.println("AN");
      digitalWrite(NE555, HIGH);
      delay(100);
      digitalWrite(NE555, LOW);
      }
      }
      }

  8. Super! Vielen dank! Komme aber erst jetzt zum antworten. Das passt so und für mein Vorhaben soll das reichen hab das nur zum testen mal kurz zusammen geklöppelt. Aber trotzdem ne frage. Lässt sich der Empfänger auch so programmieren. Das bei einem eingehenden Signal die LED anbleibt und ich an anderer Stelle der Gartenbahn einen zweiten Sender mit dem gleichen Sketch wie beim ersten Sender verbaue, der die LED wieder ausschaltet. Wäre für mich interessant da ja 50m weiter die Schranken wieder geöffnet werden müßen. Von der Sache her würde es ja auch reichen, einen neuen Impuls zu senden. Der NE555 macht ja als Flip Flop den Rest.
    Die Frage ist, ob ein und der selbe Empfänger mit zwei Sendern klar kommt. Wenn nicht muss ich ne Verzögerung hinter den Timer hängen das die Schranken nach “x Sekunden” wieder aufgehen. Antwort drängelt aber nicht, komm erst Montag wieder zum basteln.
    Euch nen schönes Wochenende. Und schön gediegen beim Maifeuer…. Will zwei ruhige Dienste übers Wochenende haben.

    1. Hallo Reiner,

      ein zweiter Sender sollte kein Problem sein. Wenn du nur einen zweiten Impuls benötigst passt die Programmierung ja bereits?! Wenn du zusätzlich eine LED ein- und ausschalten möchtest, müsstest du beide Sketche kombinieren. Dann könnte der erste Tastimpuls die LED anschalten und einen Impuls zum NE555 schicken, beim zweiten Tastimpuls die LED ausschalten und wieder einen Impuls zum NE555 schicken.

      Viele Grüße
      Stefan

      1. Hallo,
        zum steuern von so “kritischen” Sachen wie Schranken wuerde ich ein vollwertiges Sende-Protokoll nehmen, wie es auch bei Funksteckdosen verwendet wird. Das funktioniert im prinzip genauso, nur es werden mehrere Signale auf einmal gesendet die so kodiert sind, dass der Empfaenger nicht durch Stoerungen und Bitfehler/Rauschen beeintraechtigt wird. Du kannst dann auch verschiedene “befehle” kodieren. Dafuer muesste es bereits bibliotheken geben. Fuer den Raspi gibt es zum Beispiel “pilight”. Der Code fuer das Kodieren und Dekodieren der Signale sollte auch fuer den Attiny85 verfuegbar sein. (Allerdings bin ich erst kurz davor das mit ATtiny85 auszuprobieren. Arbeite aktuell noch mit einem Raspi.)

        Gruß,
        Flo

  9. Hallo, bis auf ein paar Kleinigkeiten habe ich das Projekt schon nachgebaut. Bzgl. der Stromversorgung für den Sender überlege ich, statt AA-Akkus einfach den Strom der Klingel zu nutzen. Kann mir jemand sagen ob es realistisch ist, bei der Kürze des Klingelns in einem Superkondensator genügend Energie zu speichern, um dann den ATTiny85 und das 433MHz Sendemodul zu betreiben?

    1. Hallo Marco,

      deine Frage bzgl. des Superkondensators kann ich leider nicht beantworten aber wie sieht denn deine Schaltung aus? Hast du keine Möglichkeit dauerhaft Strom abzugreifen?

      Viele Grüße
      Stefan

    1. Hallo Didi,

      die Funkmodule werden ganz normal mit Spannung versorgt und der DATA Pin mit einem freien digitalen Pin auf dem Arduino verbunden. Die Daten werden also nicht über eine I2C oder SPI Schnittstelle übertragen. Die VirtualWire Library ist für die passende Formatierung der Daten zuständig.

      Viele Grüße
      Stefan

Schreibe einen Kommentar

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