Sensor + Taster kombinieren

Guten Abend zusammen, ich stehe mit einer (wahrscheinlich) sehr leichten Aufgabe auf dem Schlauch.

Ich hab an einer Tür einen kapazitiven Sensor verbaut, dieser soll wenn die Tür offen ist 2 Relais schalten, das erste für die Beleuchtung, das zweite als Signal das die Tür geöffnet ist.

Das funktioniert soweit auch alles optimal. Jetzt möchte ich gerne noch einen Taster integrieren der nur die Beleuchtung ausschaltet/einschaltet, sobald die Tür zu ist sollen beide Relais LOW sein.

Kann einer von euch mal mit über den Sketch schauen? Vielen Dank :slight_smile:

P.S. ich weiß gar nicht wie ich anfangen soll, deswegen gibt es zur Abfrage des Tasters momentan noch gar nichts. All meine Versuche sind gescheitert.. :saluting_face:

int LED = 8;
int Tuer = 9;
int Sensor = 2;
int Taster = 3; 

void setup() {
  // put your setup code here, to run once:
  pinMode (LED, OUTPUT); 
  pinMode (Tuer, OUTPUT);
  pinMode (Sensor, INPUT);
  pinMode (Taster, INPUT_PULLUP);
}

void loop() {
  // put your main code here, to run repeatedly:
 if (digitalRead(Sensor) == HIGH)
  {
    digitalWrite(LED,HIGH);
    digitalWrite(Tuer,HIGH); 
  }

 else {
  digitalWrite(LED, LOW);
  digitalWrite(Tuer, LOW);
 }
}

Hallo,
in der Hilfe Referenz findest du wie man logische Verknüpfungen erstellen kann
Und ,oder werden für sowas benötigt.

Du must erst Mal die Einschaltung der beiden Relais voneinander trennen , da du ja unterschiedliche Bedingung hast.

Die Türe wird ja nur vom Sensor geschaltet das Licht von dem Sensor ODER dem Taster.

Heinz

void loop()
{
  // put your main code here, to run repeatedly:
  if (digitalRead(Sensor) == HIGH)
  {
    digitalWrite(LED, HIGH);
    digitalWrite(Tuer, HIGH);
  }
  else
  {
    digitalWrite(LED, LOW);
    digitalWrite(Tuer, LOW);
  }
  if (Tuer == HIGH)                    // Tür ist auf?
  {
    if (digitalRead(Taster) == LOW)    // dann darf Taste abgefragt werdem
    {
      digitalWrite(LED, !digitalRead(LED)); // Zustand ändert sich mit Tastendruck
    }
  }
  else                                 // Tür ist zu?
    digitalWrite(LED, LOW);            // AUS!
}

Aus der hohlen Hand heraus - ungetestet

Danke! Sensor funktioniert noch halbwegs, die LED am Relais geht aus. Das Relais selber schaltet aber nicht mehr, es ist als würde das Relais 'flackern' also super schnell zwischen Offen/Geschlossen wechseln. Der Taster funktioniert leider gar nicht..

Wie ist der angeschlossen?
Kannst Du ein Foto vom Aufbau machen?
Ist das

  if (digitalRead(Sensor) == HIGH)

Der Zustand wenn die Tür auf ist?

Tuer ist 9, zwar nicht konstant gemacht, aber ändert sich nicht im Sketch.

1 Like

Ja, aber der Sensor an 2 ist HIGH wenn

Tür auf oder zu - das war die Frage. :wink:
(Gedanke dahinter: relaismodul schaltet LOW-aktiv. LED HIGH-aktiv, Ich sehe nicht, was zusammengehört)

Wäre schön gewesen, wenn ich das gleich verstanden hätte, was Du mir sagen willlst...

momentan einfach zwischen GND und 3, bild macht glaube ich keinen Sinn, ist nur ein unübersichtlicher Aufbau auf dem Steckbrett :smiley:

Ja :slight_smile:

Das ist ok.
Dann mal meinen Patzer ausmergeln.
if (Tuer == HIGH) ersetzen durch:
if (digitalRead(Tuer) == HIGH) // Tür ist auf?

jetzt funktioniert der Sensor, der Taster hat aber leider keine Auswirkung..

Eigenartig.
Bei mir schon

21:33:56.404 -> Start...
21:33:56.404 -> LED ist: an
21:33:56.404 -> Tuer ist: auf
21:33:59.983 -> LED ist: aus
21:33:59.983 -> Tuer ist: zu
21:34:00.151 -> LED ist: an
21:34:00.151 -> Tuer ist: auf
21:34:05.766 -> LED ist: aus
21:34:05.766 -> Tuer ist: zu
21:34:05.892 -> LED ist: an
21:34:05.925 -> Tuer ist: auf
21:34:11.028 -> LED ist: aus
21:34:11.161 -> LED ist: an
21:34:11.593 -> LED ist: aus
21:34:11.659 -> LED ist: an
21:34:11.659 -> LED ist: aus
21:34:11.659 -> LED ist: an
21:34:13.487 -> LED ist: aus
21:34:13.487 -> LED ist: an
21:34:13.953 -> LED ist: aus
21:34:14.020 -> LED ist: an
21:34:14.285 -> LED ist: aus
21:34:14.387 -> LED ist: an

Mit folgendem Code:

const byte LED = 8;
const byte Tuer = 9;
const byte Sensor = 2;
const byte Taster = 3;

bool lastLed = false;
bool lastTuer = false;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode (LED, OUTPUT);
  pinMode (Tuer, OUTPUT);
  pinMode (Sensor, INPUT);
  pinMode (Taster, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(Sensor) == HIGH)
  {
    digitalWrite(LED, HIGH);
    digitalWrite(Tuer, HIGH);
  }
  else
  {
    digitalWrite(LED, LOW);
    digitalWrite(Tuer, LOW);
  }
  if (digitalRead(Tuer) == HIGH)       // Tür ist auf?
  {
    if (digitalRead(Taster) == LOW)    // dann darf Taste abgefragt werdem
    {
      digitalWrite(LED, !digitalRead(LED)); // Zustand ändert sich mit Tastendruck
    }
  }
  else                                 // Tür ist zu?
    digitalWrite(LED, LOW);            // AUS!
  serMon();
}

void serMon()
{
  if (lastLed != digitalRead(LED))
  {
    lastLed = !lastLed;
    Serial.print(F("LED ist: "));
    lastLed ? Serial.println("an") : Serial.println("aus");
  }
  if (lastTuer != digitalRead(Tuer))
  {
    lastTuer = !lastTuer;
    Serial.print(F("Tuer ist: "));
    lastTuer ? Serial.println("auf") : Serial.println("zu");
  }
}

ah okay, das funktioniert bei mir auch, im Seriellen Monitor passt auch alles, am Relais wird jedoch nur die LED gedimmter, schalten tut das Relais aktuell noch nicht..

der Serielle Monitor spuckt mir was ähnliches aus :slight_smile:

21:37:17.298 -> LED ist: an
21:37:19.091 -> LED ist: aus
21:37:19.618 -> LED ist: an
21:37:19.618 -> LED ist: aus
21:37:19.618 -> LED ist: an
21:37:19.862 -> LED ist: aus
21:37:21.035 -> Tuer ist: zu
21:37:21.652 -> Tuer ist: auf
21:37:22.024 -> Tuer ist: zu
21:37:22.292 -> Tuer ist: auf
21:37:22.630 -> Tuer ist: zu
21:37:22.977 -> Tuer ist: auf
21:37:24.143 -> LED ist: an
21:37:26.719 -> LED ist: aus
21:37:27.407 -> Tuer ist: zu
21:37:27.579 -> Tuer ist: auf
21:37:28.312 -> Tuer ist: zu
21:37:28.346 -> Tuer ist: auf

Sag mal ist Dein TÜR und LED Pin vertauscht?
Der Code muss zwingend wenn die Tür geht auch die LED mitmachen.

da hab ich grad ausversehen während ich den Sensor getestet hab den Taster gedrückt gehalten.. :sweat_smile:

ergebnis ist leider unverändert..

:wink:

Tausche loopp()

void loop()
{
  if (digitalRead(Sensor) == HIGH)
  {
    if (!lastSensor)
    {
      lastSensor = HIGH;
      Serial.println(F("Sensor ausgelöst"));
    }
    digitalWrite(LED, HIGH);
    digitalWrite(Tuer, HIGH);
  }
  else
  {
    if (lastSensor)
    {
      lastSensor = LOW;
      Serial.println(F("Sensor beendet"));
    }
    digitalWrite(LED, LOW);
    digitalWrite(Tuer, LOW);
  }
  if (digitalRead(Tuer) == HIGH)       // Tür ist auf?
  {
    if (digitalRead(Taster) == LOW)    // dann darf Taste abgefragt werdem
    {
      digitalWrite(LED, !digitalRead(LED)); // Zustand ändert sich mit Tastendruck
    }
  }
  else                                 // Tür ist zu?
    digitalWrite(LED, LOW);            // AUS!
  serMon();
}

Ergebnis bei mir:

21:48:56.834 -> Start...
21:48:56.834 -> Sensor ausgelöst
21:48:56.834 -> LED ist: an
21:48:56.834 -> Tuer ist: auf
21:49:01.675 -> Sensor beendet
21:49:01.675 -> LED ist: aus
21:49:01.675 -> Tuer ist: zu
21:49:01.973 -> Sensor ausgelöst
21:49:01.973 -> LED ist: an
21:49:01.973 -> Tuer ist: auf
21:49:08.905 -> LED ist: aus
21:49:09.071 -> LED ist: an
21:49:09.535 -> LED ist: aus
21:49:09.668 -> LED ist: an

'lastSensor' was not declared in this scope -> was für eine Funktion hat die Variable? Wie muss ich sie einbinden? :slight_smile:

Da wo der Rest schon steht:

bool lastLed = false;
bool lastTuer = false;
bool lastSensor = false;

Da wo der Rest schon steht:

bool lastLed = false;
bool lastTuer = false;
bool lastSensor = false;

& den

  serMon();

?

Ohne 'serMon();' funktioniert der Taster immernoch nicht..

Du solltest nur loop tauschen ;(
das SerMon war vorher schon bei - dann hier komplett

const byte LED = 8;
const byte Tuer = 9;
const byte Sensor = 2;
const byte Taster = 3;

bool lastLed = false;
bool lastTuer = false;
bool lastSensor = false;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode (LED, OUTPUT);
  pinMode (Tuer, OUTPUT);
  pinMode (Sensor, INPUT);
  pinMode (Taster, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(Sensor) == HIGH)
  {
    if (!lastSensor)
    {
      lastSensor = HIGH;
      Serial.println(F("Sensor ausgelöst"));
    }
    digitalWrite(LED, HIGH);
    digitalWrite(Tuer, HIGH);
  }
  else
  {
    if (lastSensor)
    {
      lastSensor = LOW;
      Serial.println(F("Sensor beendet"));
    }
    digitalWrite(LED, LOW);
    digitalWrite(Tuer, LOW);
  }
  if (digitalRead(Tuer) == HIGH)       // Tür ist auf?
  {
    if (digitalRead(Taster) == LOW)    // dann darf Taste abgefragt werdem
    {
      digitalWrite(LED, !digitalRead(LED)); // Zustand ändert sich mit Tastendruck
    }
  }
  else                                 // Tür ist zu?
    digitalWrite(LED, LOW);            // AUS!
  serMon();
}

void serMon()
{
  if (lastLed != digitalRead(LED))
  {
    lastLed = !lastLed;
    Serial.print(F("LED ist: "));
    lastLed ? Serial.println("an") : Serial.println("aus");
  }
  if (lastTuer != digitalRead(Tuer))
  {
    lastTuer = !lastTuer;
    Serial.print(F("Tuer ist: "));
    lastTuer ? Serial.println("auf") : Serial.println("zu");
  }
}

Danke! Sobald ich den Taster drück springt es im Monitor von aus sofort wieder auf An.

In der Praxis schaltet das Relais gar nicht..

22:02:29.121 -> Sensor beendet
22:02:29.121 -> LED ist: aus
22:02:29.121 -> Tuer ist: zu
22:02:29.706 -> Sensor ausgelöst
22:02:29.706 -> LED ist: an
22:02:29.706 -> Tuer ist: auf
22:02:30.266 -> Sensor beendet
22:02:30.266 -> LED ist: aus
22:02:30.266 -> Tuer ist: zu
22:02:30.905 -> Sensor ausgelöst
22:02:30.905 -> LED ist: an
22:02:30.905 -> Tuer ist: auf
22:02:33.549 -> LED ist: aus
22:02:33.549 -> LED ist: an
22:02:33.549 -> LED ist: aus
22:02:33.688 -> LED ist: an
22:02:34.550 -> LED ist: aus
22:02:34.550 -> LED ist: an
22:02:34.550 -> LED ist: aus
22:02:34.695 -> LED ist: an
22:02:35.844 -> LED ist: aus
22:02:35.844 -> LED ist: an
22:02:35.844 -> LED ist: aus
22:02:35.844 -> LED ist: an
22:02:35.844 -> LED ist: aus
22:02:35.981 -> LED ist: an