Problem mit RC-Switch Library

Hallo zusammen,
ich habe mit der RC-Switch Library http://code.google.com/p/rc-switch/ versucht Folgendes zu programmieren: Der Arduino soll das Signal eines Fensterkontakts (von Intertechno) empfangen und abhängig vom Zustand des Fensters (offen oder zu) und weiteren Sensoren die am Arduino angeschlossen sind eine Funksteckdose (ebenfalls von Intertechno) schalten. Im Einzelnen funktioniert das Ansteuern der Steckdose und das Empfangen der Signale des Fensterkontakts einwandfrei. Aber bei der Kombination beider Funktionen scheint es Komplikationen zu geben. Hier mal der Code:

#include <RCSwitch.h>      

RCSwitch mySwitch = RCSwitch();  

int valueReceived,valueReceivedOld;
void setup() {
  Serial.begin(57600);
  mySwitch.enableTransmit(10); 
  mySwitch.setPulseLength(320);
  mySwitch.switchOn('a', 1, 3); 
  mySwitch.enableReceive(0);  
}

void loop() {
  if (mySwitch.available()) {               
    valueReceived = mySwitch.getReceivedValue();
    if(valueReceived != valueReceivedOld) {
      Serial.print("Empfangener Code: ");
      Serial.println(valueReceived);
      Serial.flush();
      if(valueReceived == 20) {
        mySwitch.switchOff('a', 1, 3);
        Serial.println("AUS");
        Serial.flush();
      }
      if(valueReceived == 21) {   
        mySwitch.switchOn('a', 1, 3);
        Serial.println("AN");
        Serial.flush();
      }
    }
    valueReceivedOld = valueReceived;
  }
}

Beim Ausführen werden alle Ausgaben angezeigt aber die Steckdose schaltet nicht. Meiner Meinung nach hat das etwas mit dem Interrupt der enableReceive() Methode zu tun. Wenn ich in der Funktion void setup() vor der enableReceive() eine Schaltbefehl einfüge (switchOff()) schaltet die Steckdose und danach dann nicht mehr. Hat jemand eine Idee woran das liegen könnte? Ich habe auch mal versuch vor dem switchOff()/switchOn() den Interrupt mit disableReceive() auszuschalten aber ohne Erfolg. Es ist vlt. noch wichtig zu erwähnen, dass der Fensterkontakt 4 mal den Code sendet wenn sich der Zustand ändert. Deshalb auch die Spielerei mit valueReceived und valueReceivedOld.
Vielen Dank und viele Grüße
Simon

Ohen die Bibliothek zu analysieren kann es ruhig sein daß Empfangen und Senden inkompatiebel sind. Versuch mal bevor Du senden willst den Empfang abzuschalten, die Sendung einzuschalten, senden, senden auszuschalten und empfangen wieder einzuschalten.

void setup() {
  Serial.begin(57600);
  mySwitch.enableTransmit(10); 
  mySwitch.setPulseLength(320);
  mySwitch.switchOn('a', 1, 3); 
  mySwitch.disableTransmit(10); 
  mySwitch.enableReceive(0);  
}
einschalten()
{
 mySwitch.disableReceive(0); 
 mySwitch.enableTransmit(10); 
  mySwitch.setPulseLength(320);
  mySwitch.switchOn('a', 1, 3); 
  mySwitch.disableTransmit(10); 
 mySwitch.enableReceive(0);   
}

ecc

Grüße Uwe

Hallo Uwe,

danke für den Tipp! So ähnlich hab ich das auch schon probiert aber das schalten klappt leider nicht! Ich hab das Gefühl, dass der Interrupt irgendwie was mit dem switchOn() Methode zu tun hat wobei mir in der Library eig. nichts in die Richtung aufgefallen ist. Problematisch ist auch, dass der Empfänger das gesendet Signal vom Arduino wieder empfängt und einen Interrupt auslöst. Deswegen ist dein Ansatz ja eig. schon der Richtige, der Empfänger muss während des Sendens ausgeschaltet sein. Ich hab auch mal probiert die Stromversorgung des Empfängers über einen digitalen Pin an und auszuschalten. Das hat aber leider auch nicht funktioniert. Ich hab jetzt eine sehr "unschöne" Möglichkeit gefunden indem ich nach Empfangen eines Signals die Ausführung für 2 Sekunden verzögere. Damit geht einem natürlich evtl. ein gesendetes Signal durch die lappen aber das Schalten klappt immer.

void loop() {
  if (mySwitch.available()) {  
    valueReceived = mySwitch.getReceivedValue();
    delay(2000); 
    if((valueReceived != valueReceivedOld)) {
      Serial.print("Empfangener Code: ");
      Serial.println(valueReceived);
      Serial.flush();
      if(valueReceived == 20) {
        sendTest.switchOff('a', 1, 3);
        Serial.println("AUS");
        Serial.flush();
      }
      if(valueReceived == 21) { 
        sendTest.switchOn('a', 1, 3);
        Serial.println("AN");
        Serial.flush();
      }
    }
    valueReceivedOld = valueReceived;
  }
}

Würde mich über weitere Ideen und Anregungen freuen! Gruß, Simon

In der library wird bereits vor dem Senden der Empfang deaktiviert und anschließend wieder reaktiviert, damit er sich nicht selbst empfängt.

Ich schätze eher, dass der Fensterkontakt noch nicht fertig ist mit Senden (die Codes werden in aller Regel mehrfach blind wiederholt gesendet, der Arduino schlägt an sowie er das erste mal einen korrekten Code erkannt hat) und die Funksignale von Fensterkontakt und Arduino - die ja auf gleicher Frequenz laufen wenn ich das richtig verstanden habe - sich dann überlagern. Da hilft wohl nix außer einer Kunstpause. Musst mal austesten wie kurz die Pause sein darf, 2 Sekunden scheint mir etwas viel :slight_smile: