Forum: Mikrocontroller und Digitale Elektronik Arduino 433mhz Sender/Empfänger (Arduino Anfänger)


von Marcus W. (marcuswolter)


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---

von arduok (Gast)


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.

von Marcus W. (marcuswolter)


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

von Marcus W. (marcuswolter)


Lesenswert?

---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?

von San L. (zwillingsfreunde)


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
}

von Marcus W. (marcuswolter)


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);

  }

von Dieter S. (Gast)


Lesenswert?

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.

von San L. (zwillingsfreunde)


Lesenswert?

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

von Dieter S. (Gast)


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.

von Dieter S. (Gast)


Lesenswert?

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!!

von Max D. (max_d)


Lesenswert?

Marcus W. schrieb:
> ausserdem soll dieses
> sehr sicher sein

Ohne Krypto wird das nix

von Marcus W. (marcuswolter)


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.

von Dieter S. (Gast)


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.

von Dieter S. (Gast)


Lesenswert?

Marcus, bitte beachte auch meine weiteren Bemerkungen zu 433 
MHz-Sendern.

von Marcus W. (marcuswolter)


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);

  }
}

von Planlos (Gast)


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.

von San L. (zwillingsfreunde)


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.

: Bearbeitet durch User
von Dieter S. (Gast)


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.

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
Noch kein Account? Hier anmelden.