Arduino 433mhz Sender/Empfänger (Arduino Anfänger)

OP #4293828
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---
Gast
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.
OP
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
OP
---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
}
OP
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);

  }
Gast
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.
Gast
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.
Gast
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!!
OP
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.
Gast
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.
OP
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);

  }
}
Gast
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.