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

OP #4293828
Lesenswert?

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 #4293845
Lesenswert?

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 #4293873
Lesenswert?

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
#4293972
Lesenswert?

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 #4294027
Lesenswert?

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 #4294150
Lesenswert?

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.
OP #4294363
Lesenswert?

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 #4294405
Lesenswert?

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 #4294931
Lesenswert?

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 #4294962
Lesenswert?

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.
#4295042
Lesenswert?

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 #4295092
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren