Hallo Zusammen, leider bin ich absoluter Arduino Neueinsteiger habe aber ein konkretes Projekt vor dieser Sender und Empfänger Sketch der zum Teil aus dem internet kommt Funktioniert bereits und hat die Funktion das der Sender die Nachricht "Hallo Welt" an dem Empfänger Sendet und der Empfänger via Serial.print die Nachricht ausgibt. Jetzt möchte ich aber das 1. Der Sender Die Nachricht "Hallo Welt" so sendet wie jetzt bis ein Eingang das Senden für 10 Sekunden unterbricht (an den Eingang soll ein Bewegungsmelder) 2. Der Empfänger bei Ständigem erhalten der Nachricht "Hallo Welt" eine LED zum Blinken bringt und wenn die Nachricht "Hallo Welt" nicht mehr Empfangen wird (kein Empfang länger als 5 Sekunden) einen Signalgeber dazu Schaltet der über einen Taster wieder resetet werden kann Sinn und Zweck ist es einen Durchgangsmelder mit Akkubetrieb sowohl für den Sender als auch für den Empfänger zu bauen ausserdem soll dieses sehr sicher sein Würde mich freuen wenn mir jemand Helfen möchte :) ---Sender Anfang--- #include <VirtualWire.h> #include <VirtualWire_Config.h> // Verbindung vom Sender zum Arduino Uno // GND > D5 // VCC > D6 // Daten > D7 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); } ---Sender Ende--- ---Empfänger Anfang--- #include <VirtualWire.h> #include <VirtualWire_Config.h> // Verbindung vom Empfänger zum Arduino Uno // GND > D4 // Data > D5 // Input > D6 // VCC > D7 int i; uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; void setup() { Serial.begin(9600); pinMode(5, INPUT); pinMode(13, OUTPUT); 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(""); delay(100); } } ---Empfänger Ende---
Marcus W. schrieb: > 1. Der Sender Die Nachricht "Hallo Welt" so sendet wie jetzt bis ein > Eingang das Senden für 10 Sekunden unterbricht > (an den Eingang soll ein Bewegungsmelder) Eingangspin mit if-statement abfragen und 10 sek delay rein. Marcus W. schrieb: > 2. Der Empfänger bei Ständigem erhalten der Nachricht "Hallo Welt" eine > LED zum Blinken bringt und wenn die Nachricht "Hallo Welt" nicht mehr > Empfangen wird (kein Empfang länger als 5 Sekunden) einen Signalgeber > dazu Schaltet der über einen Taster wieder resetet werden kann timer. Marcus W. schrieb: > Sinn und Zweck ist es einen Durchgangsmelder mit Akkubetrieb sowohl für > den Sender als auch für den Empfänger zu bauen ausserdem soll dieses > sehr sicher sein Für Akkubetrieb das ganze anders rum aufbauen. Senden, wenn jemand durchläuft und nicht andersrum. Sonst sendest du die ganze Zeit Datenmüll herum, was bei einem Akkubetrieb von nachteil ist.
Hallo arduok Danke schon mal für deine Antwort das mit dem Eingangspin am Sender mit if-statement werde ich gleich mal ausprobieren das ich das ganze so und nicht andersherum aufgebaut habe hat den Hintergrund das auch bei leerem Akku des Senders oder bei nicht empfang der Nachricht "Hallo Welt" in Jedem Fall der Signalgeber des Empfängers anspricht wie gross der Akku des Senders dimensioniert werden muss damit das ganze so 24 Stunden ohne nachladen Funktioniert ist mir erstmal egal Die Frage ist nur wie schaffe ich es die Empfangene Nachricht mit der Nachricht "Hallo Welt" zu vergleichen um eine Übereinstimmung festzustellen hatte mir gedacht die Nachricht als code zu verwenden um Störungen bzw Fehlinterpretation auszuschliessen
---Sender Code--- void loop(){ if(digitalRead(0) == LOW){ vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // warten bis alles übertragen ist delay(1000); } else { delay(10000); } } Ja okay das Funktioniert aber wie soll ich den Empfänger Arduino programmieren?
Marcus W. schrieb: > Die Frage ist nur wie schaffe ich es die Empfangene Nachricht mit der > Nachricht "Hallo Welt" zu vergleichen um eine Übereinstimmung > festzustellen hatte mir gedacht die Nachricht als code zu verwenden um > Störungen bzw Fehlinterpretation auszuschliessen Dafür gibt es mehrere verfahren: https://de.wikipedia.org/wiki/Pr%C3%BCfsumme (Google mal nach Checksum, oder halt Prüfsumme) Am aller einfachstenDa deine Nachricht, so wie ich das verstanden habe, immer "Hallo Welt" ist, kannst du auf der Empfängerseite nach dem Empfangen eines Signales einfach vergleichen: If(empfangene_daten == Hallo Welt) { // Korrekt } else { // Fehlerbehandlung }
Hallo San Lue Danke auch für deine Antwort also so hab ich´s auch schon versucht nur die Frage ist wie Schreibe ich das genau bin halt absoluter Einsteiger der Folgende Code Funktioniert jedenfalls nicht bzw lässt sich auch nicht Verifizieren: 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(""); delay(100); } ------------------------------------ if((char)buf[i] == "Hallo Welt"){ ------------------------------------ digitalWrite(13, HIGH); delay(200); } else { digitalWrite(13, LOW); }
Du kannst den empfangenen Text mit "strcmp" vergleichen. z.B. if ((strcmp(Text_empfangen, Text_vergleich)) == 0) { So mache ich es mit meinem 433 MHz-Empfänger.
Marcus W. schrieb: > delay(200); Gewöhn dich wenn möglich daran, solche delays zu vermeiden. Denn ein Delay von 200ms sind nunmal 200ms in denen dein uC nichts anderes tut. In deiner simplen Anwendung evt. nicht von Bedeutung, aber bei grösseren Projekten sind solche Delays oft der Anfang vom Ende..
Aber prinzipiell ist deine Vorgehensweise nicht korrekt. Du darfst nicht ständig senden und nur bei eine Aktion diese unterbrechen. Es gibt Bestimmungen, wie auf dem ISM-Band zu verfahren ist. Ich würde dir vorschlagen, ein anderes Konzept zu erarbeiten. Wenn du es so lässt, ist es deine Sache, aber du handelst dir unter Umständen erheblichen Ärger ein.
Marcus W. schrieb: > Sinn und Zweck ist es einen Durchgangsmelder mit Akkubetrieb sowohl für > den Sender als auch für den Empfänger zu bauen ausserdem soll dieses > sehr sicher sein Und sicher ist das auf dem ISM-Band GANZ SICHER NICHT!!
Hallo Dieter S. hab jetzt den Code so ergänzt: #include <String.h> String stringOne, stringTwo; stringOne = String((char)buf[i]); stringTwo = String("Hallo Welt"); ... if((strcmp(stringOne,stringTwo)) == 0) { ... das sind die Fehler ist die Schreibweise denn Richtig? Test.ino:5:1: error: 'stringOne' does not name a type Test.ino:6:1: error: 'stringTwo' does not name a type Test.ino: In function 'void loop()': Test.ino:15:32: error: cannot convert 'String' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)' Fehler beim Kompilieren.
Marcus W. schrieb: > das sind die Fehler ist die Schreibweise denn Richtig? > > Test.ino:5:1: error: 'stringOne' does not name a type > Test.ino:6:1: error: 'stringTwo' does not name a type > Test.ino: In function 'void loop()': > Test.ino:15:32: error: cannot convert 'String' to 'const char*' for > argument '1' to 'int strcmp(const char*, const char*)' > Fehler beim Kompilieren. Ich seh schon, du solltest dich mal mit c/c++ auseinandersetzen. Die Fehler sagen, du benötigst ein anderes Format (char). Deklaration: const char stringTwo[] = {"Hallo Welt"}; char StringReceived[15]; Nach dem holen der Nachricht: StringReceived[i] = char(buf[i]); Und dann vergleichen: if((strcmp(StringReceived,stringTwo)) == 0) Du musst es jetzt nur an die richtige Stelle im Sketch einbauen. Und lass dich nicht beirren, viele wollen nur ihren Senf hinzufügen haben aber selber keinen blassen Schimmer.
Marcus, bitte beachte auch meine weiteren Bemerkungen zu 433 MHz-Sendern.
hab jetzt den Code so verändert Serial.print hab ich deaktiviert mit geht nix ist ja auch egal brauch ich ja nicht allerdings wird jetzt die LED eingeschaltet wenn der Sender sendet aber nicht wieder ausgeschaltet wenn der Sender nicht mehr sendet der Text- Vergleich funktioniert schon mal wenn ich "Hallo Welt" verändere passiert nichts #include <VirtualWire.h> #include <VirtualWire_Config.h> #include <String.h> //String stringOne, stringTwo; // Verbindung vom Empfänger zum Arduino Uno // GND > D4 // Data > D5 // Input > D6 // VCC > D7 const char stringTwo[] = {"Hallo Welt"}; char StringReceived[15]; int i; uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; void setup() { Serial.begin(9600); pinMode(5, INPUT); pinMode(13, OUTPUT); 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 for (i=0;i< buflen;i++) { //Serial.print((char)buf[i]); // Nachricht aus buf ausgeben StringReceived[i] = char(buf[i]); } Serial.println(""); delay(100); } if((strcmp(StringReceived,stringTwo))==0){ digitalWrite(13, HIGH); delay(2); } else { digitalWrite(13, LOW); } }
Dieter S. schrieb: > Du darfst nicht ständig senden und nur bei eine Aktion diese > unterbrechen. > > Es gibt Bestimmungen, wie auf dem ISM-Band zu verfahren ist. ist auf dem 433-MHz ISM-Band eine max. Belegdauer definiert? Ich dachte auf dem Band darf man rund um die Uhr mit 10mW Dauersenden, ohne Belegterkennung/Listen before Talk usw. Darf sich aber auch nicht daran Stören, wenn die Primärnutzer des Bandes mit viel viel viel mehr Sendeleistung "on Air" gehen, und einem den Empfänger zustopfen. ==> mal bei der BNetzA die entsprechende Verfügung raussuchen, bevor du unter die Schwarzsender gehst.
Planlos schrieb: > ist auf dem 433-MHz ISM-Band eine max. Belegdauer definiert? Ja. bei 1mW Sendeleistung keine Begrenzung Bei 10mW Sendeleistung 10% Duty-Cycle Quelle: http://www.eldat.de/wissenswertes/infofunk/frequenzen_de.html Aber wie so oft werden solche Hinweise gekonnt ignoriert von unseren Usern. Hauptsache sie kriegen die Lösung zusammen. ;) Dass dieses Band ausserdem das meist genutzte ist, wird wohl auch nicht gross interessieren. Lieber dann jammern kommen dass irgendwelche komischen Signale ankommen und man wieder mal keine Erklärung dafür findet.
:
Bearbeitet durch User
Planlos schrieb: > ist auf dem 433-MHz ISM-Band eine max. Belegdauer definiert? > Ja, das ist definiert. U.a. auch hier: http://emf3.bundesnetzagentur.de/pdf/ISM-BNetzA.pdf Nur das ist nicht das einzige Problem. Hier tummeln sich auch die CB-Funker (auch Spielzeuge), die meist mit größerer Leistung dazwischen funken. Und dann wars das, mit der gewünschten "sicheren Verbindung". Traurig nur, dass der OP darauf nicht reagiert.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.