In diesem kleinen Projekt möchte ich dir zeigen wie du eine 2fach Relaiskarte mit 2 Reedkontakten schalten kannst.
Eine 2fach Relaiskarte habe ich bereits in Arduino Lektion 13: 2 fach Relaisplatine ansteuern vorgestellt und ein Reedkontaktmodul in Arduino Lektion 90: Reed Kontakt Sensor Modul vorgestellt.
Benötigte Bauteile
- 1x Arduino UNO, (inkl. USB Kabel)
- 1x 400 Pin Breadboard,
- 4x Breadboardkabel, 20cm, männlich – weiblich,
- 2x Breadboardkabel, 20cm, männlich – männlich,
- 6x Breadboardkabel, 10cm, männlich – männlich
Aufbau & Schaltung
Das 2fach Relais Modul wird wie folgt angeschlossen.
2fach Relais Modul | Arduino UNO |
---|---|
GND | GND |
In1 | digitaler Pin D9 |
In2 | digitaler Pin D8 |
VCC | 5V |
Die Reedkontakte agieren wie einfache Taster welche mit einem Magneten aktiviert / deaktiviert werden anstatt mit der Hand. In meiner Schaltung verwende ich einen 10k Ohm Pull Down Widerstand.
In der Zeichnung habe ich ein 4fach Relais Modul verwendet. Leider konnte ich kein 2fach Relais Modul finden, so das ich darauf zurück greifen musste. Es wurden auch nur 2 Relais angeschlossen!
Programmieren
Ausbaustufe 1
Der Sketch / das Programm zum betreiben ist relativ übersichtlich, jedoch wollen wir dieses dynamisch halten so das man ggf. mehr als 2 Reedkontakte & somit mehr Relais schalten kann.
Ich nutze dazu ein Mehrdimensionales Array:
//Anzahl der Schaltungen in der Liste const int ANZAHL_SCHALTUNGEN = 2; //Liste mit den Schaltungen, //erster Wert ist der Reedkontakt, //zweiter Wert ist das Relais welches gesteuert werden soll int schaltungen[ANZAHL_SCHALTUNGEN][2] = {{REED_1,RELAIS_1}, {REED_2, RELAIS_2}};
Der erste Wert ist der Pin des Reedkontaktes und der zweite Wert der Pin des Relais.
In der Setup Funktion durchlaufe ich das Array um die jeweiligen Pins als Eingang bzw. als Ausgang zu definieren.
void setup() { for(int i=0;i<ANZAHL_SCHALTUNGEN;i++){ //Der Reedkontakt dient als Eingangssignal pinMode(schaltungen[i][0], INPUT); //Das Relais soll als Ausgangssignal dienen pinMode(schaltungen[i][1], OUTPUT); } }
Die Loop Funktion des Sketches sieht nun so ähnlich aus denn nun prüfen wir jeweils ob der Status des Reedkontaktes HIGH also aktiviert ist und diesen Wert weisen wir dem Relais zu. Das ganze lässt sich auch in nur einer Zeile verpacken somit ist der Code sehr übersichtlich.
void loop() { for(int i=0;i<ANZAHL_SCHALTUNGEN;i++){ digitalWrite(schaltungen[i][1], digitalRead(schaltungen[i][0])); } }
Quellcode
//Reedkontakte const int REED_1 = 6; const int REED_2 = 7; //Relais const int RELAIS_1 = 8; const int RELAIS_2 = 9; //Anzahl der Schaltungen in der Liste const int ANZAHL_SCHALTUNGEN = 2; //Liste mit den Schaltungen, //erster Wert ist der Reedkontakt, //zweiter Wert ist das Relais welches gesteuert werden soll int schaltungen[ANZAHL_SCHALTUNGEN][2] = {{REED_1,RELAIS_1}, {REED_2, RELAIS_2}}; void setup() { for(int i=0;i<ANZAHL_SCHALTUNGEN;i++){ //Der Reedkontakt dient als Eingangssignal pinMode(schaltungen[i][0], INPUT); //Das Relais soll als Ausgangssignal dienen pinMode(schaltungen[i][1], OUTPUT); } } void loop() { for(int i=0;i<ANZAHL_SCHALTUNGEN;i++){ digitalWrite(schaltungen[i][1], digitalRead(schaltungen[i][0])); } }
Video
Ausbaustufe 2
In der zweiten Ausbaustufe wollen wir nun den Code so ändern das wir mit dem Magneten den Reedkontakt aktivieren und wenn dieser wieder deaktiviert wird soll das Relais für eine Zeit x angezogen sein und wieder deaktiviert werden.
Dazu müssen wir unser Mehrdimensionales Array um einen weiteren Wert für das speichern des Status des Reedkontaktes erweitern.
//Reedkontakte const int REED_1 = 6; const int REED_2 = 7; //Relais const int RELAIS_1 = 8; const int RELAIS_2 = 9; //Anzahl der Schaltungen in der Liste const int ANZAHL_SCHALTUNGEN = 2; //Liste mit den Schaltungen, //erster Wert ist der Reedkontakt, //zweiter Wert ist das Relais welches gesteuert werden soll, //dritter Wert ist der Status des Reedkontaktes, int schaltungen[ANZAHL_SCHALTUNGEN][3] = {{REED_1,RELAIS_1, 0}, {REED_2, RELAIS_2, 0}}; const int PAUSE = 1000; void setup() { Serial.begin(9600); for(int i=0;i<ANZAHL_SCHALTUNGEN;i++){ //Der Reedkontakt dient als Eingangssignal pinMode(schaltungen[i][0], INPUT); //Das Relais soll als Ausgangssignal dienen pinMode(schaltungen[i][1], OUTPUT); } } void loop() { //Für jeden Wert in dem Mehrdimensionalem Array mache... for(int i=0;i<ANZAHL_SCHALTUNGEN;i++){ //lesen des neuen Status des Reedkontaktes int reedStatusNeu = digitalRead(schaltungen[i][0]); //lesen des alten Status des Reedkontaktes int reedStatusAlt = schaltungen[i][2]; //Wenn der Reedkontakt nicht mehr aktiviert ist, //jedoch der letzte Status aktiviert war, dann... if(reedStatusNeu == 0 && reedStatusAlt == 1){ //aktiviere Relais digitalWrite(schaltungen[i][1], HIGH); delay(PAUSE); //eine kleine Pause von 1 Sek. //deaktiviere Relais digitalWrite(schaltungen[i][1], LOW); //Status zurücksetzen schaltungen[i][2] = 0; //Wenn der neue Status des Reedkontaktes aktiviert ist, und //der alte Status deaktiviert war dann... } else if(reedStatusNeu == 1 && reedStatusAlt == 0){ //speichern des Status schaltungen[i][2] = 1; delay(PAUSE); //eine kleine Pause von 1 Sek. } } }
Hallo,
sehr schön erklärt vielen Dank dafür. Ich habe eine frage ist mit diesem Sketch auch möglich mit einem Reedkontakt mehrere Relais zu schalten? Ich benötige das für meine Modellbahn und möchte damit mehreren Kontakten jeweils mehrere Relais ansteuern. Über eine positive Antwort sowie Hilfe wie der Sketch verändert werden müsste würde ich mich sehr freuen.
Mfg
Johann
Hi,
du kannst natürlich auch mit jeweils einem Reedkontakt auch mehrere Relaisschalten. Dazu musst du lediglich die Relais je nach Status des Reedkontaktes aktivieren oder deaktivieren (Signal HIGH oder LOW).
Die Grenzen sind dir hier nur durch die vorhandenen Pins am Microcontroller gesetzt.
Gruß,
Stefan Draeger
vielen Dank
Super erklärt und für die Schaltung finde ich Super.
Vielleicht können Sie mir bei der Schaltung Ausbau 2 weiter helfen, so dass nur ein Relais nach den deaktivieren des Reedkontakt noch 5s an bleibt und der andere Kontakt so reagiert wie bei Ausbau 1
Vielen Dank
Kai Wikert
Hallo Herr Wikert,
die Schaltung ist sehr identisch ABER der Code wird deutlich anders aufgebaut werden müssen denn man kann die 5 Sekunden nicht mehr mit der Funktion “delay” lösen.
Hier muss mit millis geprüft werden ob die Zeit abgelaufen ist (generell eine bessere Lösung).
Da meine Reedkontakte z.Zt. nicht auffindbar sind nehme ich einfach mal 2 kapazitive Touch Sensoren.
Der Aufbau ist dann halt nicht mit einem Pull Up oder Pull Down Widerstand aber ich denke es wird dir vielmehr auf den Code ankommen.
Gruß,
Stefan Draeger
Hallo Herr Draeger,
wirklich sehr gut erklärt. Ich besitze mehrere 8-Fach Relaisplatinen und würde die gerne für meinen Schattenbahnhof einsetzen. Arduinos habe ich auch mehrere. Lässt sich das mit Arduino realisieren? Ein Zug fährt auf ein leeres Gleis, das Relais schaltet den Fahrstrom ab. Auf dem zweiten Gleis fährt ein Zug ein, das Relais schaltet den Fahrstrom ab und auf dem ersten Gleis wieder ein. Vielen Dank für eine Antwort.
Gruß
Ralph Gast
Hallo Ralph,
ich denke die Schaltung hierzu ist recht einfach denn du musst wenn ich dich richtig verstehe “nur” die Relais abwechselnd schalten.
Wie möchtest du erkennen das der Zug auf Gleis X eingefahren ist?
Gruß,
Stefan Draeger
Hallo Stefan,
im Prinzip sind es zwei Schaltungen. Die eine schaltet über Reedkontakte die Servos der Weichen. Der zweite Reedkontakt dann den Arduino uns somit die Relais. Hab dazu eine kleine Schaltung entworfen mit Attinys.
Gruß
Ralph
Hallo Stefan,
lässt sich das überhaupt mit einem Arduino realisieren eine 8-fach Relaiskarte mit Reedkontakten zu steuern. Für jedes Relais ein Reedkontakt?
Danke für eine Antwort
Gruß Ralph
Hi,
ein Arduino Mega sollte das können, du brauchst für die 8fach Relaiskarte 8 digitale Pins und für die zusätzlichen Reedkontakte auch welche.
Der Arduino UNO R3 verfügt lediglich über 14 digitale Pins.
Gruß,
Stefan Draeger