virtualwire verarbeitet die antwort nicht

hallo mein Problem ist das ich eine Kommunikation aufbauen will ein master arduino das bsw sensorx sendet und gegenstelle wenn sie bsw sensor1 erhält eine Antwort geben soll. der slave teil funktioniert und es wird die Antwort gesendet. ( wurde an der gegenstelle mit nur senden und nur empfangen getestet)

Mein Master Teil hat Probleme im Aufbau es wird sensor1 gesendet (antwort1 wird empfangen es wird aber nicht erkannt) jeder teil im Programm funktioniert für sich. Ich hoffe jemand von euch kann mir helfen was mein Problem ist. wenn der Teil zwischen //eingefügt entfernt wird arbeitet der Empfangsteil wieder wie er soll.

#include <VirtualWire.h>

//rx teil


int rxPin = 3;



//tx teil


#undef int
#undef abs
#undef double
#undef float
#undef round


const int txPin     = 2;
char *message;



void setup()
{


   Serial.begin(9600);  
   Serial.println("Arduino startet...");  
 



 vw_setup(2000);    
 vw_set_rx_pin(rxPin); 
 vw_rx_start();
  Serial.println("RF Verbindung gestartet");





//tx teil


 vw_set_ptt_inverted(true);

 vw_set_tx_pin(txPin);
  
}

void loop()
{




//eingefügt


{
 
       message = "sensor1";
          
     

     

     vw_send((uint8_t *)message, strlen(message)); // LED Status ON oder OFF an Empfänger senden
     vw_wait_tx();                                 // Auf den Abschluss der Übertragung warten
     Serial.println("sensor1 gesendet");
 

   delay(20);
  }


//eingefügt



 uint8_t buf[VW_MAX_MESSAGE_LEN];
 uint8_t buflen = VW_MAX_MESSAGE_LEN;

 char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];           // Daten-Variable, die die empfangenen Daten hält
 String SensorData;                                   // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion
Serial.println("test1");
 if(vw_get_message(buf, &buflen))
 {
   memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1);   // Das ganze Array mit Nullen füllen

   for (int i = 0; i < buflen; i++) 
   {
     SensorDataTemp[i] = (char)buf[i];
   } 

   SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0';       // Char-Variable terminieren
   SensorData = SensorDataTemp;                       // Char to String-Konvertierung zur Übergabe an die connect()-Funktion 

   if(SensorData == "antwort1")
   {
     
      Serial.println("antwort1 empfangen");
   }

   
 }
}

Setze deinen Sketch bitte in Code-Tags, damit dieser richtig zu lesen ist.
Sketch markieren und Schaltfläche </> oben links im Editor klicken.

Der Hauptfehler in deinem Sketch ist, du sendest dauernd ein Signal aus.
Damit störst du alle umliegenden Empfänger und das dauernd.
Evtl. hat dadurch den Sensor keine Chance ein Signal zu senden.
Da wir den Sketch aber nicht kennen, dürfen wir wiedermal nur raten.

Nimm INTERVAL.h zum senden und schmeiß das delay raus

Wieso die Antwort in ein String Objekt konvertieren? Schau dir die strcmp() Funktion an, dann kannst du C Strings auch direkt vergleichen.

Muss ich delay oder Intervall überhaupt benutzen kann ich das nicht komplett weg lassen ?
hier der 2 Sketch der prinzipiell aus den gleichen Bausteinen besteht wie der Sketch oben ABER FUNKTIONIERT hier wird nur auf ein bestimmtes Wort gewartet und eine Antwort ausgegeben.

#include <VirtualWire.h>
 
//rx teil
 

int rxPin = 3;

 
 
 //tx teil

 
#undef int
#undef abs
#undef double
#undef float
#undef round
 

const int txPin     = 2;
char *message;



void setup()
{
 
 
    Serial.begin(9600);  
    Serial.println("Arduino startet...");  
  
 

 
  vw_setup(2000);    
  vw_set_rx_pin(rxPin); 
  vw_rx_start();
   Serial.println("RF Verbindung gestartet");





//tx teil

 
  vw_set_ptt_inverted(true);
 
  vw_set_tx_pin(txPin);
   
}
 
void loop()
{

  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
  char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];           // Daten-Variable, die die empfangenen Daten hält
  String SensorData;                                   // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion
 
  if(vw_get_message(buf, &buflen))
  {
    memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1);   // Das ganze Array mit Nullen füllen
 
    for (int i = 0; i < buflen; i++) 
    {
      SensorDataTemp[i] = (char)buf[i];
    } 
 
    SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0';       // Char-Variable terminieren
    SensorData = SensorDataTemp;                       // Char to String-Konvertierung zur Übergabe an die connect()-Funktion 
 
    if(SensorData == "sensor1")
   
    {
      Serial.println("sensor1 wurde empfangen");
 
       {{
  
        message = "antwort1";
       
 
      
 
      vw_send((uint8_t *)message, strlen(message)); // LED Status ON oder OFF an Empfänger senden
      vw_wait_tx();                                 // Auf den Abschluss der Übertragung warten
      Serial.println("antwort1 wurde gesendet");
 
    }
 
    
  }  
    }
 
    else if(SensorData == "OFF")
    {
     
      Serial.println("OFF");
    }
  }
}

Macht es Sinn im Sketch vom ersten post einzubauen das er nach dem Senden xxx ms wartet (natürlich ohne delay) bevor erneut gesendet wird?

martinjan:
Muss ich delay oder Intervall überhaupt benutzen kann ich das nicht komplett weg lassen ?

Das hängt ganz von deinen Anforderungen ab.

Wenn du genau beschreibst, was der Sketch machen soll, können wir das evtl. beantworten.
Wobei "delay" und "Intervall" zwei völlig verschiedene Funktionen mit unterschiedlichen Ergebnissen sind.

ein Sketch fragt die Werte bei jeden Sensoren nacheinander an und erhält diese zurück

die Gegenseite wartet auf ihren Namen und Antwortet mit den Werten. Theoretisch nichts kompliziert

im Programm ist zur Fehlersuche Test 1 Test 2 … eigebaut test 2 wird aber nie ausgegeben und auch keine Tests danach. Wenn ich das richtige Verstehe wird

if(vw_get_message(buf, &buflen))

nicht erfüllt was aber meiner Meinung der Fall sein sollte denn mit einem anderen Arduino wird antwort1 gesendet was benötigt wird… (wurde mit einem 3 arduino abgehört )

#include <VirtualWire.h>
 
//rx teil
 

int rxPin = 3;

 
 
 //tx teil

 
#undef int
#undef abs
#undef double
#undef float
#undef round
 

const int txPin     = 2;
char *message;



void setup()
{
 
 
    Serial.begin(9600);  
    Serial.println("Arduino startet...");  
  
 

 
  vw_setup(2000);    
  vw_set_rx_pin(rxPin); 
  vw_rx_start();
   Serial.println("RF Verbindung gestartet");





//tx teil

 
  vw_set_ptt_inverted(true);
 
  vw_set_tx_pin(txPin);
   
}
 
void loop()
{

  
        message = "frage1";
         Serial.println("frage1gesendet");
      
 
      
 
      vw_send((uint8_t *)message, strlen(message)); // LED Status ON oder OFF an Empfänger senden
      vw_wait_tx();                                 // Auf den Abschluss der Übertragung warten
    
 
    delay(20);
  
    

  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
  char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];           // Daten-Variable, die die empfangenen Daten hält
  String SensorData;                                   // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion
 Serial.println("test1");
  if(vw_get_message(buf, &buflen))
  {Serial.println("test2");
    memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1);   // Das ganze Array mit Nullen füllen
 
    for (int i = 0; i < buflen; i++) 
    {Serial.println("test3");
      SensorDataTemp[i] = (char)buf[i];
    } 
 
    SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0';       // Char-Variable terminieren
    SensorData = SensorDataTemp;                       // Char to String-Konvertierung zur Übergabe an die connect()-Funktion 
     Serial.println("test4");
    if(SensorData == "antwort1")
    { Serial.println("antwort1 empfangen");
      }
       
 
    else if(SensorData == "OFF")
    {
     
      Serial.println("OFF");
    }
  }
}

Deine Loop ist sehr unübersichtlich, daher vermute ich, dass die Anweisungen zum Senden und Empfangen der Signale sich in die Quere kommen.

Du solltest das in einzelne Funktionen packen, damit diese sicher getrennt sind und die Funktion jeweils zur richtigen Zeit aufgerufen wird.

Also eine Funktion "DatenSenden" und eine zweite "DatenEmpfangen".

ich brauch mal eure Hilfe wenn mein Programm wie folgt aussieht wird nur frage1 gesendet der Empfangsteil der antwort1 erhält wird nicht verarbeitet

#include <VirtualWire.h>
 

#undef int
#undef abs
#undef double
#undef float
#undef round
 

const int txPin     = 2;

 

char *message;
int rxPin = 3;
 
void setup()
{
 
  {
    Serial.begin(9600);  
    Serial.println("Arduino startet...");  
  }
 
 
  vw_set_ptt_inverted(true);

  vw_set_tx_pin(txPin);
  
  vw_setup(2000);    
  vw_set_rx_pin(rxPin); 
  vw_rx_start();
   Serial.println("RF Verbindung gestartet");
}
 
void loop()
{{
  
        message = "frage1";
           
      
 
      
 
      vw_send((uint8_t *)message, strlen(message)); // LED Status ON oder OFF an Empfänger senden
      vw_wait_tx();                                 // Auf den Abschluss der Übertragung warten
      Serial.println("antwort1 gesendet");
    }


  
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
  char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];           // Daten-Variable, die die empfangenen Daten hält
  String SensorData;                                   // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion
 
  if(vw_get_message(buf, &buflen))
  {
    memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1);   // Das ganze Array mit Nullen füllen
 
    for (int i = 0; i < buflen; i++) 
    {
      SensorDataTemp[i] = (char)buf[i];
    } 
 
    SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0';       // Char-Variable terminieren
    SensorData = SensorDataTemp;                       // Char to String-Konvertierung zur Übergabe an die connect()-Funktion 
 
    if(SensorData == "antwort1")
    {
     
       Serial.println("antwort1 empfangen");
    }
 
    else if(SensorData == "OFF")
    {
    
      Serial.println("OFF");
    }
  }
  }
}

wenn ich den Teil mit dem Senden entferne wird der Empfangsteil verarbeitet ( sonst identischer Aufbau)

#include <VirtualWire.h>
 

#undef int
#undef abs
#undef double
#undef float
#undef round
 

const int txPin     = 2;

 

char *message;
int rxPin = 3;
 
void setup()
{
 
  {
    Serial.begin(9600);  
    Serial.println("Arduino startet...");  
  }
 
 
  vw_set_ptt_inverted(true);

  vw_set_tx_pin(txPin);
  
  vw_setup(2000);    
  vw_set_rx_pin(rxPin); 
  vw_rx_start();
   Serial.println("RF Verbindung gestartet");
}
 
void loop()
{


  
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
 
  char SensorDataTemp[VW_MAX_MESSAGE_LEN+1];           // Daten-Variable, die die empfangenen Daten hält
  String SensorData;                                   // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion
 
  if(vw_get_message(buf, &buflen))
  {
    memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1);   // Das ganze Array mit Nullen füllen
 
    for (int i = 0; i < buflen; i++) 
    {
      SensorDataTemp[i] = (char)buf[i];
    } 
 
    SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0';       // Char-Variable terminieren
    SensorData = SensorDataTemp;                       // Char to String-Konvertierung zur Übergabe an die connect()-Funktion 
 
    if(SensorData == "antwort1")
    {
     
       Serial.println("antwort1 empfangen");
    }
 
    else if(SensorData == "OFF")
    {
    
      Serial.println("OFF");
    }
  }
  }
}

wieso funktioniert das Empfangen nicht oder wird nicht verarbeitet wenn ich den SENDE teil im Programm lasse ? anwort1 wird jede Sekunde von einem Arduino geschickt und an einem 3 überwache ich die Kommunikation ??

martinjan:
ich brauch mal eure Hilfe.....

Und warum ignorierst du die Hilfe, die man dir bietet ?
Ich hatte dir doch in Post # 7 schon geschrieben, dass du das Empfangen und Senden der Daten in einzelne Funktionen packen musst
Alles in der Loop irgendwie zusammengewürfelt funktioniert nicht.
Also trennen und nacheinander aufrufen, dann läuft jede Funktion für sich und wird nicht durch die andere gestört.
Damit wird das auch sehr viel übersichtlicher und aufgeräumter.

Oder welche Probleme hast du damit ?
Wenn du etwas nicht verstehst, schreib es einfach.

Edit:

Auch verstehe ich nicht, nach welchem "Rezept" du deine Klammern "{}" gesetzt hast.
Da sind etliche zu viel vorhanden.

wo hast du denn das

#undef int

her ?
Macht es einen Unterschied, wenn du es (und die ähnlichen anderen) einfach entfernst?

Wenn du sagst, dass du das aus dem gefundenen Sketch hast, such dir lieber eine komplett andere Vorlage. :wink:

Wenn es eine Erklärung gibt, wäre ich andererseits sehr interessiert.

@ hotsystems ich versteh nicht so ganz wie du das meinst muss ich zugeben ich wollte wirklich nicht deine Hilfe ignorieren oder so und es tut mir leid, wenn es den Eindruck gemacht hat. Ich habe alles einzelnen abrufe auch mal je in diese Klammern { } gesetzt aber das bringt meines Wissens ja nicht da doch das Programm alles nacheinander abarbeitet (hat auch keine Änderung gebracht). Kannst du mir da ein Beispiel posten wie du das gemeint hast?

Ok, dann weißt du nicht, was Funktionen sind.
Es hilft da auch nichts, wenn du es in Klammern setzt.

Sieh mal hier.

Aber auch das steht schon in Post #7.
Wenn du keine Funktionen kennst, warum fragst du nicht nach ? Wir kennen deinen Wissensstand nicht.

Edit:
Das könnte dann etwa so aussehen:

void setup() {
  // dein Setup
}

void loop() {
  // deine Loop
  DatenSenden();
  DatenEmpfangen();
}

void DatenSenden() {
  // dein Code um Daten zu senden
}

void DatenEmpfangen() {
  // dein Code um Daten zu empfangen
}

Damit werden die einzelnen Funktionsblöcke getrennt und können sich im Code nicht stören.