2 Wege Kommunikation mit 433 MHz Modulen

Hallo,
eigentlich geht es hier um zwei Probleme.
Inzwischen habe ich herausgefunden, wie ich z.B. Wörter oder Zahlen von einem Arduino zum Anderen schicken kann. Wenn ich dies in beide Richtungen tun will, brauche ich ja jeweils einen Sender und einen Empfänger. Wie lässt es sich jetzt jedoch verwirklichen, dass der eine Arduino seine eigenen Daten nicht wieder empfängt? Lässt sich vllt. ein Code vor die Daten, z.B. Sensorwerte, schreiben, so dass die Arduinos zwischen verschiedenen Werten unterscheiden können? Dies würde auch mein zweites Problem lösen, dass wenn ich Werte von mehreren Sensoren verschicke, dass der Arduino weiß, welcher Wert zu welchem Sensor gehört. Vllt. lässt sich ja z.B. "Sensor1" vor den Wert schreiben, so dass der Empfänger überprüft, womit die empfangenen Werte anfangen und dann das "Sensor1" wieder entfernt und den übrigen Wert in eine Variable schreibt.
Es wäre sehr freundlich, wenn jemand antworten könnte und die Antwort möglichst einfach formulieren könnte, da ich leider erst kaum Erfahrungen mit Arduinos oder ähnlichem gemacht habe.
Danke

Strings versenden, auf den Anfang abfragen und nur das dahinter konvertieren.

Das muss auch nicht ausufern. Sowas reicht schon:

1,300
2,400

Oder:

a300
b400

Es ist aber auch kein Problem was ausführliches wie "Sensor1:" davorzuschreiben

Serenifly:
Strings versenden, auf den Anfang abfragen und nur das dahinter konvertieren.

Das muss auch nicht ausufern. Sowas reicht schon:

1,300

2,400




Oder:


a300
b400




Es ist aber auch kein Problem was ausführliches wie "Sensor1:" davorzuschreiben

Vielen Dank für die schnelle Antwort!
In dem Beispiel sind also 300 und 400 meine Sensorwerte und 1/2/a/b geben an, um welchen Sensor es handelt? Das mit dem "auf den Anfang abfragen" verstehe ich nur leider nicht. Kann man also nach einem bestimmten Anfang wie "a" usw. suchen und nur den Rest in z.B. eine Variable schreiben?

Und da der Arduino nur eine Sache zur Zeit machen kann, wird es auch nicht passieren, dass der gesendete String vom eigenen Empfänger empfangen wird.

Sobald du den String gesendet hast, lässt du deinen Empfänger empfangen und er wartet auf Signal eines anderen Senders.
Das in Kombination mit den Beispielen von Serenifly und es sollte funktionieren.

HotSystems:
Und da der Arduino nur eine Sache zur Zeit machen kann, wird es auch nicht passieren, dass der gesendete String vom eigenen Empfänger empfangen wird.

Sobald du den String gesendet hast, lässt du deinen Empfänger empfangen und er wartet auf Signal eines anderen Senders.
Das in Kombination mit den Beispielen von Serenifly und es sollte funktionieren.

Achso, vielen Dank, darüber habe ich gar nicht nachgedacht, dass der Arduino ja zur gleichen Zeit nur senden ODER empfangen kann... Dabei war die Antwort eigentlich so einfach... :smiley:

Joachim1712:
Achso, vielen Dank, darüber habe ich gar nicht nachgedacht, dass der Arduino ja zur gleichen Zeit nur senden ODER empfangen kann... Dabei war die Antwort eigentlich so einfach... :smiley:

Dafür hast du uns ja. :wink:

Joachim1712:
Kann man also nach einem bestimmten Anfang wie "a" usw. suchen und nur den Rest in z.B. eine Variable schreiben?

Natürlich. Wieso soll das nicht gehen?

Hier mal Beispiele mit serieller Eingabe über den Serial Monitor. Dazu den so einstellen dass am Ende ein newline/LF gesendet wird!

Mit:

1,300
2,400
const int READ_BUFFER_SIZE = 21;
char serialBuffer[READ_BUFFER_SIZE];

void setup()
{
  Serial.begin(9600);
}


void loop()
{
  if (readSerial(Serial))
  {
    parseSerial();
  }
}

void parseSerial()
{
  int destination = atoi(strtok(serialBuffer, ","));
  int value = atoi(strtok(NULL, ","));

  if (destination == 1)
    Serial.println(F("destination 1"));
  else if (destination == 2)
    Serial.println(F("destination 2"));
  else
    Serial.println(F("unknown destination"));

  Serial.print(F("value: ")); Serial.println(value);
}

bool readSerial(Stream& stream)
{
  static byte index;

  while (stream.available())
  {
    char c = stream.read();

    if (c >= 32 && index < READ_BUFFER_SIZE - 1)
    {
      serialBuffer[index++] = c;
    }
    else if (c == '\n' && index > 0)
    {
      serialBuffer[index] = '\0';
      index = 0;
      return true;
    }
  }
  return false;
}

Mit

a300
b400
void parseSerial()
{
  int value = atoi(serialBuffer + 1);

  if (serialBuffer[0] == 'a')
    Serial.println(F("destination 1"));
  else if (serialBuffer[0] == 'b')
    Serial.println(F("destination 2"));
  else
    Serial.println(F("unknown destination"));

  Serial.print(F("value: ")); Serial.println(value);
}

Mit

Sensor1:200
Sensor2:300

Oder

Sensor1=200
Sensor2=300
void parseSerial()
{
  char* destination = strtok(serialBuffer, ":=");
  int value = atoi(strtok(NULL, ":="));

  if (strncasecmp_P(destination, PSTR("Sensor1"), 7) == 0)
    Serial.println(F("destination 1"));
  else if (strncasecmp_P(destination, PSTR("Sensor2"), 7) == 0)
    Serial.println(F("destination 2"));
  else
    Serial.println(F("unknown destination"));

  Serial.print(F("value: ")); Serial.println(value);
}

Bei der Funk-Sache ist der Empfang anders, aber die Auswertung in parseSerial() geht genauso

Die Auswertung des eigentliches Wertes sollte man in einem richtigen Programm natürlich nur machen wenn man auch wirklich angesprochen ist

Dabei beachten dass man mit == nur ein einziges Zeichen vergleichen kann. Für ganze Strings braucht man Funktionen wie strncmp(). strncasecmp() ignoriert Groß-/Kleinschreibung und die _P Version ist für Vergleichs-Strings im Flash statt RAM

HotSystems:
Und da der Arduino nur eine Sache zur Zeit machen kann, wird es auch nicht passieren, dass der gesendete String vom eigenen Empfänger empfangen wird.

Das stimmt so nicht.

Gepollter Empfang geht gleichzeitig nicht, interrupt- oder timergesteuerter sehr wohl.

Edit: Nachtrag:

HotSystems:
Und da der Arduino nur eine Sache zur (gleichen) Zeit machen kann...

brennt mir besonders in den Augen.

Das ist zwar richtig, wird vom Leser aber gerne in seinen Zeiteinheiten interpretiert, also 1/10 Sekunde aufwärts.
In der Zeit kann der Arduino aber 1,6 Millionen Instruktionen ausführen.
Hunderte+ von Interrupts können in der Zeit bearbeitet werden.

Ein alltägliches Beispiel dafür ist (Hardware)Serial, Empfang und Versand laufen völlig im Hintergrund,
der Arduino macht in dem Fall drei Sachen absolut 'gleichzeitig' (plus micros, millis, Timer, Encoder, ...).