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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 433 Mhz-Sender angeschlossen an PIN 7 #include <VirtualWire.h> #undef int #undef abs #undef double #undef float #undef round void setup() { // Initialise the IO and ISR vw_set_ptt_inverted(true); // Required for RF Link module vw_setup(2000); // Bits per sec 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 } void loop() { const char *msg = "Testnachricht"; // this is your message to send vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Wait for message to finish delay(200); } |
433 Mhz Empfänger
Bei folgendem Sketch ist der 433 Mhz Empfänger an PIN 8 eines Arduino Ethernet angeschlossen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <VirtualWire.h> // you must download and install the VirtualWire.h to your hardware/libraries folder #undef int #undef abs #undef double #undef float #undef round void setup() { Serial.begin(9600); // Initialise the IO and ISR vw_set_ptt_inverted(true); // Required for RX Link Module vw_setup(2000); // Bits per sec vw_set_rx_pin(8); // We will be receiving on pin 4 i.e the RX pin from the module connects to this pin. vw_rx_start(); // Start the receiver } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) // check to see if anything has been received { int i; // Message with a good checksum received. for (i = 0; i < buflen; i++) { Serial.print((char)buf[i]); // the received data is stored in buffer } Serial.println(""); } } |
Daten auswerten
Startet nun die serielle Konsole des Empfänger-Arduinos. Ihr solltet die erhaltenen Datenpakete sehen:
[…] 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. […]
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?
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!
[…] dieser Seite habe ich eine interessante Anleitung zur Verbindung zweier Arduinos via 433MhZ Funkmodulen […]
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
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.
Hi Bastian,
funktioniert das auch mit arduino nano bzw arduino mini. Oder nur mit dem Uno?
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).
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.
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.
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…
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 :/
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?!
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?
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?
Das 4. Beinchen ist idR die Antenne (ANT). Wenn die Entfernung nicht groß ist (z.B. auf dem Schreibtisch), dann kannst du eine Antenne weglassen.
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?
Einfach mal an beiden ausprobieren?
Hast du ein Bild von Empfänger/Sender?
Das interessiert micht jetzt auch. der empänger hat ja immer 2 Datenpins
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)
also die bilder kommen erst weiter unten auf ebay nicht von mir
Hallo
Funktioniert das ganze auch z.b. von verschicken und empfangen von Temperatur und Luftfeuchtigkeit Daten?
Wenn ja, wie könnte das aussehen
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?
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
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
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.
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.
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 🙂