Nach einer doch etwas längeren Pause, möchte ich in diesem Beitrag nun den Umgang mit 433 MHz Funkmodulen, anhand des Aufbaus eines Funklichtschalters, erklären. Um das Ganze noch etwas interessanter zu gestalten, werde ich den Aufbau des Senders mit einem ATtiny 85 von Atmel realisieren. Der Sender wird später über eine eigene Stromversorgung verfügen, so kann man die Schaltung extrem klein halten, so dass sich diese an jedem noch so kleinen Ort einbauen lässt. Außerdem spare ich mir so einen Arduino der doch reichlich überdimensioniert für diese Anwendung wäre.
Funktion
Über einen PushButton am Sender wird ein Signal zum ein- oder ausschalten eines Verbrauchers an den Empfänger geschickt. Am Empfänger werde ich in diesem Beispiel eine LED schalten. Möglich wäre aber auch das Schalten eines externen Verbrauchers über ein Relays.
Der Übersichtlichkeit halber werde ich den weiteren Verlauf aufteilen in Sender und Empfänger.
Sender
Folgende Teile benötigen wir
- 1 x Arduino zum programmieren des ATTiny
- 1 x PushButton
- 1 x 433 MHz Sender
- 1 x Status-LED
- 2 x Widerstände für die LED und den PushButton
- 1 x ATtiny 85
Aufbau des Senders
In der folgenden Zeichnung sehen Sie den Aufbau meines Breadboards.
Beachten Sie bitte, dass in dieser Zeichnung der Arduino lediglich zur Stromversorgung angeschlossen ist. Später werde ich an dessen Stelle eine externe Stromquelle nutzen.
Um ein Sketch auf den ATtiny zu übertragen muss dieser wie in der unteren Abbildung mit dem Arduino verbunden werden. Im Artikel “http://fluuux.de/2012/09/programmieren-eines-attiny-mit-arduino-1-0-1/” habe ich bereits beschrieben wie man einen ATtiny mit dem Arduino programmieren kann.
Pinbelegung des ATtiny85
Sender-Sketch
Um das Sketch auf den ATtiny85 zu übertragen, wählen Sie unter “Tools->Board” den ATtiny85 mit 8MHz und (internal oscillator). Zuvor sollte, wenn noch nicht geschehen, der interne Takt auf 8MHz geändert werden. Dies erledigen Sie ganz einfach über “Tools->Bootloader installieren”.
Für die Kommunikation mit dem RF433MHz Funkmodulen wird die VirtualWire Library benötigt. Den link zur Seite wo diese Library heruntergeladen werden kann, finden Sie im Sketch.
#include <VirtualWire.h> #undef int #undef abs #undef double #undef float #undef round const int switchPin = 1; const int rxPin = 2; const int ledPin = 3; int state; int lastState; int ledState; char *message; void setup() { pinMode(ledPin, OUTPUT); pinMode(switchPin, INPUT); vw_set_ptt_inverted(true); vw_setup(2000); vw_set_tx_pin(rxPin); } void loop() { state = digitalRead(switchPin); if (state != lastState) { if (state == HIGH) { if (ledState == HIGH) { ledState = LOW; message = "OFF"; } else { ledState = HIGH; message = "ON"; } digitalWrite(ledPin, ledState); // LED am Sender ein- oder ausschalten vw_send((uint8_t *)message, strlen(message)); // LED Status ON oder OFF an Empfänger senden vw_wait_tx(); // Auf den Abschluss der Übertragung warten } lastState = state; delay(20); } }
Wenn Sie das Sketch auf den ATtiny übertragen haben und auf den Button drücken, sollte sich die LED ein und beim erneuten Drücken wieder ausschalten. Gleichzeitig wird je nach Status der LED der Wert ON oder OFF über den RF433 Sender gesendet.
Nun wird es Zeit das wir uns dem Empfänger zuwenden. Der Empfänger ist um einiges schneller aufgebaut, da wir lediglich eine LED und das RF433 Empfangsmodul mit dem Arduino verbinden müssen. Das Sketch zum empfangen werden wir in diesem Fall direkt auf dem Arduino speichern.
Empfänger
Folgende Teile benötigen wir
- 1 x Arduino
- 1 x 433MHz Empfänger
- 1 x LED
- 1 x Widerstand für die LED
Aufbau des Empfängers
Empfänger – Sketch
#include <VirtualWire.h> boolean DEBUG = false; int ledPin = 13; int rxPin = 8; void setup() { if(DEBUG) { Serial.begin(9600); Serial.println(F("Arduino startet...")); } pinMode(ledPin, OUTPUT); vw_setup(2000); vw_set_rx_pin(rxPin); vw_rx_start(); if(DEBUG) Serial.println(F("RF Verbindung gestartet")); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; char SensorDataTemp[VW_MAX_MESSAGE_LEN+1]; // Daten-Variable, die die empfangenen Daten hält String SensorData; // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion if(vw_get_message(buf, &buflen)) { memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1); // Das ganze Array mit Nullen füllen for (int i = 0; i < buflen; i++) { SensorDataTemp[i] = (char)buf[i]; } SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0'; // Char-Variable terminieren SensorData = SensorDataTemp; // Char to String-Konvertierung zur Übergabe an die connect()-Funktion if(SensorData == "ON") { digitalWrite(ledPin, HIGH); if(DEBUG) Serial.println(F("ON")); } else if(SensorData == "OFF") { digitalWrite(ledPin, LOW); if(DEBUG) Serial.println(F("OFF")); } } }
So das war es dann auch schon. Wenn Sie jetzt Sender und Empfänger mit Strom versorgen und den Button am Sender betätigen, sollte die Status-LED des Senders, sowie auch die LED des Empfängers eingeschaltet werden.
Wenn Sender und Empfänger ca. 50cm voneinander entfernt stehen, sollte der Empfang ohne Probleme funktionieren auch wenn man keine externe Antenne angelötet hat. Sollte der Empfänger jedoch weiter weg aufgestellt werden oder sich in einem anderen Raum befinden, sollte man am Ant-Pin von Sender und Empfänger eine externe Antenne anlöten. Als externe Antenne reicht ein Draht mit einer Länge von 17,34cm. Bewährt hat es sich wenn man den Draht zu einer Spirale dreht, indem man diesen um einen Bleistift wickelt. Es gibt jedoch auch Berichte in denen es heißt dass der bestmögliche Empfang dadurch erreicht wurde, dass man den Draht gerade gelassen und diesen vertikal nach oben ausrichtet hatte. Es sollte sich auf jeden Fall um einen festen Draht aus einem einzelnen Kupferkern handeln.
The post Einführung in den Umgang mit einem 433MHz Funkmodul. appeared first on Fluuux - TechBlog.