Funksteckdose und IR Empfänger

Hallo!

Ich habe folgendes Projekt/Problem:

Ich möchte mit nicht benutzten Tasten auf meiner IR Fernbedienung meine Funksteckdosen schalten.

Daraufhin habe ich ein bisschen gegoogelt und mir die dazu nötwendigen Teile bestellt.
Der Code war auch schnell gefunden und ich bin jetzt soweit gekommen das ich:

entweder den IR Code lesen
oder die Steckdose schalten

kann.

Beides zusammen funktioniert aber nicht. Leider habe ich auch nur sehr begrenzte Kenntnisse im programmieren und so habe ich es bisher mit Try&Error ausprobiert.

Wenn ich den Code für senden & empfangen ausprobiere bekomme ich zwar die Meldungen "Stecker 1 an" und "Stecker 1 aus" aber an der Funksteckdose tut sich nichts.

Nur Empfangen:

/
/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

Nur Senden:

/*
  Example for different sending methods
  
  http://code.google.com/p/rc-switch/
  
  Need help? http://forum.ardumote.com
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

  Serial.begin(9600);
  
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(10);

  // Optional set pulse length.
  // mySwitch.setPulseLength(320);
  
  // Optional set protocol (default is 1, will work for most outlets)
 mySwitch.setProtocol(2);
  
  // Optional set number of transmission repetitions.
  // mySwitch.setRepeatTransmit(15);
  
}

void loop() {

  

  /* Same switch as above, but using decimal code */
  mySwitch.send(369171392, 32);
  delay(2000);  
  mySwitch.send(503389120, 32);
  delay(2000);  

}

Senden & Empfangen:

/*
 * Funksteckdosen über eine Harmony steuern
 * Version 0.1 Dezember 2013
 * Pascal König
 * http://www.pascals-koenigreich.de/
 */

#include <IRremote.h>
#include <RCSwitch.h>

int RECV_PIN = 11;

unsigned long codeValue;

IRrecv irrecv(RECV_PIN);
RCSwitch mySwitch = RCSwitch();

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  mySwitch.enableTransmit(10);
  mySwitch.setProtocol(2);
}

void loop() {
  if (irrecv.decode(&results)) {
    //Serial.println(results.value, HEX);
    codeValue = results.value;
    Serial.println(codeValue);
    
    switch(codeValue){
      case 824:
        Serial.println("Stecker 1 an");
        mySwitch.send(369171392, 32);
        break;
      case 2872:
        Serial.println("Stecker 1 aus");
        mySwitch.send(503389120, 32);
        break;
      default:
        //nichts
        break;
    }
    
    irrecv.resume(); // Receive the next value
  }
}

Das 433Mhz Modul:

Die Funksteckdose:
RSL888R von Conrad

Ich freue mich über jede Hilfe!

memorex23:
Beides zusammen funktioniert aber nicht. Leider habe ich auch nur sehr begrenzte Kenntnisse im programmieren und so habe ich es bisher mit Try&Error ausprobiert.

Ich bin leider nicht so gut mit Foren vertraut, deswegen habe ich meine Sketches in eine zip Datei gepackt. Sonst hätte Ich es mit der Code Funktion, die ich in anderen Posts gesehen habe, eingefügt.

Dann hast du den Code nicht richtig erstellt.

Und die Funktion zum Code einsetzen direkt im Thread gibt es hier auch.
Nutze bitte die "</>" Taste zum Einfügen. Das mit der Zip-Datei ist die schlechteste Lösung überhaupt.
Das ist z.B. mit einem Tablet sehr umständlich. Daher kann ich es nicht lesen.

Also bitte füge es in den Thread ein, damit wir dir helfen können.

Und teile uns bitte mit, welche Module du verwendest, da gibt es auch immer wieder Problem.

Ahh Danke, das "</>" hatte Ich übersehen.
Habe meinen Post angepasst.

Prima, so hat es funktioniert.

Dein Problem könnte evtl. an der Pulslänge liegen.

 mySwitch.setPulseLength(320);

Da musste ich auch schon ziemlich rumexperimentieren.

An sich ist der Code richtig aufgebaut, was mich allerdings wundert, ist der recht kurze IR-Code.
Aber wenn es einzeln funktioniert, muss es ja richtig sein.

Hallo,
Du nutzt also die Lib und die Beispiele von "Ken Shirriff"- das ist gut, weil-
das Zeugs funktioniert…

"Ich möchte mit nicht benutzten Tasten auf meiner IR Fernbedienung meine Funksteckdosen schalten."

Wie darf ich das denn verstehen? Du hast einen Arduino in Deine Fernbedienung
eingebaut?

Aber wahrscheinlich ist es dieser hoffnungslose Fall…
Du hast ein IR-Fernbedienung, mit der sendest Du Signale zum Arduino- der
wieder gibt geheimnisvolle Daten an das 433-Modul?

Ich würde da anders rangehen…
Den Arduino bestückst Du mit 2 Tastern (an/aus)
Dann schreibst Du Dir einen Code für das 433-Modul, der in der Lage ist, über
Deine beiden Taster die Steckdose zu schalten.

Also, Arduino starten, Taste drücken, Steckdose an- andere Taste drücken-
Steckdose aus- so einfach kann das sein…

Wenn das Fehlerfrei läuft, dann kannst Du dich um IR kümmern.

Jetzt hast Du zu viele Unbekannte
-welches Protokoll nutzt die Steckdose?
-welches Protokoll kann der Sender?
-können sich Sender und Steckdose verstehen?
-welche Befehle erwartet die Steckdose?
-wie "sehen" diese aus?
-auf welchem Kanal wird gesendet?

Bei diesem "FunkMist" kommt eines zum anderen. Ich würde mir mal eine
Fernbedienung besorgen, mit der Du die Steckdose schalten kannst.
Dann mit dem Arduino Empfänger den SendeCode lesen und versuchen diesen zu
senden.
Gruß und Glück- das wirst Du brauchen.
Andreas

@SkobyMobil

Ich würde da anders rangehen…
Den Arduino bestückst Du mit 2 Tastern (an/aus)
Dann schreibst Du Dir einen Code für das 433-Modul, der in der Lage ist, über
Deine beiden Taster die Steckdose zu schalten.

Ich muss dich da berichtigen.

Im ersten Post hat er das genau beschrieben.

Also einzeln funktioniert es.

Hallo,
kann sein...

Wenn das:

" mySwitch.send(369171392, 32);"

seine Steckdose etwas machen läßt, dann reicht:

if ((results.value == 0x77E130B6) // IR-empfangenes Signal
{
mySwitch.send(369171392, 32);
}
Gruß und Spaß
Andreas

An der Pulslänge habe ich auch schon rumprobiert. Ich habe Spaßeshalber dort mal 668 eingetragen weil mir das als Pulslänge angezeigt wird wenn ich den Funk Code von der Funk Fernbedienung auslese.

In dem Sketch für "nur senden" funktioniert es sowohl wenn ich die Zeile auskommentiert lasse und auch wenn ich 668 eintrage.

Jetzt müsste es nach meinem Verständnis doch auch funktionieren wenn ich den Code für das decodieren des IR Signals ergänze. :frowning:

Meine vorgehensweise zur Fehlersuche war bisher folgende:
In dem Sketch für "nur Senden" lasse Ich die Steckdose abwechselt an und aus gehen. Das funktioniert ja soweit.

Jetzt füge ich Zeile für Zeile aus dem "nur Empfangen" Sketch hinzu und sobald ich den Befehl:

irrecv.enableIRIn(); // Start the receiver

einfüge geht es nicht mehr. Ein bekannter hat mir gesagt das es eventuell mit den Librarys zusammenhängen könnte weil sich dort Timer oder sonst irgendwas überschneiden.

Leider fehlt mir an dieser Stelle das Verständnis um mich da durch zu wursteln.

Um die noch offenen Fragen zu beantworten:

Die Fernbedienung die ich benutze ist meine Harmony Universalfernbedienung. Die kann alles schalten was ich habe, nur halt keine Funkt Steckdosen.
Ziel des ganzen ist es mit dieser einen Fernbedienung alles steuern zu können was sich in meinem Wohnzimmer befindet. Für deinen Vorschlag mit den Tastern bin ich dir dankbar aber er scheidet aus weil ich mir damit nur eine Fernbedienung nachbauen würde die ich ohnehin schon habe (Die war ja in dem Set dabei).

-welches Protokoll nutzt die Steckdose?
Protokoll 2 (Weiß nicht ob du das meinst aber das steht da wenn ich den FunkCode mitschneide)

-welches Protokoll kann der Sender?
Schätze mal auch Protokoll 2

-können sich Sender und Steckdose verstehen?
Ja, mit dem Sektch "nur senden" gelingt es mir die Steckdose sowohl Ein als auch Aus zu schalten.

-welche Befehle erwartet die Steckdose?
AN: 906042304 / 32bit Protocol: 2

AUS: 1040260032 / 32bit Protocol: 2

-auf welchem Kanal wird gesendet?
Weiß ich nicht, wie kann ich das in Erfahrung bringen?

Den Tipp mit:

if ((results.value == 0x77E130B6) // IR-empfangenes Signal
{
mySwitch.send(369171392, 32);
}

Habe ich ausprobiert, hat leider nicht funktioniert. Wobei ich aber nicht nachvollziehen kann wie du auf 0x77E130B6 gekommen bist.

Ja, genau das macht er, nur per Switch/case, aber das sollte nicht das Problem sein, wenn er die richtige Meldung im Monitor sieht. Die zeigt er ja an.

Ob es an den Timern liegen kann, kann ich jetzt auch nicht direkt sagen, ich glaube aber nicht, da unterschiedliche Timer verwendet werden.

Aber teste doch mal andere Ports.

Edit:
Auf 433 MHz gibt es nur einen Kanal. Den kann man nicht ändern.
Ist auch kein Problem, da man ja nicht dauern sendet (auch nicht darf).

Hallo,
dann hast Du ja schon etwas geschafft, sieht ja schon gut aus…
Wenn das mit "nur senden" klappt, dann sollte:

if ((results.value == 0x77E130B6) // IR-empfangenes Signal
{
mySwitch.send(369171392, 32);// der Befehl zum schalten
}

…das funktionieren.

Die "RCSwitch.h" kenne ich nicht.
Wenn die StundenRund einen Timer nutzt, den IR braucht- dann wird es eng.
Der Arduino kann nur eines zur Zeit, nicht zwei gleichzeitig.

Wenn Du einen Code hast, der das mit Arduino Tastern macht.

Dann sieht das doch so aus:
if (digitalRead(S1) == HIGH)
{
Steckdose schalte
}

Diesen TastenCode tauscht Du dann gegen den IR-Code von oben.
Das sollte funktionieren.
Wenn nicht, dann würde ich einmal andere Pin´s schalten.
Du kannst auch einmal "in eine Lib schauen" dort findet man meistens die
"LieblingsPin´s" der gleichen.
Gruß und Spaß
Andreas

Nimm mal zum testen den "Serial.print" vor den Sendebefehlen raus.
Und setze die dahinter.

Nur mal probieren.

Ich habe die Serial Befehle entfernt und alle Pins ausprobiert, ohne Erfolg.
Bei Pin 13 ist mir aufgefallen das Ich dort ja durch die Onboard LED sehen kann ob der PIN schaltet. Er flackert auch sowohl wenn es funktioniert als auch wenn nicht. Mit bloßem Auge ist natürlich kein Unterschied zu erkennen.

Es bleibt bei der Erkenntnis das es nicht mehr geht sobald:

irrecv.enableIRIn(); // Start the receiver

im Code auftaucht.

In die Library habe ich schon reingeschaut aber da verstehe ich nur Bahnhof.
Ich komme mehr so aus der Richtung Industrie, wo die UNDs und ODERs grün leuchten wenn die Bedingung erfüllt ist :smiley:

Da ich alles (Hardware) hier habe und in getrennter Form auch schon funktionsfähig aufgebaut habe, werde ich es in den nächsten Tagen mal zusammen aufbauen und testen.

Also bitte Geduld, ich melde mich dann zu dem Problem.

Das ist echt nett von dir!
Ich werde geduldig auf deine Antwort warten.
Bis dahin wünsche Ich aber erstmal eine gute Nacht.

Hallo,
bin beim Blättern auf diesen Thread gestossen.
Ich kann zu diesem speziellen Problem nichts sagen,
hatte aber mal mit anderen Libs das Problem das Timer benutzt wurden und sich die Funktionen dadurch störten.
Es gibt doch sicherlich die Möglichkeit den IR Receiver adäquat zum Starten auch zu stoppen ?
Gibt doch einfach mal vor dem Senden des Befehls zum Einschalten der Funksteckdose ein "disable" Kommando zum abschalten des IR-Receivers. Dann sendest Du das Kommando zum Einschalten der Steckdose und gibst danach wieder das "enable" Kommando für den IR Receiver, wie Du es im SETUP gemacht hast, wieder ein. Wenn es dann funktioniert, weist du, dass sich die Libs mit den Timereinstellungen in die Quere kommen.

Gruß und viel Glück
Klaus

Hallo memorex23,

setze bitte mal den Befehl "irrecv.enableIRIn();" hinter jeden Sendebefehl, so wie in folgendem Beispiel.

mySwitch.send(369171392, 32);
irrecv.enableIRIn(); // Start the receiver
delay(50);
break;

Dann sollte das funktionieren.

Hallo,
geht mich ja nichts an, aber warum schaltest Du hier den IR-Empfänger scharf-
und im selben Moment danach den gesamten Arduino tot?
Gruß und Spaß
Andreas

Hallo,
ich habe es bei mir einmal angeschaut, ich glaube Du verzettels Dich da
irgendwo in der case,

void setup()  
{
irrecv.enableIRIn(); // Start the receiver
}

void loop()
{

 if (irrecv.decode(&results))
{
 // Serial.println(results.value, HEX); 
    irrecv.resume(); // Receive the next value
   
  }  

switch (buttonPressesS1)
//******************************    
{  
case 1:

mach was

break;
//****************************** 
case 2:

  if ((digitalRead(S3) == HIGH)  || (results.value == 0x77E150B6))
{
mach was
}

break;
//****************************** 
}//                                                            ende switch          


default:
//****************************** 

mach was im Sketch


(results.value = 0);

}//                                                            ende loop

nach Deinem "default" kommt kein "break für case mehr.

Gruß und Spaß
Andreas

So,

ich habe mittlerweile alles ausprobiert was mir geraten wurde. Leider hat nichts davon funktioniert :frowning:
Trotzdem habe ich jetzt das von mir gewünschte Ziel erreicht!
Zwar ist das eine echte Bastellösung, aber was solls wenn hinten das rauskommt was ich will.

Ich habe jetzt einfach 2 Arduinos genommen.
Einer empfängt das IR Signal und schaltet dann Ausgänge, die am anderen Arduino eingelesen werden und der dann das Funk Signal sendet.

Das ganze ist im Moment noch ein fliegender Aufbau. Wenn es jetzt aber ein paar Wochen ohne Probleme läuft wird das ganze auf 2 Microcontroller geflasht und dann fest verlötet. Dann bekommt das ganze auch in ein hübsches Gehäuse und noch ein paar LEDs.

Falls jemand Interesse an meiner Lösung hat ist hier der Code für die beiden und ein Foto.

Der IR Empfänger:

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

// Bibliotheken laden
#include <IRremote.h>

// Pins vorbelegen
IRrecv irrecv(11);


//Variablen anlegen
decode_results results;

void setup()
{
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
    irrecv.resume(); // Receive the next value
  }


//Ausgang 1  
   if (results.value == 824)
  {
    if (digitalRead (3) == LOW)
      {
      digitalWrite (3, HIGH);
      delay (500);
      }
    else
      {
      digitalWrite (3, LOW);
      delay (500);
      }
  } 

//Ausgang 2  
   if (results.value == 2872)
  {
    if (digitalRead (4) == LOW)
      {
      digitalWrite (4, HIGH);
      delay (500);
      }
    else
      {
      digitalWrite (4, LOW);
      delay (500);
      }
  } 

//Ausgang 3  
   if (results.value == 1848)
  {
    if (digitalRead (5) == LOW)
      {
      digitalWrite (5, HIGH);
      delay (500);
      }
    else
      {
      digitalWrite (5, LOW);
      delay (500);
      }
  } 

//Ausgang 4  
   if (results.value == 3896)
  {
    if (digitalRead (6) == LOW)
      {
      digitalWrite (6, HIGH);
      delay (500);
      }
    else
      {
      digitalWrite (6, LOW);
      delay (500);
      }
  }       
  
 
}

Der Funk Sender:

/*
  Example for different sending methods
  
  http://code.google.com/p/rc-switch/
  
  Need help? http://forum.ardumote.com
*/

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

int hatgesendet1_ein = 0;
int hatgesendet1_aus = 0;
int hatgesendet2_ein = 0;
int hatgesendet2_aus = 0;
int hatgesendet3_ein = 0;
int hatgesendet3_aus = 0;
int hatgesendet4_ein = 0;
int hatgesendet4_aus = 0;

void setup() {

  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);

  Serial.begin(9600);
  
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(13);

  // Optional set pulse length.
  // mySwitch.setPulseLength(320);
  
  // Optional set protocol (default is 1, will work for most outlets)
 mySwitch.setProtocol(2);
  
  // Optional set number of transmission repetitions.
  // mySwitch.setRepeatTransmit(15);
  
}

void loop() {

//Steckdose 1
  if ((digitalRead (3) == LOW) && (hatgesendet1_ein == 0))
      {
      mySwitch.send(906042304, 32);
      hatgesendet1_ein = 1;
      hatgesendet1_aus = 0;
      delay (500);
      }
    if ((digitalRead (3) == HIGH) && (hatgesendet1_aus == 0))
    {
      mySwitch.send(1040260032, 32);
      hatgesendet1_aus = 1;
      hatgesendet1_ein = 0;
      delay(500);  
    }

    
//Steckdose 2
  if ((digitalRead (4) == LOW) && (hatgesendet2_ein == 0))
      {
      mySwitch.send(234953664, 32);
      hatgesendet2_ein = 1;
      hatgesendet2_aus = 0;
      delay (500);
      }
    if ((digitalRead (4) == HIGH) && (hatgesendet2_aus == 0))
    {
      mySwitch.send(16849856, 32);
      hatgesendet2_aus = 1;
      hatgesendet2_ein = 0;
      delay(500);  
    }

    
//Steckdose 3
  if ((digitalRead (5) == LOW) && (hatgesendet3_ein == 0))
      {
      mySwitch.send(637606848, 32);
      hatgesendet3_ein = 1;
      hatgesendet3_aus = 0;
      delay (500);
      }
    if ((digitalRead (5) == HIGH) && (hatgesendet3_aus == 0))
    {
      mySwitch.send(771824576, 32);
      hatgesendet3_aus = 1;
      hatgesendet3_ein = 0;
      delay(500); 
    } 

//Steckdose 4
  if ((digitalRead (6) == LOW) && (hatgesendet4_ein == 0))
      {
      mySwitch.send(369171392, 32);
      hatgesendet4_ein = 1;
      hatgesendet4_aus = 0;
      delay (500);
      }
    if ((digitalRead (6) == HIGH) && (hatgesendet4_aus == 0))
    {
      mySwitch.send(503389120, 32);
      hatgesendet4_aus = 1;
      hatgesendet4_ein = 0;
      delay(500);  
    }    
  }

Ich weiß das sich das ganze Code technisch wahrschienlich eleganter lösen ließe aber das ist mir vorerst egal :slight_smile: