Relais mit einem Taster steuern

Hallo Zusammen,

folgendes möchte ich gerne umsetzen.
Insgesamt sollen 4 Relais mit je einem Taster ein und ausgeschaltet werden, also jedes Relais bekommt einen eigenen Taster.
Verwendet wird ein Relaisboard wo an die Pins der Relais Ground gelegt wird damit sie schalten.
Das ganze funktioniert soweit ganz gut, aber:
Ich möchte das alle Relais aus sind wenn der Arduino gestartet hat, und erst das drücken der Taste
ein Relais einschaltet
Folgenden Sketch benutze ich dafür, er ist aus einem Beispiel hier im Forum abgeleitet.

#define taster1 2
#define taster2 3
#define taster3 4
#define taster4 5

#define led1 10
#define led2 11
#define led3 12
#define led4 13


#define  Entprellzeit 15 //Entprellzeit für den Taster in ms
  bool led_state1, taster1_state, taster1_state_alt;// Variablendeklaration (global)
  bool led_state2, taster2_state, taster2_state_alt;// Variablendeklaration (global)
  bool led_state3, taster3_state, taster3_state_alt;// Variablendeklaration (global)
  bool led_state4, taster4_state, taster4_state_alt;// Variablendeklaration (global)  
static uint32_t Entprell_zeit;
void setup() {
   
  pinMode(taster1, INPUT_PULLUP);
  pinMode(taster2, INPUT_PULLUP);
  pinMode(taster3, INPUT_PULLUP);
  pinMode(taster4, INPUT_PULLUP);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);  
 
 }

void loop() {  
 
 if (millis()-Entprell_zeit>Entprellzeit){
  taster1_state = digitalRead(taster1); //einlesen des Tasters
 }
   
 if (taster1_state != taster1_state_alt) // bei Pegelwechsel
    {
     Entprell_zeit=millis();
     
    
     if(!taster1_state)//wenn Taster gedrückt
       {

        led_state1 = !led_state1;//Ausgang wechseln
        digitalWrite(led1,led_state1);}
        taster1_state_alt = taster1_state; // state aktualisieren
        }
        

if (millis()-Entprell_zeit>Entprellzeit){
  taster2_state = digitalRead(taster2); //einlesen des Tasters 2
 }
   
 if (taster2_state != taster2_state_alt) // bei Pegelwechsel
    {
     Entprell_zeit=millis();
     
     if(!taster2_state)//wenn Taster gedrückt
       {

        led_state2 = !led_state2;//Ausgang wechseln
        digitalWrite(led2,led_state2);}
        taster2_state_alt = taster2_state; // state aktualisieren
        }
   if (millis()-Entprell_zeit>Entprellzeit){
  taster2_state = digitalRead(taster2); //einlesen des Tasters 2
 }

if (millis()-Entprell_zeit>Entprellzeit){
  taster3_state = digitalRead(taster3); //einlesen des Tasters
 }
   
 if (taster3_state != taster3_state_alt) // bei Pegelwechsel
    {
     Entprell_zeit=millis();
     
    
     if(!taster3_state)//wenn Taster gedrückt
       {

        led_state3 = !led_state3;//Ausgang wechseln
        digitalWrite(led3,led_state3);}
        taster3_state_alt = taster3_state; // state aktualisieren
        }

 if (millis()-Entprell_zeit>Entprellzeit){
  taster4_state = digitalRead(taster4); //einlesen des Tasters
 }
   
 if (taster4_state != taster4_state_alt) // bei Pegelwechsel
    {
     Entprell_zeit=millis();
     
    
     if(!taster4_state)//wenn Taster gedrückt
       {

        led_state4 = !led_state4;//Ausgang wechseln
        digitalWrite(led4,led_state4);}
        taster4_state_alt = taster4_state; // state aktualisieren
        }  

  }//Ende loop

Die Frage ist nun wie bekomme ich es hin, das die Outputs 10 - 13 beim Start auf low gehen und nicht auf High?
Bin für etwas Hilfe dankbar! :slight_smile:

Nehme an du hast einen Arduino UNO.
Pin 13 ist problematisch da da ein Led dran hängt und dieses beim Einschalten vom Bootloader angesteuert wird. In Kürze nimm einen anderes Pin.

Zuerst mal mit einem Pulldown Widerstand und dann indem Du zuerst
digitalWrite(Pin, LOW);
PinMode(Pin,OUTPUT);

Wenn Du einen Verbraucher am Pin hast kannst Du Dir den Pulldown Widerstand sparen.

Grüße Uwe

Hallo OlTan

In der setup() Funktion die gewünschte Startposition progammieren.

Dein Code ist etwas zu lang, da Du Codeduplikate benutzt.
Die gesamten Funktionen benötigst Du nur einmal.
Den Rest machst Du mit einem Array.

Wenn Dein Relais auf LOW anzieht, musst Du es zum Start auf HIGH ziehen.

Da die RelaisBoards aktiv LOW sind, würden die in dem Fall wieder beim Start loslegen.

Meine Variante:

constexpr byte kreise {4};
constexpr byte taster[kreise] {2, 3, 4, 5};
constexpr byte led[kreise] {10, 11, 12, 13};

constexpr uint32_t  Entprellzeit {15}; //Entprellzeit für den Taster in ms

bool lastState[kreise] = {false};
uint32_t bounceStart[kreise];


void setup()
{
  for (byte b = 0; b < kreise; b++)
  {
    pinMode(taster[b], INPUT_PULLUP);
    digitalWrite(led[b], LOW);
    pinMode(led[b], OUTPUT);
    digitalWrite(led[b], HIGH);
  }
}

void loop()
{
  for (byte b = 0; b < kreise; b++)                   // frage alles ab
  {
    if (!digitalRead(taster[b]))                      // Taste gedrückt?
    {
      if (!lastState[b])                              // vorher nicht gedrückt?
      {
        lastState[b] = true;                          // merken, das gedrückt
        bounceStart[b] = millis();                    // merken, wann ausgelöst
        digitalWrite(led[b], !digitalRead(led[b]));   // PIN  toggeln
      }
    }
    else if (millis() - bounceStart[b] > Entprellzeit)// Taste losgelassen UND BounceTime abgelaufen
    {
      lastState[b] = false;
    }
  }
}

Zum Thema PIN13 hat @uwefed bereits ausgeführt.

1 Like

OK, hab das kleingedruckte übersehen. In diesem Fall gilt das gesagte nur mit umgekehrten Logikpegeln. Danke für die Korrektur. :slight_smile:

Dann wennschon umgekehrt:

void setup()
{
  for (byte b = 0; b < kreise; b++)
  {
    pinMode(taster[b], INPUT_PULLUP);
    digitalWrite(led[b], HIGH);
    pinMode(led[b], OUTPUT);
   }
}

Zuerst HIGH (in diesem Fall internen Pullupwiderstand einschalten, weil die Pins beim Anschalten Eingänge sind) setzen und dann als Ausgang definieren. Umgekehrt kommt ein kurzer LOW Impuls.

Grüße Uwe

Viele Dank für Eure Antworten!
Das mit der LED an PIN13 wusste ich schon mal, hab es hier aber übersehen, danke für den Hinweis.
Den Rest werde ich ausprobieren und berichten.
Mir war schon klar, das sich der Code auch anders schreiben lässt und so unnötig lang ist.
Allerdings verstehe ich Ihn so noch, für Arrays und ähnliches muss ich noch etwas mehr lernen.

Beste Grüße

Eine Möglichkeit das zu lernen ist im seriellen Monitor sichtbar zu machen welche Variable wann welchen Wert hat
Hier das Demo-Programm aus Post #4 mit entsprechender Ausgabe auf den seriellen Monitor

  • Seriellen Monitor anzeigen lassen
  • baudrate auf 115200 stellen.
  • Programm flashen

und die Ausgabe im seriellen Monitor studieren

#define maxTaster 4
constexpr byte taster[maxTaster] {2, 3, 4, 5};
constexpr byte led[maxTaster] {10, 11, 12, 13};

constexpr uint32_t  Entprellzeit {15}; //Entprellzeit für den Taster in ms

bool lastState[maxTaster] = {false};
uint32_t bounceStart[maxTaster];

void setup() {
  Serial.begin(115200);
  Serial.println("Setup-Start");
  Serial.println();
  Serial.println();

  for (byte b = 0; b < maxTaster; b++) {
    printArrayErklaerung(b);
    pinMode(taster[b], INPUT_PULLUP);
    digitalWrite(led[b], LOW);
    pinMode(led[b], OUTPUT);
    digitalWrite(led[b], HIGH);
  }
}

void loop() {
  for (byte b = 0; b < maxTaster; b++)                   // frage alles ab
  {
    if (!digitalRead(taster[b]))                      // Taste gedrückt?
    {
      if (!lastState[b])                              // vorher nicht gedrückt?
      {
        lastState[b] = true;                          // merken, das gedrückt
        bounceStart[b] = millis();                    // merken, wann ausgelöst
        digitalWrite(led[b], !digitalRead(led[b]));   // PIN  toggeln
      }
    }
    else if (millis() - bounceStart[b] > Entprellzeit)// Taste losgelassen UND BounceTime abgelaufen
    {
      lastState[b] = false;
    }
  }
}

void printArrayErklaerung(int Index) {

  Serial.println("Defintion ein array mit 4 Elementen");
  Serial.println("constexpr byte taster[maxTaster] {2, 3, 4, 5};");
  Serial.println("index  0  1  2  3");
  Serial.println("array {2, 3, 4, 5};");
  
  Serial.print("b=");
  Serial.println(Index);
  Serial.print("taster[");
  Serial.print(Index);
  Serial.println("], INPUT_PULLUP);");

  Serial.print("array-element [");
  Serial.print(Index);
  Serial.print("] enthält die Zahl ");
  Serial.println(taster[Index]);

  Serial.println("das bedeutet die Codezeile");
  Serial.println("pinMode(taster[b], INPUT_PULLUP);");
  Serial.println("macht letztendlich");
  Serial.print("pinMode(");
  Serial.print(taster[Index]);
  Serial.println(", INPUT_PULLUP);");
  Serial.println();
  Serial.println();
}

vgs

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.