8 kanal relais

Hallo Leute
Ich bin gerade mit einem kleinen Arduinoprojekt beschäftigt.
Ich möchte mit meinem Arduino und einer damit verbundenen 8-Kanal Relaiskarte Verbraucher schalten können.
Die Schaltbefehle erhält das Board von einer beliebigen Funkfernbedienung. Das passende Programm dazu habe ich bereits "fast" fertig. Ein IR-Sensor erfasst das einkommende Signal, es wird ausgewertet und der Hex-Code wird im Hauptprogramm als Schaltbefehl verwendet. Mein PROBLEM IST die Beschaltung der Relaiskarte.

Ich habe eine 8-Kanal Relaiskarte,welche mit LOW Signalen arbeitet. Ich möchte jedoch die High Signale der Ausgänge nutzen.
Wie kann ich das realisieren? Als Ansatzhilfe habe ich meinen aktuellen Programmcode gepostet.

Gruß bonsai

#include "IRremote.h"
//translation for used pins
const int Infrarot = 11;    
const int channelI = 2;
const int channelII = 3;
const int channelIII = 4;
const int channelIIII= 5;
const int channelV= 6;
const int channelVI= 7;
const int channelVII= 8;
const int channelVIII= 9;

IRrecv irrecv(Infrarot);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'

void setup() 
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
 
 // telling arduino how to use the pins
  pinMode(channelI, OUTPUT);
  pinMode(channelII, OUTPUT);
  pinMode(channelIII, OUTPUT);
  pinMode(channelIIII, OUTPUT);
  pinMode(channelV, OUTPUT);
  pinMode(channelVI, OUTPUT);
  pinMode(channelVII, OUTPUT);
  pinMode(channelVIII, OUTPUT);
  
}

void loop()   
{
  
  if (irrecv.decode(&results)) 
  {
    translateIR(); 
    irrecv.resume(); 
  }  
}

void translateIR()
{
  switch(results.value)
  {
  case 0x8C73E11E:  
    Serial.println("red");                  //swicht channel I
    digitalWrite (2, ! digitalRead (2)) ;
    break;
    
  case 0xE0E028D7:  
    Serial.println("green");                //swicht channel II
    digitalWrite (3, ! digitalRead (3)) ;
    break;

  case 0xE0E0A857:  
    Serial.println("yellow");              //swicht channel III
    digitalWrite (4, ! digitalRead (4)) ;
    break;

  case 0xE0E06897:  
    Serial.println("blue");                //swicht channel IV
    digitalWrite (5, ! digitalRead (5)) ;
    break;

  case 0x8C73817E:  
    Serial.println("switch all");          //swicht chanel V //switch channel  
    digitalWrite (6, ! digitalRead (6)) ;
    digitalWrite (5, LOW) ;
    digitalWrite (4, LOW) ; 
    digitalWrite (3, LOW) ;
    digitalWrite (2, LOW) ;
    break;

  default: 
    Serial.println("other button");
    Serial.print(results.value, HEX);
    break;
  }
  delay(500);
}

So und nicht anders :smiley:
http://forum.arduino.cc/index.php/topic,148850.0.html

ich habe meinen Post bearbeitet und ergänzt. Google konnte mir leider noch keine passende Lösung liefern.

Versuchs mal hiermit: && - Arduino Reference
! (not) invertiert den Operator und wenn der Byte ist, dann das Byte.
Andere bequeme Lösung ist, das Signal bei Verstärken für die Relais gleich mit zu invertieren. Z.B. wenn du als Relaistreiber vorhast einen ULN2803 zu nehmen, dann nimm halt den ULN2804 und du hast bei gleicher Verdrahtung in Hardware invertiert 8)

Gruß Gerald

naja an einen relaistreiber hatte ich nicht gedacht. bzw ich denke nicht,dass ich diesen benötige.
Sinn der Sache soll es sein,dass ich möglichst nur mit dem arduinoboard und der reelaiskarte auskomme.
und ganz wichtig ist,dass die Relais beim "booten" nicht schalten/zucken, und meine Lasten nicht geschaltet sind

Jetzt verstehe ich Dein Problem nicht.
Damit ein Relais einschaltet mußt Du den entsprechenden Ausgang LOW schalten.
Statt
digitalWrite(Pin, HIGH); // Relais einschalten
schreibst Du
digitalWrite(Pin, LOW); // Relais einschalten

Wenn due die Relais unbedingt mit
digitalWrite(Pin, HIGH); // Relais einschalten
Einschalten willst dann brauchst Du eine andere

Grüße Uwe

void setup() 
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
 
 // telling arduino how to use the pins
  pinMode(channelI, OUTPUT);
    digitalWrite(channelI, HIGH);
  pinMode(channelII, OUTPUT);
     digitalWrite(channelII, HIGH); 

usw.
}

Sollte schon reichen, damit nichts mehr zuckt. Zumindest mein Relais schaltet erst beim pinmode-Befehl. Also muss es sofort ausgeschaltet werden.

uwefed:
Jetzt verstehe ich Dein Problem nicht.
Damit ein Relais einschaltet mußt Du den entsprechenden Ausgang LOW schalten.
Statt
digitalWrite(Pin, HIGH); // Relais einschalten
schreibst Du
digitalWrite(Pin, LOW); // Relais einschalten

Wenn due die Relais unbedingt mit
digitalWrite(Pin, HIGH); // Relais einschalten
Einschalten willst dann brauchst Du eine andere

Grüße Uwe

ich hab glaub ich an der stelle nur ein denkfehler/verständnisfehler.
was macht denn die Relaiskarte,wenn sie kein Inputsignal hat? Dann schaltet sie doch oder?
z.b. auch im Fall eines Kabelbruches oder?
High bedeutet doch +5V
Low bedeutet doch +/-0 V

ich werde die Relaiskarte mit einer externen spannungsquelle versorgen,da der Gesamtstrom für das Board zu gro´ß ist,wenn ich alle Relais geschaltet habe.(ca 8x20mA). Passiert mir da nicht das, dass die Karte ein eigenleben entwickelt,wenn das Board spannungslos ist?

Wenn du das Relaisboard mit einer eigenen Spannungsversorgung versorgst, ist das schon gut. Denke daran, dass zwischen Arduino und Relaiskarte zusätzlich einmal Masse miteinander verbunden werden muss.

Was Uwe schrieb ist soweit richtig. Die Relais brauchen ein 0V Signal zum einschalten. Muss man nur wissen. Die Relais haben einen Wechselkontakt, somit sollte das kein Problem sein. Nur halt daran denken, dass die Relaisansteuerung invertiert ist. Was du dann mit den Wechselkontakten wieder richten kannst.

bonsai878:
ich hab glaub ich an der stelle nur ein denkfehler/verständnisfehler.
was macht denn die Relaiskarte,wenn sie kein Inputsignal hat? Dann schaltet sie doch oder?
z.b. auch im Fall eines Kabelbruches oder?
High bedeutet doch +5V
Low bedeutet doch +/-0 V

Hast du schon ausprobiert, was ich geschrieben habe?

Es gibt noch den Zustand offener Eingang, wo die Relaiskarte nicht schaltet. Erst mit pinMode(Kanal, Output) wird der offene Eingang auf Masse gezogen. Dann muss sofort der Eingang auf High gesetzt werden. Du kannst sogar die Pins auf High setzen und dann zum Ausgang definieren.

void setup() 
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
 
 // telling arduino how to use the pins
    digitalWrite(channelI, HIGH);
  pinMode(channelI, OUTPUT);
     digitalWrite(channelII, HIGH); 
  pinMode(channelII, OUTPUT);

usw.
}

bonsai878:
ich hab glaub ich an der stelle nur ein denkfehler/verständnisfehler.
was macht denn die Relaiskarte,wenn sie kein Inputsignal hat? Dann schaltet sie doch oder?
z.b. auch im Fall eines Kabelbruches oder?

Das hängt von der Relaiskarte ab, wie die intern verschalten ist.
Am besten du probierst das aus: Wenn du an die Relaiskarte Versorgungsspannung anlegst, und die INPUT-Pins offen sind, klacken dann die Relais?

Falls ja, könnte eventuell ein Pulldown am Eingang helfen.
Hast du einen Schaltplan deiner Karte?

Das ist der Fluch vom China-Fertigkram. Schlechte, bis keine Dokumentation. Sieht erst mal einfach aus und man hat keine Arbeit damit, aber wenn man was ändern will, hast du doppelte bis 3 fache Arbeit, weil du deren Layout reverse engineeren mußt, um zu wissen, was Sache ist ]:slight_smile:

so und nun eine lösung ?

hallo,

habe genau diese Funktion auch benötigt.

und am Anfang einfach EIN / bzw. AUS zu definieren ist eine Hammer geniale Idee, dadurch wird eine Menge unnützes Denken über welchen Befehl brauche ich um xy Ein-/Auszuschalten gespart :wink:
habe es soeben getetstet, funktioniert Einwandfrei!
Vielen Danke jurs un dem Themen Ersteller .

Gruß
Dennis