Relai/Motorsteuerung

Hallo,
gleich vorab ich bin recht neu beim Programmieren und kenne mich entsprechende noch nicht so gut aus.
Ich möchte eine Steuerung für einen Verstärker Programmieren.
Es sollen 7 Relais und ein Motor gesteuert werden per Fernbedienung.

Die 5 Eingangsrelais anzusteuern funktioniert bereits.
Allerdings müssen 2 der Relais wie ein Taster geschaltet werden, also wenn ich den Knopf einmal auf der Fernbedienung drücke soll es angehen und anbleiben und wenn ich nochmal drücke ausgehen. Allerdings blinken im Testaufbau dann nur die Leds abwechseld von PIN 10 und dem ausgewählten A1-5 Pin.
Auserdem muss ich noch ein Motorpoti ansteuern. Hier soll der Motor drehen wenn ich den Knopf auf der Fernbedienung drücke bis ich in loslasse. Beim testen flackern dann aber auch die LEDs von PIN A1-5 (je nach dem welcher aktiv ist) und das soll ja so nicht sein. Außerdem fährt er immer stufenweiße mit High,Delay,LOW. Schöner währe aber Stufenlos.

#include <IRremote.h>

const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
bool geschaltet = false;      



void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(A4, OUTPUT);
  pinMode(A5, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(A1, HIGH);
}


void loop() {
  if (irrecv.decode(&results)) {

    Serial.println(results.value, HEX);
    irrecv.resume();
  }




  if (results.value == 0x9E6140BF)
  {
    if (geschaltet == false) {        
      geschaltet = true;              
    }
    else {
      geschaltet = false;             
    }
  }

  if (geschaltet == true) {
    delay(100);
    digitalWrite(10, HIGH);
  }

  if (geschaltet == false) {
    delay(100);
    digitalWrite(10, LOW);
  }



  if (results.value == 0XFFFFFFFF)
    results.value = key_value;

  switch (results.value) {
    case 0x5EA19867:
      digitalWrite(A2, LOW);
      digitalWrite(A4, LOW);
      digitalWrite(A5, LOW);
      digitalWrite(A3, LOW);
      delay(150);
      digitalWrite(A1, HIGH);
      break;
    case 0x5EA1837C:
      digitalWrite(A1, LOW);
      digitalWrite(A4, LOW);
      digitalWrite(A5, LOW);
      digitalWrite(A3, LOW);
      delay(150);
      digitalWrite(A2, HIGH);
      break;
    case 0x5EA103FC:
      digitalWrite(A2, LOW);
      digitalWrite(A1, LOW);
      digitalWrite(A4, LOW);
      digitalWrite(A5, LOW);
      delay(150);
      digitalWrite(A3, HIGH);
      break;
    case 0x5EA128D7:
      digitalWrite(A1, LOW);
      digitalWrite(A5, LOW);
      digitalWrite(A3, LOW);
      digitalWrite(A2, LOW);
      delay(150);
      digitalWrite(A4, HIGH);
      break;
    case 0x5EA16897:
      digitalWrite(A2, LOW);
      digitalWrite(A1, LOW);
      digitalWrite(A4, LOW);
      digitalWrite(A3, LOW);
      delay(150);
      digitalWrite(A5, HIGH);
      break;

      key_value = results.value;
      irrecv.resume();
  }
}

Vielleicht kann mir ja jemand helfen
LG

Hallo,
so richtig verstehe ich deine gewünschte Funktion nicht.
Zudem fehlen in deinem Sketch jegliche Kommentare, damit man erkennen kann, was jewels passieren soll. So ist es schwer, sich da reinzulesen.

Und ich kann nicht erkennen, wo die Variable "geschaltet" gesetzt wird.

Warst schneller :wink:
Du findest die Schaltung ab Zeile 35.

Ich find irgendwie die Pins und die Codes nicht vollständig zur Anforderung.

Die einzige reale Zuweisung ist bei der Initialisierung. Ansonsten wird geschaltet in Abhängigkeit von geschaltet gesetzt --> Zirkelschluß.
Ok, ist ein Toggeln

Gruß Tommy

Hatte ich gesehen, war mir aber nicht klar was da passieren soll.
Z.B. wenn man länger auf die FB drückt.

Ja, da ist der Haken.
Er sperrt nicht. (stichwort lastValue)
Ich bin grad am lesen, was da eigentlich passiert. mich verwirrt da noch was anderes.

Genau das ist oft das Problem.
Meist wird der Code zusammengewürfelt und jeglicher Kommentar weggelassen.
Ist dann zu viel Schreibarbeit.

Schau mal, ob der was macht:

#include <IRremote.h>

const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
bool geschaltet = false;

const byte relaisPin[] = {A1, A2, A3, A4, A5};
const byte relaisNum = sizeof(relaisPin) / sizeof(relaisPin[0]);
const byte togglePin = 10;
unsigned long myValue, lastValue;


void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  for (byte b = 0; b < relaisNum; b++)
    pinMode(relaisPin[b], OUTPUT);
  digitalWrite(relaisPin[0], HIGH);
  pinMode(togglePin, OUTPUT);
//  pinMode(4, OUTPUT);
}

void readFB()                          // Holt die gedrückte Taste
{
  if (irrecv.decode(&results))
  {
    myValue = results.value;
    Serial.println(myValue, HEX);
    irrecv.resume();
  }
}
//
void switchPinZehn()                    // Für den TogglePin
{
  if (myValue == lastValue)             // Taste noch immer die selbe?
    return;                             // dann Ende
  if (myValue == 0x9E6140BF)            // Neuer Key passt
  {
    geschaltet = !geschaltet;           // wenn die Variable nirgendwo gebraucht wird, kann die weg
    digitalWrite(togglePin, !digitalRead(togglePin)); // toggelt 
  }
  lastValue = myValue;
}

//
void switchRelais()
{
  if (myValue == lastValue)                   // Taste noch immer die selbe? ...
    return;                                   // ... dann Ende
  for (byte b = 0; b < relaisNum; b++)        // Einmal alle Relais ...
    digitalWrite(relaisPin[relaisNum], LOW);  // ... in Ausgangsstellung
  switch (myValue)                            // Auswahl
  {
    case 0x5EA19867:
      digitalWrite(relaisPin[0], HIGH);
      break;
    case 0x5EA1837C:
      digitalWrite(relaisPin[1], HIGH);
      break;
    case 0x5EA103FC:
      digitalWrite(relaisPin[2], HIGH);
      break;
    case 0x5EA128D7:
      digitalWrite(relaisPin[3], HIGH);
      break;
    case 0x5EA16897:
      digitalWrite(relaisPin[4], HIGH);
      break;
  }
  lastValue = myValue;                          // Merken des letzten Key
}
//
void loop()
{
  readFB();
  switchPinZehn();
  switchRelais();
}

Jetzt mal mit Kommentaren:

#include <IRremote.h>

const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
bool geschaltet = false;      // Schaltzustand speichern



void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(A1, OUTPUT);                //Relai Line 1
  pinMode(A2, OUTPUT);                //Relai Line 2
  pinMode(A3, OUTPUT);                //Relai Line 3       
  pinMode(A4, OUTPUT);                //Relai Line 4
  pinMode(A5, OUTPUT);                //Relai Line 5          
  pinMode(10, OUTPUT);                //Relai Mute 
  pinMode(4, OUTPUT);                 //Relai On/Off
  digitalWrite(A1, HIGH);             //Aktivieren von Line 1 wenn der Verstärker angeschaltet wird
}


void loop() {
  if (irrecv.decode(&results)) {

    Serial.println(results.value, HEX);
    irrecv.resume();
  }




  if (results.value == 0x9E6140BF)      //An und Ausschalten von Mute
  {
    if (geschaltet == false) {        
      geschaltet = true;              
    }
    else {
      geschaltet = false;             
    }
  }

  if (geschaltet == true) {
    delay(100);
    digitalWrite(10, HIGH);
  }

  if (geschaltet == false) {
    delay(100);
    digitalWrite(10, LOW);
  }



  if (results.value == 0XFFFFFFFF)
    results.value = key_value;

  switch (results.value) {
    case 0x5EA19867:              //Umschaltung auf Line 1
      digitalWrite(A2, LOW);
      digitalWrite(A4, LOW);
      digitalWrite(A5, LOW);
      digitalWrite(A3, LOW);
      delay(150);
      digitalWrite(A1, HIGH);
      break;
    case 0x5EA1837C:              //Umschaltung auf Line 2
      digitalWrite(A1, LOW);
      digitalWrite(A4, LOW);
      digitalWrite(A5, LOW);
      digitalWrite(A3, LOW);
      delay(150);
      digitalWrite(A2, HIGH);
      break;
    case 0x5EA103FC:              //Umschaltung auf Line 3
      digitalWrite(A2, LOW);
      digitalWrite(A1, LOW);
      digitalWrite(A4, LOW);
      digitalWrite(A5, LOW);
      delay(150);
      digitalWrite(A3, HIGH);
      break;
    case 0x5EA128D7:              //Umschaltung auf Line 4
      digitalWrite(A1, LOW);
      digitalWrite(A5, LOW);
      digitalWrite(A3, LOW);
      digitalWrite(A2, LOW);
      delay(150);
      digitalWrite(A4, HIGH);
      break;
    case 0x5EA16897:              //Umschaltung auf Line 5
      digitalWrite(A2, LOW);
      digitalWrite(A1, LOW);
      digitalWrite(A4, LOW);
      digitalWrite(A3, LOW);
      delay(150);
      digitalWrite(A5, HIGH);
      break;

      key_value = results.value;
      irrecv.resume();
  }
}

Ich möchte damit die Line Eingänge durschalten, dass funktioniert ja auch. Es werden also z.b Bei Umschaltung auf Line 2, Line 1,3,4,5 ausgeschaltet kurz gewartet und dann Line 2 angeschaltet.
Jetzt möchte ich aber den Mute bzw. Power Button auf der Fernbedienung auch nutzen. Wenn ich also auf Mute drücke soll er das Relai anschalten und wenn ich nochmal draufdrücke ausschalten. Der Codeblock dafür hat auch schon mal bei einem anderen Projekt so funktioniert aber jetzt eben nicht mehr.
Drücke ich auf Mute fängt er an abwechselnd Mute und z.B Line 2 An- und Abzuschalten und ich weiß nicht warum. Eigentlich sollt er den Schaltzustand von Line 2 unverändert lassen und nur Mute anschalten bzw bei erneutem Knopfdruck wieder ausschalten.

Zusätzlich möchte ich ein Motorpoti ansteuern über einen L293D
Bei dem alten Projekt war es so gelöst:

if (results.value == 0XFFFFFFFF)
      results.value = key_value;

    switch (results.value) {
      case 0x5EA158A7:
        digitalWrite(9, HIGH);
        delay(180); 
        digitalWrite(9, LOW);
        break;
      case 0x5EA1D827:
        digitalWrite(7, HIGH);
        delay(180);
        digitalWrite(7, LOW);
        break;
    }




    key_value = results.value;
    irrecv.resume();         

Dabei hat das Poti immer Stufen weiße gefahren und eben nicht immer nur so lange wie der Button gedrückt war auf der Fernbedienung. Ich möchte es eben eigentlich Stufenlos genau so lang wie man den Knopf drückt.

Zwischenfrage wo kommt das 0xFFFFFFFF her?
Ist das, wenn keine Taste gedrückt wird?

Nein die FB sendet nur beim ersten mal den HEX-Code und danach einen Repeatcode wenn man die Taste gedrückt hält, das ist dann FFFFFF. Der Repeatcode ist auch bei jeder Taste gleich.

Ok, dann war ich doch schon richtig.

Ich verzichte auf den repaetcode - aber dann muss meine Auswahl anders sein. Ich schau mal.

Andere Bemerkung:
Wenn Du Audiosignale über Relais schaltest gibt es jedesmal einen unschönen Knaks.
Grüße Uwe

Ich hab mal was gebaut.

Er ist kommentiert.

#include <IRremote.h>

const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
bool geschaltet = false;

const byte relaisPin[] = {A1, A2, A3, A4, A5};
const byte relaisNum = sizeof(relaisPin) / sizeof(relaisPin[0]);
const byte togglePin = 10;
const byte motorPin[] = {7, 9};
unsigned long myValue, lastValue;


void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  for (byte b = 0; b < relaisNum; b++)
    pinMode(relaisPin[b], OUTPUT);
  digitalWrite(relaisPin[0], HIGH);
  pinMode(togglePin, OUTPUT);
  pinMode(motorPin[0], OUTPUT);
  pinMode(motorPin[1], OUTPUT);
  //  pinMode(4, OUTPUT);
}

void readFB()                          // Holt die gedrückte Taste
{
  if (irrecv.decode(&results))
  {
    if (results.value != 0xFFFFFFFF);  // kein repaetCode? ...
    {
      myValue = results.value;          // ... dann merken ...
      Serial.println(myValue, HEX);    // .... und ausgeben
    }
    irrecv.resume();
  }
}
//
void switchPinZehn()                    // Für den TogglePin
{
  if (myValue == lastValue)             // Taste noch immer die selbe?
    return;                             // dann Ende
  if (myValue == 0x9E6140BF)            // Neuer Key passt
  {
    geschaltet = !geschaltet;           // wenn die Variable nirgendwo gebraucht wird, kann die weg
    digitalWrite(togglePin, !digitalRead(togglePin)); // toggelt Pin 10
  }
  lastValue = myValue;
}

//
void switchRelais()
{
  if (myValue == lastValue)                   // Taste noch immer die selbe? ...
    return;                                   // ... dann Ende
  for (byte b = 0; b < relaisNum; b++)        // Einmal alle Relais ...
    digitalWrite(relaisPin[relaisNum], LOW);  // ... in Ausgangsstellung
  switch (myValue)                            // Auswahl
  {
    case 0x5EA19867:
      digitalWrite(relaisPin[0], HIGH);
      break;
    case 0x5EA1837C:
      digitalWrite(relaisPin[1], HIGH);
      break;
    case 0x5EA103FC:
      digitalWrite(relaisPin[2], HIGH);
      break;
    case 0x5EA128D7:
      digitalWrite(relaisPin[3], HIGH);
      break;
    case 0x5EA16897:
      digitalWrite(relaisPin[4], HIGH);
      break;
  }
  lastValue = myValue;                          // Merken des letzten Key
}
//
void motorPoti()                                // Lautstärke
{
  switch (myValue)                              // Auswahl
  {
    case 0x5EA158A7:                            // wenn Richtung A
      digitalWrite(motorPin[0], HIGH);          // Pin setzen
      break;
    case 0x5EA1D827:                            // wenn Richtung B
      digitalWrite(motorPin[1], HIGH);          // andere Richtung setzen
      break;
    default:                                    // Wenn keine Richtung
      digitalWrite(motorPin[0], LOW);           // Alles aus
      digitalWrite(motorPin[1], LOW);
      break;
  }
  lastValue = myValue;                          // Tastendruck merken
}
//
void loop()
{
  readFB();
  switchPinZehn();
  switchRelais();
  motorPoti();
}

So habs gleich mal ausprobiert, Line 1 ist standartmäßig an, dass passt.
Jetzt ist es aber so das wenn ich Pin 10 anschalte Line 1 ausgeht. Auch geht die Umschaltung von Line 1 bis 5 noch nicht, da macht er einfach garnichst und bleibt auf Line 1
Die Motorsteuerung ist auch noch komisch, wenn ich ganz Kurz die Taste betätige schaltet er Ein, aber nicht mehr aus und wenn ich die Taste gedrückt halte so wie angedacht blinkt er nur kurz auf.

mein Logikfehler.
Das mit dem Motorpoti setzen ist natürlich tricky, da je kein neuer Code zum ausschalten kommt.
Ich hab das mal umgebaut und prüfe gleichzeitig auf repeat.
Wenn repeat kommt, passiert erstmal nichts.
Im motorPoti prüfe ich, ob repeat aktiv ist und myValue ==0.
Wenn das erfüllt ist, wird myValue == lastValue.

Also erster Umlauf:
motorpoti wird gesetzt, dann lastValue mit myValue belegt und myValue gelöscht
Nächster Umlauf:
da ist repeat gesetzt, damit bekommt myValue wieder lastValue und repeat wird gelöscht. am Ende dann myValue wieder auf 0 gesetzt
Dritter Umlauf:
Es war keine Taste gedrückt, dann wird auch repeat nicht wahr und in motorPoti werden die Pins gelsöcht.

Sollte das nicht so funktionieren, könnte es sein, das der Umlauf schneller ist, als die FB sendet.
Dann am Ende von loop() einfach zu testzwecken ein delay() einfügen. Vielleicht mit 150 anfangen und wenn es geht, in 10er/5er Schritten soweit runter, bis es noch stabil läuft. Dann schaun wa mal.

#include <IRremote.h>

const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
bool geschaltet = false;

unsigned long myValue, lastValue;
const byte relaisPin[] = {A1, A2, A3, A4, A5};
const byte relaisNum = sizeof(relaisPin) / sizeof(relaisPin[0]);
const byte togglePin = 10;
const byte motorPin[] = {7, 9};
bool isRepeat = false;


void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  for (byte b = 0; b < relaisNum; b++)
    pinMode(relaisPin[b], OUTPUT);
  digitalWrite(relaisPin[0], HIGH);
  pinMode(togglePin, OUTPUT);
  pinMode(motorPin[0], OUTPUT);
  pinMode(motorPin[1], OUTPUT);
  //  pinMode(4, OUTPUT);
}

void readFB()                          // Holt die gedrückte Taste
{
  if (irrecv.decode(&results))
  {
    if (results.value != 0xFFFFFFFF)   // kein repeatCode? ...
    {
      myValue = results.value;         // ... dann merken ...
      Serial.println(myValue, HEX);    // .... und ausgeben
    }
    else isRepeat = true;              // wenn repeat dann setzen
    irrecv.resume();
  }
}
//
void switchPinZehn()                    // Für den TogglePin
{
  if (myValue == lastValue)             // Taste noch immer die selbe?
    return;                             // dann Ende
  if (myValue == 0x9E6140BF)            // Neuer Key passt
  {
    geschaltet = !geschaltet;           // wenn die Variable nirgendwo gebraucht wird, kann die weg
    digitalWrite(togglePin, !digitalRead(togglePin)); // toggelt Pin 10
  }
  lastValue = myValue;
}

//
void relaisAus()
{
  for (byte b = 0; b < relaisNum; b++)        // Einmal alle Relais ...
    digitalWrite(relaisPin[relaisNum], LOW);  // ... in Ausgangsstellung
}
void switchRelais()
{
  if (myValue == lastValue)
    return;
  switch (myValue)                            // Auswahl
  {
    case 0x5EA19867:
      relaisAus();
      digitalWrite(relaisPin[0], HIGH);
      break;
    case 0x5EA1837C:
      relaisAus();
      digitalWrite(relaisPin[1], HIGH);
      break;
    case 0x5EA103FC:
      relaisAus();
      digitalWrite(relaisPin[2], HIGH);
      break;
    case 0x5EA128D7:
      relaisAus();
      digitalWrite(relaisPin[3], HIGH);
      break;
    case 0x5EA16897:
      relaisAus();
      digitalWrite(relaisPin[4], HIGH);
      break;
  }
  lastValue = myValue;
}
//
void motorPoti()                                // Lautstärke
{
  if (myValue == 0 && isRepeat)                 // value gelöscht und repeat ausgelöst?...
  {
    myValue = lastValue;                        // .. dann value setzen
    isRepeat = false;                           // Wert löschen
  }
  switch (myValue)                              // Auswahl
  {
    case 0x5EA158A7:                            // wenn Richtung A
      digitalWrite(motorPin[0], HIGH);          // Pin setzen
      break;
    case 0x5EA1D827:                            // wenn Richtung B
      digitalWrite(motorPin[1], HIGH);          // andere Richtung setzen
      break;
    default:
      digitalWrite(motorPin[0], LOW);           // Pin löschen
      digitalWrite(motorPin[1], LOW);
      break;
  }
  lastValue = myValue;                          // merken
  myValue = 0;                                  // löschen
}
//
void loop()
{
  readFB();
  switchPinZehn();
  switchRelais();
  motorPoti();
}

Mit einem Delay von 60 funktioniert es, allerdings schaltet er die Ausgänge wieder nur kurz an und dann wieder aus, auch wenn ich auf der Taste bleibe.

Dann jetzt ohne delay.
Ich prüfe ob die Zeit abgelaufen ist und lösche die Variable repeat.
Für die Fünf Relais hab ich eine Serielle Ausgabe drin.
Schau mal auf dem SerMon, was passiert, wenn Du Tasten drückst.

#include <IRremote.h>

const int RECV_PIN = 12;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
bool geschaltet = false;

unsigned long myValue, lastValue;
const byte relaisPin[] = {A1, A2, A3, A4, A5};
const byte relaisNum = sizeof(relaisPin) / sizeof(relaisPin[0]);
const byte togglePin = 10;
const byte motorPin[] = {7, 9};
bool isRepeat = false;


void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  for (byte b = 0; b < relaisNum; b++)
    pinMode(relaisPin[b], OUTPUT);
  digitalWrite(relaisPin[0], HIGH);
  pinMode(togglePin, OUTPUT);
  pinMode(motorPin[0], OUTPUT);
  pinMode(motorPin[1], OUTPUT);
  //  pinMode(4, OUTPUT);
}

void readFB()                          // Holt die gedrückte Taste
{
  static unsigned long lastReceiveTime = 0;   // lokaler Zeitmerker
  const unsigned long sendeWiederholung = 70; // Zeit in ms für neuen FB Code
  if (irrecv.decode(&results))
  {
    lastReceiveTime = millis();
    if (results.value != 0xFFFFFFFF)   // kein repeatCode? ...
    {
      myValue = results.value;         // ... dann merken ...
      Serial.println(myValue, HEX);    // .... und ausgeben
    }
    else isRepeat = true;              // wenn repeat dann setzen
    irrecv.resume();
  }
  else
  {
    if (millis() - lastReceiveTime > sendeWiederholung) // kein neuer IRCode?
      isRepeat = false;
  }
}
//
void switchPinZehn()                    // Für den TogglePin
{
  if (myValue == lastValue)             // Taste noch immer die selbe?
    return;                             // dann Ende
  if (myValue == 0x9E6140BF)            // Neuer Key passt
  {
    geschaltet = !geschaltet;           // wenn die Variable nirgendwo gebraucht wird, kann die weg
    digitalWrite(togglePin, !digitalRead(togglePin)); // toggelt Pin 10
  }
  lastValue = myValue;
}

//
void relaisAus()
{
  Serial.println(F("Relais Aus!"));
  for (byte b = 0; b < relaisNum; b++)        // Einmal alle Relais ...
    digitalWrite(relaisPin[relaisNum], LOW);  // ... in Ausgangsstellung
}
void switchRelais()
{
  if (myValue == lastValue)
    return;
  else
  {
    switch (myValue)                            // Auswahl
    {
      case 0x5EA19867:
        relaisAus();
        digitalWrite(relaisPin[0], HIGH);
        Serial.println(F("Relais 1"));
        break;
      case 0x5EA1837C:
        relaisAus();
        digitalWrite(relaisPin[1], HIGH);
        Serial.println(F("Relais 2"));
        break;
      case 0x5EA103FC:
        relaisAus();
        digitalWrite(relaisPin[2], HIGH);
        Serial.println(F("Relais 3"));
        break;
      case 0x5EA128D7:
        relaisAus();
        digitalWrite(relaisPin[3], HIGH);
        Serial.println(F("Relais 4"));
        break;
      case 0x5EA16897:
        relaisAus();
        digitalWrite(relaisPin[4], HIGH);
        Serial.println(F("Relais 5"));
        break;
    }
  }
  lastValue = myValue;
}
//
void motorPoti()                                // Lautstärke
{
  if (myValue == 0 && isRepeat)                 // value gelöscht und repeat ausgelöst?...
  {
    myValue = lastValue;                        // .. dann value setzen
  }
  switch (myValue)                              // Auswahl
  {
    case 0x5EA158A7:                            // wenn Richtung A
      digitalWrite(motorPin[0], HIGH);          // Pin setzen
      break;
    case 0x5EA1D827:                            // wenn Richtung B
      digitalWrite(motorPin[1], HIGH);          // andere Richtung setzen
      break;
    default:
      digitalWrite(motorPin[0], LOW);           // Pin löschen
      digitalWrite(motorPin[1], LOW);
      break;
  }
  lastValue = myValue;                          // merken
  myValue = 0;                                  // löschen
}
//
void loop()
{
  readFB();
  switchPinZehn();
  switchRelais();
  motorPoti();
}

Das kommt im SerMon wen ich versuche die Relais zu schalten.
"The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData. .
5EA19867
5EA1837C
5EA103FC
5EA16897
5EA128D7"

Beim Motor passiert jetzt garnichts mehr

Ach... stimmt.
Na dann baue mal Deinen Code um auf decode(); Ich hab das nicht und der Versuch war nur trocken....