Bei­spiel­pro­gramm Taster

Lese­zeit: 5 Minu­ten

Das Pro­gramm demons­triert die Ver­wen­dung eines Tas­ters.
Wird der Tas­ter gedrückt, leuch­tet die LED.

// Variablen für die LED und den Taster setzen
int LED = 6; 
int TASTER = 7; 

// speichert den mit digitalRead gelesenen Wert
int TasterLesen; 

void setup()  
{ 
  // pinMode LED setzen, Ausgabe = OUTPUT
  pinMode(LED, OUTPUT);

  /*
    pinMode des Tasters setzen 
    INPUT = Modus Eingabe 
    INPUT_PULLUP = Modus Eingabe und Eingangspegel auf HIGH setzen
  */
  pinMode(TASTER, INPUT_PULLUP);
} 

void loop()  
{
  // Status des Tasters lesen (HIGH/LOW) 
  TasterLesen = digitalRead(TASTER);   

  // wenn der Taster gedrückt wurde
  if (TasterLesen == LOW)
  {
    // kurze Pause
    delay(200);

    // Wert für LED schreiben
    // LOW = aus, HIGH = an
    digitalWrite(LED, HIGH); 
  }
}

Wenn der Tas­ter als Ein- und Aus­schal­ter der LED funk­tio­nie­ren soll:

Varia­ble bool

int LED = 6;
int TASTER = 7;

int TasterLesen;

/*
   setzt den Status
   Status true -> LED an
   Status false -> LED aus
   beim Start soll die LED ausgeschaltet sein
*/
bool Status = false;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(TASTER, INPUT_PULLUP);
}

void loop()
{
  TasterLesen = digitalRead(TASTER);
  if (TasterLesen == LOW)
  { 
    delay(200);

    // LED ist aus → Status == false 
    if (Status == false)
    { 
      digitalWrite(LED, HIGH); 

      // Status auf true (an) setzen
      Status = true;
    }

    // LED ist an → Status == true 
    else if (Status == true) 
    { 
      digitalWrite(LED, LOW);

      // Status auf false (aus) setzen   
      Status = false;
    }
  } 
}

Lei­der ver­hin­dert das delay(200) nur sehr unzu­rei­chend das soge­nann­te "Prel­len" eines Tas­ters. Wird der Tas­ter über eine län­ge­re Zeit gedrückt gehal­ten, wech­selt das aus­ge­sen­de­te Signal immer wie­der zwi­schen HIGH und LOW. Das führt zu uner­wünsch­ten Effek­ten: im Bei­spiel­po­gramm blinkt die LED solan­ge der Tas­ter gedrückt wird.

Abhil­fe schafft hier die Biblio­thek Bounce2.
Bevor sie ver­wen­den kannst, musst du sie zunächst installieren:

Sketch -> Biblio­thek ein­bin­den -> Biblio­the­ken verwalten

// Bibliothek Bounce2 einbinden
# include <Bounce2.h>

// Bounce starten
// Namen des Objekts Bounce (TasterGedrueckt) festlegen
Bounce TasterGedrueckt = Bounce();

int LED = 6;
int TASTER = 7;

/*
   setzt den Status
   Status true -> LED an
   Status false ->  LED aus
   beim Start soll die LED ausgeschaltet sein
*/
bool Status = false;

void setup() 
{
  pinMode(LED, OUTPUT);

  /*
    Namen des Objekts Bounce (TasterGedrueckt) dem Taster zuordnen (attach)
    Zeitintervall einstellen
    INPUT_PULLUP -> Eingangspegel auf HIGH setzen
  */
  TasterGedrueckt.attach(TASTER, INPUT_PULLUP);
  TasterGedrueckt.interval(20);
}

void loop() 
{
  // Tasterstatus abfragen
  if (TasterGedrueckt.update()) 
  {
    // Taster wurde gedrückt, das Signal ist gefallen
    if (TasterGedrueckt.fell())
    {
      // LED ist aus → Status == false
      if (Status == false) 
      {
        digitalWrite(LED, HIGH);

        // Status auf true (an) setzen
        Status = true;
      }

      // LED ist an → Status == true
      else if (Status == true) 
      {
        digitalWrite(LED, LOW);

        // Status auf false (aus) setzen
        Status = false;
      }
    }
  }
}

Mit der sel­ben Schal­tung soll die Leucht­dau­er einer LED gemes­sen werden.

Die Mes­sung star­tet, wenn der Tas­ter gedrückt wird.

// Bibliothek Bounce2 einbinden
#include "Bounce2.h"

// Bounce starten
// Namen des Objekts Bounce (TasterGedrueckt) festlegen
Bounce TasterGedrueckt = Bounce();

int LED = 7;
int TASTER = 6;

/*
   setzt den Status
   Status true -> LED an
   Status false ->  LED aus
   beim Start soll die LED ausgeschaltet sein
*/
bool Status = false;

// Startzeit wird mit millis() ermittelt
unsigned long Startzeit;

// verstrichene Zeit in Millisekunden
unsigned long VerstricheneZeit;

float Sekunden;
int Minute;

void setup() {
  pinMode(LED, OUTPUT);
  /*
    Namen des Objekts Bounce (TasterGedrueckt) dem Taster zuordnen (attach)
    Zeitintervall einstellen
    INPUT_PULLUP -> Eingangspegel auf HIGH setzen
  */
  TasterGedrueckt.attach(TASTER, INPUT_PULLUP);
  TasterGedrueckt.interval(20);
  Serial.begin(9600);
}

void loop() 
{
  // Tasterstatus abfragen
  if (TasterGedrueckt.update()) 
  {
    // Taster wurde gedrückt, das Signal ist gefallen
    if (TasterGedrueckt.fell()) 
    {
      // LED ist aus → Status == false
      if (Status == false) {
        digitalWrite(LED, HIGH);

        // Status auf true (an) setzen
        Status = true;

        // wenn Status == true -> Timer starten
        if (Status) Startzeit = millis();
      }

      // LED ist an → Status == true
      else if (Status == true) 
      {
        digitalWrite(LED, LOW);

        // Dauer des Einschaltens der LED berechnen
        VerstricheneZeit = millis() - Startzeit;
        Sekunden = VerstricheneZeit / 1000.0;
        String AnzeigeSekunden = String(Sekunden);
        AnzeigeSekunden.replace(".", ",");

        // Sekunden anzeigen
        Serial.println("Leuchtdauer: " + AnzeigeSekunden + " Sekunde(n)");

        // Minuten berechnen und anzeigen
        Minute = Sekunden / 60;
        if (Minute > 0) {
          Serial.print(" = " + String(Minute) + " Minute(n): ");
          Sekunden = Sekunden - Minute * 60;
          Serial.println(String(Sekunden) + " Sekunde(n)");
        }

        // Status auf false (aus) setzen
        Status = false;
      }
    }
  }
}

Letzte Aktualisierung: 7. Apr 2024 @ 9:00