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);
}
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)
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
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 ]
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
habe es soeben getetstet, funktioniert Einwandfrei!
Vielen Danke jurs un dem Themen Ersteller .