Stromstoßschalter funktioniert nicht richtig

Hallo,
ich habe gerade den Arduino entdeckt (Arduino Nano) und versuche gerade mich in hineinzuarbeiten.
Nach den ersten Versuchen versuche ich gerade einen Stromstoßschalter zu simulieren.

Dies versuchte ich mit folgenden Code:

  // Hier werden Bibliotheken eingefügt:
#include <Bounce2.h>                                        // Diese Bibliothek dient dem Entprellen von Tastern

  // Hier werden Definitonen festgelegt:
#define Taster1 2                                           // Definiere den Ausdruck "Taster1" mit dem Wert "2" für Pin 2 
#define LED1 13                                             // Definiere den Ausdruck "LED1" mit dem Wert "13" für Pin 13
Bounce debouncerTaster1 = Bounce();                         // Lege debouncerTaster1 als Objekt an (damit der entprellte Wert weiterverabeitet werden kann)
  
  // Hier werden globale Variablen festgelegt:
int TasterStatus = 0;                                       // Variable "TasterStatus" wird mit dem Startwert "0" festgelegt
boolean LichtStatus = false;                                // Variable "Lichtstatus" wird mit dem Startwert "false" festgelegt
boolean TastenDruck = false;                                // Variable "TastenDruck" wird mit dem Startwert "false" festgelegt

void setup()                                                // Hier werden grundsätzliche Startwerte eingestellt:
{                            
pinMode(LED1, OUTPUT);                                      // Der Pin für die "LED1" (Pin 13) wird als Ausgang definiert
pinMode(Taster1, INPUT);                                    // Der Pin für den "Taster1" (Pin 2) wird als Eingang definiert
debouncerTaster1.attach(Taster1);                           // debouncerTaster1 wird der Variablen "Taster1" zugewiesen
debouncerTaster1.interval(10);                              // debouncerTaster1 wird mit einer Intervallzeit von "10 ms" festgelegt
}

void loop()                                                 // Hier kommt der immer wieder durchlaufende Programmcode:
{ 

debouncerTaster1.update();                                  // Hiermit wird der Wert von "debouncerTaster1" upgedatet
int EntprellTaster1;                                        // Hiermit wird die lokale Variable "EntprellTaster1" definiert
EntprellTaster1 = debouncerTaster1.read();                  // Lese "debouncerTaster1" aus und schreibe den Wert in "EntprellTaster1"

if ((EntprellTaster1 == HIGH) && (TastenDruck == false))    // Wenn der Taster1 (Variable "EntprellTaster1" ist 1) gedrückt ist
  {                                                         // verarbeite den folgenden Block
    LichtStatus = !LichtStatus;                             // Invertiere die Variable "LichtStatus"
    TastenDruck = true;                                     // Setze die Variabel "TastenDruck" auf "false"
  }
else                                                        // Wenn der Taster1 (Variable "EntprellTaster1" ist 1) nicht gedrückt ist
  {                                                         // verarbeite den folgenden Block
    TastenDruck = false;                                    // Setze die Variable "TastenDruck" auf "false"
  }

digitalWrite(LED1, LichtStatus);                            // Setze den Digitalausgang "LED1" (Pin 13) auf den Wert Lichtstatus
}

Leider funktioniert dies nur unzuverlässig. Ich drücke die Taste und der Zustand der LED wechselt, oder auch nicht.
Kann mir wer sagen, was ich falsch gemacht habe?

Danke für die Geduld, die ihr einen Anfänger entgegen bringt.

Gruß
Alamar

pinMode(Taster1, INPUT);

Probier mal pinMode(Taster1, INPUT_PULLUP); und schalte den Taster gegen GND.
Falls das einen Unterschied macht, fehlte dir in deinem ersten Ansatz der Pulldown Widerstand.

https://www.arduino.cc/en/Tutorial/Button

Hast du am Taster einen Pulldown-Widerstand verbaut? Wenn nicht mal INPUT in INPUT_PULLUP ändern, den Taster gegen Masse schalten und dann statt auf HIGH auf LOW abfragen

Du hast diese Optionen bei Tastern:
1.) externer Pullup - schalten gegen Masse - gedrückt LOW
2.) interner Pullup - schalten gegen Masse - gedrückt LOW
3.) externer Pulldown - schalten gegen 5V - gedrückt HIGH

Also ich hab die Schaltung auf einen Broadboard mit Pull-Down Widerstand (10k) aufgebaut.

Ich werde es mal mit den internen Pull-Up versuchen.

Gruß
Alamar

if ((EntprellTaster1 == HIGH) && (TastenDruck == false)) 
  {                                                         
    LichtStatus = !LichtStatus; 
    TastenDruck = true;  
  }
else                                                        
  {
    TastenDruck = false; 
  }

Der else-Teil ist falsch.

TastenDruck darf erst false werden wenn EntprellTaster1 LOW wird (Taster losgelasen) und nicht beim 2. Durchlauf von loop(). Das passiert weil Du im if 2 Bedingungen hast die beide wahr sein müssen damit der if-Teil ausgeführt wird aber es braucht nur eine Bedingung nicht beide falsch damit der else-Teil ausgeführt wird.,

also

EntprellTaster1 == HIGH und TastenDruck = false
  -> LED umschaten 
  -> TastenDruck = true

EntprellTaster1 == LOW und TastenDruck = true 
  -> TastenDruck = false

Grüße Uwe

Danke :slight_smile:
das war die Lösung

mit

if ((EntprellTaster1 == HIGH) && (TastenDruck == false))    // Wenn der Taster1 (Variable "EntprellTaster1" ist 1) gedrückt ist
  {                                                         // verarbeite den folgenden Block
    LichtStatus = !LichtStatus;                             // Invertiere die Variable "LichtStatus"
    TastenDruck = true;                                     // Setze die Variabel "TastenDruck" auf "false"
  }
else if ((EntprellTaster1 == LOW) && (TastenDruck == true)) // Wenn der Taster1 (Variable "EntprellTaster1" ist 0) gedrückt ist
  {                                                         // verarbeite den folgenden Block
    TastenDruck = false;                                    // Setze die Variable "TastenDruck" auf "false"    
  }
else                                                        // in sonstigen Fällen
  {                                                         // verarbeite den folgenden Block

  }

funktioniert es jetzt genau so, wie es sollen

Gruß
Alamar

Hast Du es auch verstanden was Dein fehler war?

Ich würde aber kein "else if" verwenden sonder 2 unabhängige "if"

Grüße Uwe

Ja, bei zwei Variablen gibt es vier mögliche Zustände und ich versuchte eine Verzweigung mit zwei Möglichkeiten.
Beim ersten Durchlauf stimmte alles aber schon beim nächsten Durchgang kam ich in den else-Zweig weil zwar der Taster immer noch auf "1" aber die Vergleichsvariable nicht mehr auf "0" war und dadurch automatisch die Bedingung für "else" erfüllt ist.

"else if" versuchte ich, weil ich gerade die Befehls-Referenz offen hatte und mir dieser Befehl neben "case" für Mehrfachauswalen auffiel.
Im Moment arbeite ich mich gerade in die Möglichkeiten ein, deshalb wird wahrscheinlich mein Code eher suboptimal sein

Gruß
Alamar

Ok Du hast es verstanden.

"else if" bringt die 2. Bedingung in Relation zu der esten in if.
Also if unwahr dann elseif ecc.

In diesem Beispiel sind die Bedingungen aber unabhängig voneinander und es genügen 2 unabhängige if.

Grüße Uwe

Stimmt die zweite Bedingung ist unabhängig von der ersten deshalb wären es eigentlich zwei unabhängige "if ... else"
würde "switch ... case" nicht auch gut passen?
Diese Funktion ist doch scheinbar für die Abfrage mehrerer Zustände gedacht, oder?

Gruß
Alamar

Mehrere Zustände. Aber nur eine Variable.

Okay, damit ist "switch ... case" nicht tauglich.

Bleiben wir also bei "if"

Danke für die Info.