Hilfe bei meinen ersten versuchen

Hallo Liebe Leute.

Habe mich hier neu angemeldet nachdem ich schon viel hier gelesen habe.

Kann mir jemand bei meinem Problem weiterhelfen?

Folgendes Problem:

Ich möchte mittels eines Arduinos eine kleine Schaltung realisieren.
Diese soll so funktionieren das wenn ein digitaler Eingang ein Signal bekommt, erst ca 2Minuten gewartet wird dann ein Relais oder Mosfet für n paar Sekunden geschaltet wird und dann wieder auf LOW geht. Sobald der Eingangspin auf LOW steht soll das Relais oder Mosfet auch LOW sein.
Mein Problem ist das Das Signal am Eingangspin die ganze zeit anliegt aber die 2 Minuten und dann das schalten von den paar Sekunden des Ausgangspin nur einmal stattfinden soll wenn der Eingang ein HIGH signal hat.

Ich hoffe mir kann da jemand ein wenig weiter helfen.

gulli84:
Kann mir jemand bei meinem Problem weiterhelfen?

Gerne, wenn du dein Problem besser beschreibst.

Diese soll so funktionieren das wenn ein digitaler Eingang ein Signal bekommt, erst ca 2Minuten gewartet wird dann ein Relais oder Mosfet für n paar Sekunden geschaltet wird und dann wieder auf LOW geht. Sobald der Eingangspin auf LOW steht soll das Relais oder Mosfet auch LOW sein.
Mein Problem ist das Das Signal am Eingangspin die ganze zeit anliegt aber die 2 Minuten und dann das schalten von den paar Sekunden des Ausgangspin nur einmal stattfinden soll wenn der Eingang ein HIGH signal hat.

Ich hoffe mir kann da jemand ein wenig weiter helfen.

Wie soll das gehen, wenn ein Signal (welches Signal?) die ganze Zeit anliegt?

Also besser beschreiben, dann können wir sicher helfen.

Das scheint mir doch eine Aufgabe für einen endlichen Automaten mit Zeitsteuerung zu sein.

Wie man eine Zeitsteuerung baut, kannst du dir bei "Blink without Delay" abschauen, und zu "endlicher Automat" gibts hier auch schon reichlich im Forum.

Das hatten wir doch schon. Irgendwas mit Tor auf und zu machen.

@Hot er kriegt es nicht hin, diese 2 Minuten abzuwarten wenn ein Signal anliegt, deswegen liegt das Signal permanent an. Dann, nach 2 Minuten, soll für ca 2 Sekunden das Relais HIGH geschaltet werden.

Like so:

const int  Signal = 2;   
const int Relais = 13;    

void setup() {
  pinMode(Signal, INPUT);
  pinMode(Relais, OUTPUT);
}
void loop() {
  
    if (digitalRead(Signal) == HIGH) {
   delay(120000);
   digitalWrite(Relais, HIGH);
   delay(2000); 
   digitalWrite(Relais, LOW); 
    } 
else {
    digitalWrite(Relais, LOW);
  }
}

Nein, nicht mit delay. weil so wie er schreibt bzw ich es lese, muss das Ganze LOW gehen/bleiben, wenn das Signal vorher auf LOW geht.

Schonmal Danke für die vielen Antworten.

Den geposteten Code habe ich schon ausprobiert gehabt aber wie schon geschrieben gibt es halt probleme mit den Delay s. Vom Prinzip her soll es schon so funktionieren wie von skorpi08 gepostet, nur muss der Code sofort abbrechen wenn das Eingangssignal wieder auf LOW geht und der Code darf nur einmal ablaufen solange Eingangssignal HIGH ist.

Hast du schon einen Sketch dafür angefangen?

Woher kommt das Signal? Prellfrei?

Also du meinst wenn ein Signal über 2 minuten anliegt, soll das Relais schalten.
Wenn das Signal unter 2 minuten anliegt, soll garnix passieren.
Wenn das Signal über 2 minuten anliegt, soll Relais einschalten für 2 sec oder solange bis das Signal anliegt?

Der Sketch den Skorpi08 gepostet hat entspricht eigentlich genau meinem den ich ausprobiert hab. Also ganz einfach gesagt ich nutze 5V+ vom Arduino gehe über einen Schalter auf einen Pin den ich als INPUT festgelegt hab. Wenn der schalter Geschlossen ist bekommt der Pin 5V und der Sketch mit ich sag jetzt mal 2Minuten warten Relais 2Sek schalten und dann wieder auschalten soll ablaufen, aber nur solangen der Pin HIGH ist. Sobald der schalter Wieder geöfnet wird soll nix passieren.

Also wenn INPUT Pin auf HIGH soll der Sketch 2 Minuten warten Relais für n paar Sekunden schalten und dann wieder ausgehen aber das nur einmal egal ob Pin 2 Minuten auf HIGH oder Bsp. 30 Minuten auf HIGH.
Sobald der INPUT Pin auf LOW geht soll hat das Relais auch LOW sein.

Vom Prinzip her so:
Button 10 sek gedrückt und losgelassen---> nix passiert da 2Minuten Wartezeit noch nicht rum sind und jetzt der Pin wieder auf LOW ist und somit OUTPUT Relais auch LOW

Button 200 sek gedrückt und ---> Wartezeit von 2Minuten erreicht Relais geht für n paar sekunden an und danach wieder aus.

Button 10 Minuten gedrückt---> Das gleiche wie eben. 2 Minuten erreicht Relais geht für n paar Sekunden an und danach wieder aus nur soll sich das nicht wiederholen.

Sobald der INPUT Eingang ein LOW Bekommt soll sowieso nix passieren.

ich hoffe ich konnte es ein wenig verrständlich rüber bringen.

Also du schreibst, "Hilfe bei meinen ersten versuchen", nur wir sehen deine Versuche nicht.

Warum zeigst du uns diese nicht mal, dann können wir evtl. daran Verbesserungen vornehmen und müssen nicht alles für dich machen.

const int  Signal = 2;   
const int Relais = 13;    

void setup() {
  pinMode(Signal, INPUT);
  pinMode(Relais, OUTPUT);
}
void loop() {
  
    if (digitalRead(Signal) == HIGH) {
   delay(120000);
    if (digitalRead(Signal) == HIGH) {
   digitalWrite(Relais, HIGH);
   delay(2000); 
   digitalWrite(Relais, LOW); 
     } 
    }
else {
    digitalWrite(Relais, LOW);
  }
}

Was soll passieren, wenn der Pin nach 2 Minuten und 1 Sekunde auf LOW geht?

Falls der Ausgang dann sofort auf LOW soll, sind fast alle delay-Lösungsansätze raus.

@ Skorpi08 Vielen Dank für den Lösungsvorschlag.
Diesen hatte ich auch schon Probiert, nur wie EIEspanol schon sagte gibt s da das Problem mit den Delay.
Denn in den 2Minuten delay zeit Wird der Schalter nicht gelesen. es könnte sein das in dieser Zeit der Schalter wieder auf LOW gegangen ist und da müsste dann ab diesem Zeitpunkt wieder die 2 Minuten ablaufen.

const int Schalter = 2;     
const int Relais =  13;
long startTime;
long duration;

void setup() {
  
  pinMode(Relais, OUTPUT);      
  pinMode(Schalter, INPUT); 
  Serial.begin(9600); 
}

void loop(){
 if(digitalRead(Schalter) == HIGH)
 {
    startTime = millis();
    while(digitalRead(Schalter) == HIGH);
    long duration = millis() - startTime;
    
   Serial.println(duration);
    if (duration > 120000){
      digitalWrite(Relais,HIGH);
      delay(2000);
      digitalWrite(Relais,LOW);
    }

 }
}

Hoffe ma hab das jetzt richtig hier eingefügt mit dem Code

Der Sketch funktioniert eigentlich so ähnlich wie ich es brauch, nur gibt es nur ein Problem das er die duration Zeit erst ausgibt wenn ich den Taster loslasse.
Ist es möglich dies zu änder so das wenn duration >120000 sofort Relais auf HIGH geht und nicht erst wenn der Taster wieder losgelassen wird.

Hoffe ich konnte es ein wenig verständlich rüber bringen.

Ja, der Sketch macht, was du programmiert hast . Aber noch nicht was du willst.

Außerdem hast du noch das delay drin.

Was du brauchst ist ein endlicher Automat. Google mal danach in Forum.

P.S. Warum muss ICH ihm das sagen? :slight_smile:

P? Warum muss ICH ihm das sagen?

Das habe ich in #2 schon probiert.....
Aber da ist unser neuer Forenmitstreiter gulli84 leider nicht drauf eingegangen.

Und dann denke ich mir doch:
Wer nicht will, der hat schon..... o.ä.

Das Delay ist and der Stelle für mich nicht schlimm.
Ich bekomme es einfach nicht hin das sobald duration über 120000 geht sofort Relais auf High geht. Hier geht erst wenn ich nach den 120000 den Taster loslasse.

Denk mal über die Zeile nach und sag dann, was du denkst, was sie macht:

while(digitalRead(Schalter) == HIGH);

Er Fragt doch ab wie lange der Schalter HIGH ist oder versteh ich da jetzt was falsch?

Mit der Zeile blockiert der Arduino solange der Taster HIGH ist. Siehe das Semikolon am Ende.