Wie  bereits angekündigt, soll in dieser Aufgabe eine funktionierende Selbsthaltung einer LED entstehen. Wie in den vorherigen Kapiteln zu sehen war, blinkten die LEDs bei längerer Betätigung des Tasters. Die zuvor programmierte Selbsthaltung stellt mit delay() also keine gute Lösung dar. 

In diesem Kapitel soll eine funktionierende Selbsthaltung programmiert werden. Wird der Taster betätigt, soll eine LED an oder aus gehen, unabhängig davon, wie lange der Taster betätigt ist. Diese Art von Schaltung ist beispielsweise durch die Lichtansteuerung im Treppenhaus bekannt und wird Stromstoßschaltung genannt.

Dafür verwenden wir die im vorigen Kapitel aufgebaute Parallelschaltung. 

Aufbau aus dem letzten Kapitel, Parallelschaltung mit zwei LEDs

Abbildung: Aufbau der Schaltung aus dem Kapitel: "Zweite LED in Parallelschaltung"
Quelle: BBS2 Wolfsburg


Es soll nun ein Programm entwickelt werden, das zustandsabhängig funktioniert. Abhängig davon, ob die LEDs zuvor ein- oder ausgeschaltet sind, sollen sie ihren Zustand ändern. 
Hierbei wird eine sogenannte State Change Detection oder auch Edge Detection (auf deutsch: Zustandsänderungserkennung) durchgeführt. 

Source Code:
bool status_Taster = false;

bool letzterStatus_Taster = false;
bool status_LED = false;

void setup()
{
  pinMode(16, OUTPUT);
  pinMode(35, INPUT);


  digitalWrite(16, LOW);
}

void loop() 
{

  if (digitalRead(35) == HIGH) 

  {

    status_Taster = true;

  }

  

  else 

  {

    status_Taster = false;

  }


  if (status_Taster != letzterStatus_Taster) 

  {

    letzterStatus_Taster = status_Taster;

 
    if (status_Taster == true) 

    { 

      status_LED = !status_LED;


      if (status_LED == true) 
      {
        digitalWrite(16, HIGH);
      }

      else
      {
        digitalWrite(16, LOW);
      }
    }

  }
  
  delay(20);
}

Was passiert hier überhaupt?

Zeile 1: In dieser Zeile wird die Boolean Variable „status_Taster“ angelegt. Diese Variable ist da, um zu speichern, ob der Taster momentan gedrückt ist oder nicht.

Zeile 2: „letzterStatus_Taster“ ist auch eine Boolean Variable. Sie wird verwendet, um den letzten Status des Tasters zu speichern. Der "letzte" Status meint den Status des Tasters bei dem letzten Durchlauf der loop().

Zeile 3: Um den Zustand der LED speichern zu können, den diese im Programm annehmen soll, wird diese Boolean Variable „status_LED“ angelegt.

 

void setup()

Zeile 7: Hier wird mit pinMode() der Pin16 als ein Ausgang des ESP32 deklariert. Dadurch sind die LEDs mit einem Ausgang verbunden.

Zeile 8: Hier wird mit pinMode() der Pin35 als ein Eingang festgelegt. Dieser ist mit dem Taster verbunden, der dafür zuständig ist, ob an dem Pin35 ein HIGH oder ein LOW anliegt.  

Zeile 10: Hier wird digitalWrite() dazu benutzt, den Ausgang Pin16 zu Beginn des Programms auf LOW zu setzen, sodass die LEDs zu Beginn stets ausgeschaltet sind.


void loop()

Zeile 15: Mit digitalRead() wird abgefragt, ob an Pin35 ein HIGH anliegt. 

Zeile 17: Ist dies der Fall, wird der Taster zu diesem Zeitpunkt gedrückt. Der Variablen status_Taster wird deshalb der Wert true zugewiesen.

Zeile 22: Wenn kein HIGH an Pin35 anliegt, ist der Taster zu diesem Zeitpunkt unbetätigt und status_Taster wird der Wert false zugewiesen.

Zeile 25: In dieser if-Anweisung wird überprüft, ob sich der momentane Status des Tasters von dem letzten Zustand unterscheidet. Es sollen nämlich keine weiteren Anweisungen ausgeführt werden, wenn der Status des Tasters immer noch der selbe ist, wie in dem letzten loop() - Durchlauf. Wenn also der Taster länger gedrückt wird, werden die Anweisungen nur ein einziges Mal für den gesamten Tastendruck ausgeführt.

Zeile 27: Wenn sich der momentane Taster-Status vom letzten unterscheidet, wird zunächst letzterStatus_Taster mit dem momentanen Status status_Taster überschrieben. Dieser Schritt ist für den nächsten loop() - Durchlauf wichtig. 

Zeile 29: Mithilfe dieser if-Anweisung wird überprüft, ob der Taster momentan tatsächlich gedrückt wird. 

Zeile 31: An dieser Stelle wird status_LED auf das Gegenteil des vorigen Wertes gesetzt. Auf diese Weise wird erreicht, dass die LEDs aus gehen sollen, wenn sie zuvor geleuchtet haben und an gehen sollen, wenn sie zuvor abgeschaltet waren.

Zeile 33-40: Anschließend wird der zu erreichende Status der LEDs noch einmal abgefragt. Mit digitalWrite() werden dann die LEDs über den Pin16 gemäß status_LED an oder aus geschaltet.

Zeile 44: Für die Stabilität des Programms wird die Funktion delay() benutzt. Da der Taster bei kurzzeitiger Betätigung nachschwingen kann, wird mit delay() erreicht, dass ein solches Nachschwingen des Tasters unberücksichtigt bleibt.


Mit Ardublockly:

Ardublockly

Abbildung: Programmierung in Ardublockly
Quelle: BBS2 Wolfsburg


Zuletzt geändert: Montag, 22. Januar 2024, 14:19