Relais schließt kurz durch Interrupt

Hallo Zusammen,

mein Projekt soll das Relais bei Tasterdruck schalten, für 5 sekunden laufen und dann für 3 sekunden gesperrt sein. der 2. Taster soll via interrupt das programm beeenden.
geht auch solange, bis ich am Relais die Spannungsquelle von 12V und den Verbraucher anschließe.

Nehm ich den Interrupt raus, funktioniert es, allerdings ist dann keine Stop funktion mehr gegeben und läuft so lange, wie der Delay läuft.

``// Relais an Pin 7, Taster an Pin 6
int Relais = 7; 
int Taster = 6; 
const int Interruptpin = 2;

// speichert den Status des Relais: 0 = aus, 1 = ein
int StatusRelais = 1;  

void setup()  
{
  // Relais wird als OUTPUT (Ausgang) definiert
  pinMode(Relais, OUTPUT);   
  
  // der Taster wird als INPUT (Eingang) deklariert
  pinMode(Taster, INPUT);  
  
  attachInterrupt(digitalPinToInterrupt(Interruptpin), stop, CHANGE);




}

void loop() 
{  
  // Taster abfragen
  StatusRelais = digitalRead(Taster); 

  // wenn der Taster gedrückt wurde
  if (StatusRelais == HIGH) 
  {      
    // Relais für 5 Sekunden (5000 ms) einschalten                         
    digitalWrite(Relais, HIGH); 
    delay(5000); 
    // Relais ausschalten                
    digitalWrite(Relais, LOW);
    delay(3000);
  }                               
}
void stop ()
{
digitalWrite(7, LOW);

}

Ich bin absolut kein Profi, aber kann mir jemad hefen, wo der fehler ist?

Vergiss Interrupts und Delays, beide sind in der Anwendung eine Sackgasse.
BlinkWithoutDelay in den Beispielen der IDE anschauen und verstehen, Dein Programm entsprechend ändern und dann sehen wir weiter.

@tobim2603

wenn du deinen Sketch nicht mit delays blockierst, brauchst du auch keine Buttons mit Interrupt auslesen.

Ich sehe bei dir da eine typische Finite State Maschine.
Wenn ich es richtig gelesen habe sind das 3 Status wobei es eben aus dem Zustand Active zwei Übergänge gibt, entweder wegen Zeitablauf oder wegen dem Stop Button.

ist das korrekt?

auf ein elektrisches "Problem" möchte ich noch Hinweisen. Du fragst offenbar auf HIGH ab ... hast du auch externe Pulldown Widerstände bei deinen Buttons installiert damit die Pegel HIGH und LOW sauber erkannt werden können?

bitte korrigiere deinen Beitrag und platziere deinen Code zwischen CODE-Markierung.

Das deutet auf ein EMV Problem hin.

Was ist das für ein Relais ?
Was ist das für ein Verbraucher ?
Hast du Freilaufdiode(n) angeschlossen ?

// Relais an Pin 7, Taster an Pin 6
int Relais = 7;
int Taster = 6;
const int Interruptpin = 2;
// speichert den Status des Relais: 0 = aus, 1 = ein
int StatusRelais = 1;

void setup()
{
  // Relais wird als OUTPUT (Ausgang) definiert
  pinMode(Relais, OUTPUT);
  // der Taster wird als INPUT (Eingang) deklariert
  pinMode(Taster, INPUT);
  pinMode(Interruptpin, INPUT);
  attachInterrupt(digitalPinToInterrupt(Interruptpin), stop, CHANGE);
}

void loop()
{
  // Taster abfragen
  StatusRelais = digitalRead(Taster);
  // wenn der Taster gedrückt wurde
  if (StatusRelais == HIGH)
  {
    // Relais für 5 Sekunden (5000 ms) einschalten
    digitalWrite(Relais, HIGH);
    delay(5000);
    // Relais ausschalten                
    digitalWrite(Relais, LOW);
    delay(3000);
  }
}

void stop ()
{
  digitalWrite(7, LOW);
}

So sieht der Code nachbearbeitet aus, der 2. Schalter wurde nun auch als Pulldown geschaltet und im Bild seht ihr wie es momentan aufgebaut ist

Schaust du nebenan nach Lösungen.

Warum soll ich mich bei Fratzenbuch anmelden, um Deinem Link zu folgen?

Gruß Tommy

An deiner Pumpe fehlt die Freilaufdiode.
Danach hatte ich schon gefragt, oder beantwortest du keine Fragen ?

Hat der Pulldown an deinem "Interrupt"-Taster was gebracht?
Was sagen deine Facebook-Freunde?

Bis dahin wird hier (hoffentlich) darauf gewartet, was du erzählst.

  • poste doch bitte den wokwi link dann spar ich mir das zeichnen
  • kannst du die Frage in Post #3 beantworten?
// Relais an Pin 7, Taster an Pin 6
const int Relais = 7;
const int Taster = 6;
const int Interruptpin = 2;
volatile bool Enable = false;

void setup()
{
  // Relais wird als OUTPUT (Ausgang) definiert
  digitalWrite(Relais, HIGH);// wenn Relais ist LOW-aktiv, sonst auskommentieren
  pinMode(Relais, OUTPUT);
  // der Taster wird als INPUT (Eingang) deklariert
  pinMode(Taster, INPUT);
  pinMode(Interruptpin, INPUT);
  attachInterrupt(digitalPinToInterrupt(Interruptpin), stop, RISING );
}

void loop()
{
  // Taster abfragen
  if (digitalRead(Taster) == HIGH)
  { 
    Enable = true;
    // wenn der Taster gedrückt wurde
    // Relais für 5 Sekunden (5000 ms) einschalten
    digitalWrite(Relais, HIGH);
    delay(5000);
    // Relais ausschalten
    digitalWrite(Relais, LOW);
  }
}

void stop ()
{
  if (Enable) {
    digitalWrite(7, LOW);
    Enable = false;
  }
}

TobiasRelais - Wokwi ESP32, STM32, Arduino Simulator

Das ist der Link, so wie mein aktuelles Projekt aufgebaut ist.
Die Widerstände habe ich auf eine externe Platine gelötet.
Wie gesagt, die Schaltung funktioniert so, aber das Relais löst sich wenn der Verbraucher angeschlossen wird

@tobim2603

entspricht das State Diagram in #3 dem was du dir vorstellst oder gibt es noch andere Anforderungen?

Dann lies doch bitte mal, was ich dir in Pos #6 und #10 geschrieben habe.

Das Relais ist so ein Standartrelais 5V von Ebay.
1 Kanal Relay Relais 5V High / Low Level Trigger einstellbar Arduino Raspberry | eBay

Der Verbraucher ist eine 12V DC Lebensmittelpumpe. Das ganze soll ein Wasserspender für meine Tochter werden und ich hab mir das alles etwas einfacher vorgestellt :disappointed_relieved:

Nein, eine Freilaufdiode ist nicht verbaut. Da bin ich auch ganz ehrlich, da haben dann meine elektrokenntnisse aufgehört :joy:

Ok, das hat sich grad überschnitten.
Die Freilaufdiode brauchst du zwingend an allen Induktivitäten, wie auch Pumpen.

zumindest ist die Schaltung stabiler, vorher hat das leichte Drücken des Tasters das Relais schon rausgehauen.
Die Schaltung an sich funktioniert nun auch, solange wie ich den Verbraucher nicht am Relais hab.

Vielen lieben Dank für deine schnelle antwort.
Hast du vielleicht einen Link für mich, welche ich da am besten für nehmen kann?

Wie gesagt, mit Freilaufdioden hab ich mich bisher noch nicht mit beschäftigt.