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

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

 

Schreibe einen Kommentar

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