Arduino Projekt: Relaiskarte mit Reedkontakten steuern

In diesem kleinen Projekt möchte ich dir zeigen wie du eine 2fach Relaiskarte mit 2 Reedkontakten schalten kannst.

Aufbau der Schaltung: Reedkontakt und 2fach Relaismodul am Arduino UNO
Aufbau der Schaltung: Reedkontakt und 2fach Relaismodul am Arduino UNO

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 ModulArduino UNO
GNDGND
In1digitaler Pin D9
In2digitaler Pin D8
VCC5V 

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.

Reedkontakte mit 4fach Relais Modul am Arduino UNO
Reedkontakte mit 4fach Relais Modul am Arduino UNO

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.
    }    
  }
}

Video

 

9 Kommentare

  1. 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

    1. 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

  2. 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

    1. 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

  3. 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

    1. 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

  4. 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

  5. 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

    1. 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

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.