Funk - gleichzeitig senden und empfangen

Hallo,
ich habe 2 billige RF 433MHz Funksets, bestehend jeweils aus Empfänger und Sender.
Ich habe an 2 Arduinos je einen Empfänger und Sender angehängt und möchte ein Signal senden und dessen Empfang zurück bestätigen.
Zusätzlich je 2 LEDs zur sende/Empfangsanzeige und beim Hauptsender ein Button zum Senden.

Aktuell verwende ich "VirtualWire". Mein Sketch funktioniert nicht richtig. Es funktioniert, jedoch nicht immer!

Beim Tastendruck wird von A1 ein "hallo welt" gesendet. A2 empfängt dieses und sendet "empfangen" zurück.
Um sich nicht in die Quere zu kommen, musste ich ein delay(100) eher delay (1000) einbauen. Somit sinkt die maximale Sendeleistung enorm. bei delay =1 Sekunde kann ich nur noch 1x pro Sekunde ein Signal verschicken.

Letztendlich möchte ich 6stellige Zahlen schicken. die ersten vier Stellen als "ID" des EmpfängerArduinos und die letzten beiden Stellen als Kanalnummer. Damit schalte ich per Funk LEDs ein und wieder aus. Die SchaltFrequenz soll bei hundertstel Sekunden, bzw so schnell wie möglich, liegen!
Der Taster ist nur für erste Tests gedacht. In weiterer Folge wird er entfernt.

ich habe jeweils eine Sende und Empfangsfunktion erstellt.
Im Loop prüfe ich den Taster und rufe die Funktionen auf. Damit es funktioniert habe ich im loop das DELAY einbauen müssen.
Anfangs wollte ich den Taster per Interrupt steuern, das geht nicht, da VirtualWire offensichtlich schon beide Interrupts nutzt.
Damit kann ich meine senden() und empfangen() auch nicht durch Interrupts steuern.

Meine Programme funktionieren, solange ich den Taster nur sehr kurz drücke. Drücke ich zu lange, funktioniert es nicht mehr. Die 2 LEDs zeigen mir Sendung und Empfang an.

Da meine Lösung nicht zuverlässig funktioniert, suche ich eine andere Lösung
Wie kann ich gleichzeitig "ordentlich" und zuverlässig senden und empfangen? Gibt es bessere/andere Bibliotheken? (das China RX Set ist natürlich auch nicht das beste, für erste Tests jedoch ausreichend)

Wie kann ich ohne Interrupts zwei Aktionen gleichzeitig ausführen? also senden und empfangen?

Letztendlich soll ein Signal nochmals gesendet werden, wenn es nicht bestätigt wird.
Der Arduino wird jedoch auch anderes zu tun haben, somit sind delay() Befehle nicht erwünscht.

Hat jemand eine Idee oder Link zu einem beispiel, wie man gleichzeitig senden und empfangen, vernünftig programmiert?

Sender

// VirtualWire 433MHz Sender
// Daten > D7
// 2x LED auf PIN 4 und 6
// Sendetaster auf PIN 3

#include <VirtualWire.h>
char *msg = "Hallo Welt";// Nachricht
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
int led = 4;
int led1 = 6;
volatile int taster = 3;
int taststate = LOW;
int tmp;

void setup() {
  Serial.begin(38400);
  pinMode(5, INPUT);
  pinMode(7, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(taster, INPUT);

  vw_setup(5000);       // Bits pro Sekunde
  vw_set_tx_pin(7);                                           // Datenleitung TX
  vw_set_rx_pin(5);                                          // Datenleitung RX
  vw_rx_start();                                            // Empfänger starten
}

void loop() {
  taststate = digitalRead(taster);
  if (taststate == HIGH) {
    delay(100);
    senden();
  }
}
void senden() {
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx();                         // warten bis alles übertragen ist
  digitalWrite(led, !digitalRead(led));                    //LED ändern
  Serial.println("sending...");
  empfangen ();
}
void empfangen () {
  if (vw_get_message(buf, &buflen)) {                     // überprüfen ob eine Nachricht eingegangen ist
    for (int i = 0; i < buflen; i++) {
      Serial.print((char)buf[i]);                         // Nachricht aus buf ausgeben
    }
    Serial.println("");
    digitalWrite(led1, !digitalRead(led1));                    //LED ändern
  }
}

Empfänger (und Bestätigungssender)

// Data > D5


#include <VirtualWire.h>
char *msg = "Empfangen";// Nachricht
int i;
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
int led=4;
int led1=6;

void setup() {
  Serial.begin(38400);
  pinMode(5, INPUT);
  pinMode(led,OUTPUT);
  pinMode(led1,OUTPUT);
  pinMode(7,OUTPUT);
  
  vw_setup(5000);                                           // Bits pro Sekunde
  vw_set_rx_pin(5);                                          // Datenleitung RX
  vw_set_tx_pin(7);                                         // Datenleitung TX
  vw_rx_start();                                            // Empfänger starten
}
 
void loop () {
  empfangen();
  }

void empfangen () {
  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("");
    digitalWrite(led, !digitalRead(led));                    //LED ändern
    delay(100);
    senden();
  }
}



void senden() {
 
  digitalWrite(led1, !digitalRead(led1));                    //LED ändern
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx();                         // warten bis alles übertragen ist
  Serial.println("ready to send...");
}

Das funktioniert nicht bei 2 Sendern und noch viel weniger bei n Sendern wie Du es vorhast.

Es könnte funktionieren wenn Du den Sender ausschalten kannst und immer nur einer sendet.
Grüße Uwe

Aus deiner Beschreibung werde ich leider nicht richtig schlau.

Nur eins ist sicher: Senden und empfangen gleichzeitig wird nicht funktionieren, da du auf einer Frequenz arbeitest und du würdest theoretisch das Signal empfangen, welches du sendest.
Auch mit dem Arduino ist das schwer möglich, da dieser auch nur eine Sache zur Zeit abarbeiten kann.

Warum du einen Taster per Interrupt abfragen möchtest, verstehe ich nicht.
Das geht in der Loop genau so gut.

Ein weiteres Problem ist die Geschwindigkeit (Baud) in deinem Sketch.
Die genutzte Library ist nur bis 2000 baud spezifiziert. Alles darüber ist sehr unsicher.
Was noch dazu kommt, du sendest in einem Frequenzband, in dem jeder senden darf.
Bedeutet aber du darfst nur relativ kurz und nicht ständig senden.
Genaue Zeiten findest du in den entsprechenden Gesetztesblättern.

"gleichzeitig" ist nicht 100% richtig, da die Module immer nur entweder senden oder empfangen. Sende ich zu mehreren Empfängern, würde ich jeweils abwarten bis ein Signal rückbestätigt wurde. Erst danach wäre ein neuerliches senden möglich.
Durch die Funktion "vw_wait_tx" wäre der Empfang deaktiviert bis alles versendet wurde. Ein Arduino kann sich somit nicht selbst abhören.
Aber was wenn ich diese Funktion weg lasse? Dann müsste der Hauptsender sich auch selbst abhören, was man durch eine case Befehl unterscheiden könnte.

2000 baud ist natürlich ein Problem. Damit wirds nie besonders schnell werden.

Wobei ich die Rückbestätigung vielleicht nicht durchgängig bräuchte. Eine Statusabfrage beim Einschalten mit selbstgebauter Paketverlust-Auswertung wäre womöglich ausreichend. Letztendlich möchte ich wissen ob meine Signale auch ankommen, bzw ob eine Funkverbindung besteht.
nach anfänglicher Rückmeldung wären 2000baud dann wieder ausreichend, da immer nur eine LED geschalten werden würde.

Wenn ich trotzdem eine bidirektionale Verbindung haben möchte, welche Funkmodule wären dafür geeignet?

Donaufisch:
"gleichzeitig" ist nicht 100% richtig, da die Module immer nur entweder senden oder empfangen.

Dann solltest du es in deiner Beschreibung auch nicht verwenden.

Für die Art deiner Anwendung könnten z.B. die HC-12 sehr gut geeignet sein.
Die arbeiten auch auf 433 Mhz und sind leicht ohne zusätzliche Library einzusetzen.
Die senden in FM und haben eine schnellere Übertragungsgeschwindigkeit.

Ich habe damit sehr gute Erfahrungen gemacht.

HC-12 klingt gut!
danke! Das werde ich testen!

Ist das quasi eine Softwareserial Kommunikation über die "Luftschnittstelle", wobei sich das HC12 autark um die Luftschnittstelle kümmert?
Ich muss mich erst genauer einlesen, aber kann ich damit tatsächlich gleichzeitig senden und empfangen?

Welche Reichweiten sind damit realistisch zu erzielen? Klar, hängt von vielen Faktoren ab, aber welche Größenordnung passt zu dem Modul?
ein paar cm, m, 100m oder km?

Donaufisch:
HC-12 klingt gut!
danke! Das werde ich testen!

Ist das quasi eine Softwareserial Kommunikation über die "Luftschnittstelle", wobei sich das HC12 autark um die Luftschnittstelle kümmert?
Ich muss mich erst genauer einlesen, aber kann ich damit tatsächlich gleichzeitig senden und empfangen?

Welche Reichweiten sind damit realistisch zu erzielen? Klar, hängt von vielen Faktoren ab, aber welche Größenordnung passt zu dem Modul?
ein paar cm, m, 100m oder km?

Der HC-12 ist ein LoRa-Modul, damit können bei entsprechender Antenne größere (ca.1000m) erreicht werden. Evtl. auch weiter, habe ich nicht getestet. Aber mit der beigelegten Antenne geht das sicher im gesamten Haus. (Einfamilienhaus). Das Modul wird per serieller Schnittstelle angesprochen.

Du kannst aber auch mit den Teilen nicht gleichzeitig senden und empfangen.
Mit sind auch keine Module für den Arduino bekannt, die dir das bieten.