#define LED_GREEN             2       // Grüne LED ist an GPIO 2 angeschlossen
#define LED_RED               15      // Rote LED ist an GPIO 15 angeschlossen
#define SWITCH                12      // Schalter ist an GPIO 12 angeschlossen
#define BUTTON                13      // Taster ist an GPIO 13 angeschlossen
#define TIME_DEBOUNCE         20      // Entprellzeit für Taster 20ms
#define TIME_INTERVAL         1000    // Zeitintervall für Startkommando in ms
#define TIME_COUNT            250     // Zähldauer Wert * TIME_DEBOUNCE 250 * 20ms = 5s

boolean do_once = true;               // Variable do_once vom Datentyp boolean deklarieren und mit true initialisieren 
boolean button_before = HIGH;         // Variable button_before vom Datentyp boolean deklarieren und mit HIGH initialisieren
unsigned char counter_button = 0;     // Variable counter_button vom Datentyp unsigned char deklarieren und mit 0 initialisieren
unsigned int counter_time_steps = 0;  // Variable counter_time_steps vom Datentyp unsigned int deklarieren und mit 0 initialisieren

void setup() {
  pinMode(LED_GREEN, OUTPUT);         // Grüne LED als Ausgang konfigurieren
  pinMode(LED_RED, OUTPUT);           // Rote LED als Ausgang konfigurieren
  pinMode(SWITCH, INPUT_PULLUP);      // Schalter als Eingang mit Pullup-Widerstand konfigurieren
  pinMode(BUTTON, INPUT_PULLUP);      // Taster als Eingang mit Pullup-Widerstand konfigurieren
  digitalWrite(LED_GREEN, LOW);       // Ausgang für grüne LED definieren => soll nicht leuchten
  digitalWrite(LED_RED, HIGH);        // Ausgang für rote LED definieren => soll leuchten (noch keine Freigabe)

  // Serielle Schnittstelle konfigurieren und Titel ausgeben
  Serial.begin(115200);               // Übertragungsgeschwindigkeit für Serial Monitor
  Serial.println("Projekt: Frag mal einen Schalter und einen Taster ab");
  Serial.println("----------------------------------------------------");

  // Startkommando ausgeben => Text auf Bildschirm und bei los rote LED aus- und grüne LED einschalten
  Serial.print("Auf die Plätze ... ");
  delay(TIME_INTERVAL);
  Serial.print("fertig ... ");
  delay(TIME_INTERVAL);
  Serial.println("los ");
  digitalWrite(LED_GREEN, HIGH);
  digitalWrite(LED_RED, LOW);
}

void loop() {
  // Tasterbetätigungen zählen solange Zeit nicht abgelaufen ist
  while (counter_time_steps < TIME_COUNT) {

    // Feststellen, wenn Taster gedrückt wird und Zähler um 1 erhöhen
    if ((digitalRead(BUTTON) == LOW) && (button_before == HIGH)) {
      button_before = LOW;
      counter_button = counter_button + 1;
    }
    // Feststellen, wenn Taster losgelassen wird
    if ((digitalRead(BUTTON) == HIGH) && (button_before == LOW)) {
      button_before = HIGH;
    }
    delay(TIME_DEBOUNCE);
    counter_time_steps++;
  }

  // Die Zeit ist abgelaufen => LED-Anzeige einmal aktualisieren und Zählwert ausgeben
  if (do_once == true) {
    do_once = false;
    digitalWrite(LED_GREEN, LOW);
    digitalWrite(LED_RED, HIGH);
    Serial.print("Du hast den Taster ");
    Serial.print(counter_button);
    Serial.println(" Mal betätigt");
  }
}