Problem beim Relais ansteuern

Hallo

Ich habe ein kleineres Problem.
Beim Arduino UNO habe ich zwei Taster angeschlossen, die den selben Ausgang/Relais schalten.
Wen ich den TasterZeit drücke, soll mir das Relais für fünf Sekunden angesteuert werden.
Wen ich den TasterSchritt dürcke steuert es das Relais an beim erneuten drücken löst sich das Relais wieder.

Wen ich die zwei Sketches einzeln verwende, funktionieren es einwandfrei.

Wen ich beide Sketch aufspiele funktioniert es nicht mehr ganz so gut.
Die Funktion mit der TasterZeit funktioniert tip top. Die LED beim Relais leuchtet 5Sec. und man hört das ''Klicken'' beim Ein/Ausschalten.
Beim drücken TasterSchritt wird das Relais angesteuert, die LED leuchtet dann nur schwach, das Relais zieht aber nicht an. Beim erneuten drücken erlischt die LED wieder.

Ich kann mir nicht erklären weshalb das Relais nicht anzieht.
Kann jemand dieses Phänomen erklären?

Danke und Gruss
Harry

int TasterZeit = 2;
int TasterSchritt = 3;
const int Relay = 4;
long pause = 2000;
long zeitschalter = millis();
int ledstatus = LOW;

void setup() { 
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,OUTPUT);
}

void loop() {
  
  TasterZeit=digitalRead (2);

  if (TasterZeit == LOW) {
    //Der Schalte ist nicht gedrückt

    digitalWrite(4,LOW); //Relay nicht angesteuert
  }

  else { // der Schalter wird gedrückt
  digitalWrite(4,HIGH); //Relay geschaltet

 delay (5000); //wartet fünf Sekunde, dann aus
 digitalWrite(4,LOW);
}


  { TasterSchritt=digitalRead (3);
  
if (TasterSchritt == HIGH)
  if((millis()-zeitschalter) > pause){
    zeitschalter = millis();
      if(ledstatus == HIGH){ledstatus = LOW;}else{ledstatus = HIGH;}}
   
  
  
digitalWrite(4 , ledstatus); }
}

Du vermischst Einiges.

Ibeb definierst Du (nach meinem Verständnis) die Pins.

int TasterZeit = 2;
int TasterSchritt = 3;
const int Relay = 4;

Da solltest Du auch bei den beiden anderen "const" davor schreiben.

Weiter unten verwendest Du die gleichen Variablen, um Zustände zu speichern. Das macht man nicht.

  TasterZeit=digitalRead (2);

Nimm dafür eine neue Variable.

Für das Relais nimmst Du erst mal eine Statusvariable.

boolean isRelaisAn = false;

Dann musst Du Dir darüber klar werden, welche von Deinen beiden Funktionalitäten vorrang haben soll.

Wenn also die 5 sekunden laufen, darf dann der Aus-Taster ausschalten oder nur, wenn es mit ihm eingeschaltet wurde.
Wenn ja, musst Du Dir merken, woher das Einschalten kam.

Wenn nein, muss die höher priorisierte Abfrage als letzte kommen und Du darfst kein Delay drin haben.

Am Ende gibst Du dann isRelaisAn auf den Relaispin aus.

Gruß Tommy

Harrybreiten:
Ich habe ein kleineres Problem. ...

Konntest Du das Problem mit Tommys Hilfe lösen? Ich verstehe, was er meint, aber verstehst auch Du das?

Gruß

Gregor

@gregor: Schön, dass wenigstens Du mich verstehst :wink:

Gruß Tommy

Hast Du pullup/pulldownwiderstände an den Tastern verbaut?
Grüße Uwe

Tommy56:
Schön, dass wenigstens Du mich verstehst :wink:

Naja ... ich dachte, dass das für einen Frischling unverständlich sein könnte. Wenn man Neuling ist, weiß man ja erstmal von vielen Dingen nichts und traut sich vielleicht nicht, nochmal zu fragen.

Gruß

Gregor

Wie der Sketch laufen soll ist mir unklar?

Als erstes solltest du mal die geschweifte Klammer [...] { TasterSchritt=digitalRead (3);[...] entfernen.

Dann würde ich die Pins 4, 7 und 8 nutzen. Dies sind die einzigen digital Pins ohne mehrfach Nutzen. So bekommst du bei einer Erweiterung der Software nicht in Bedrängnis wenn du vielleicht zwei Interrupteingänge benötigst (nur als Beispiel gedacht).

Auch empfehle ich dir alles, wirklich alles, zu kommentieren. So habe ich zumindest einiges gelernt. Natürlich könnte man dir dein Programm auch lauf fertig hier servieren, aber dann würdest du nichts lernen :wink:

Gruß

MiReu

Hallo Ihr danke euch erstmal.
Ja, ich bin ein zimlicher Anfänger, was das programmieren betrift.

Hey Tommy, ist bestimmt eine sehr gute Erklärung, die du geliefert hast, aber sorry, wen ich versuche sie umzusetzen, geht gar nichts mehr :slight_smile:

  • wen ich die const bei den Tastern schreibe und die TasterZeit=digitalRead (2); und TasterSchritt=digitalRead (3); lösche.
    Ist der Ausgang permanent bestromt, es gibt keine Änderung wen ich dann eine Taste drücke.

Ja mit dem SchrittTaster würde ich die Zeitschaltung gerne ausschalten können. Dies habe ich mir aber als nächsten Schritt vornhemen wollen. :slight_smile:

Die Steuerung, welche ich hochgeladen habe, funktioniert eigeltich, nur, kommt zu wenig Strom auf das Relais, wen ich die SchrittTaste drücke.
Bei der ZeitTaste funktioniert es.

Ich hatte Dir als erstes geschrieben, dass Du die beiden verschiedenen Sachen

  1. Der Pin für den Taster
  2. Der Wert, der mit digitalRead von diesem Taster gelesen wird

trennen sollst.

Das ist bei Dir die gleiche Variable namens TasterZeit (das gleiche mit TasterSchritt). Das geht nicht.

z.B.

const byte tasterZeit = 2;
const byte Schritt = 3;

byte wertTasterZeit = 0; 

// im loop:

wertTasterZeit = digitalRead(tasterZeit);
...

Lass doch die Zeitsteuerung erst mal weg und betrtachte nur die Schrittsteuerung.
Schreibe Dir Serial.println-Ausgaben rein, damit Du siehst, was Dein Programm gerade macht.

Gruß Tommy