Stopp­uhr

# include "LCDIC2.h"
# include "OneButton.h"

LCDIC2 lcd(0x27, 20, 4);

int TASTER = 7;

// Name des Tasters
OneButton NameTaster(TASTER, true);

// Variablen der Zeit
float StartZeit;
float VerstricheneZeit;
float Sekunden;

int AnzahlRunden = 1;

// muss als Konstante definiert werden 
// -> Größe des Arrays darf nicht gändert werden
const int RundenMax = 5;

// Array Runden
String RundenZeit[RundenMax];

// TasterStatus sorgt für Start/Neustart
bool TasterStatus = true;

bool Neustart = false;

void setup()
{
  lcd.begin();

  // Cursor "verstecken"
  lcd.setCursor(false);
  lcd.setCursor(0, 0);
  lcd.print("Taste -> Start");
  lcd.setCursor(0, 1);
  lcd.print("--------------------");

  // Aktionen dem Modus des Tasters zuordnen
  NameTaster.attachClick(einKlick);
  NameTaster.attachDoubleClick(DoppelKlick);
  NameTaster.attachLongPressStop(langerDruckStopp);

  /*
    Anzahl der Millisekunden festlegen
    Standardwerte gesetzt:
    PressTicks: 1000
    ClickTicks: 600
    DebounceTicks: 50
    wenn die Standardwerte gesetzt werden sollen
    können die nächsten Zeilen auskommentiert werden
  */
  NameTaster.setPressTicks(1000);
  NameTaster.setClickTicks(500);
  NameTaster.setDebounceTicks(50);
}

void loop()
{
  // Taster alle 10 Millisekunden abfragen
  NameTaster.tick();
  delay(10);
}

void einKlick()
{
  if (TasterStatus)
  {
    // beim Neustart Variablen auf Standard zurücksetzen
    // Rundenzeiten löschen
    if (Neustart)
    {
      AnzahlRunden = 1;

      // String leeren
      for (int i = 1; i < RundenMax; i ++)
      {
        RundenZeit[i] = "";
      }
      Neustart = false;
    }
    StartZeit = millis();
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Runde: " + String(AnzahlRunden));
    lcd.setCursor(0, 1);
    lcd.print("Taste -> Stopp");
  }
  else
  {
    // Zeit berechnen
    float Sekunden;
    VerstricheneZeit = millis() - StartZeit;
    Sekunden = VerstricheneZeit / 1000;

    // Sekunden in String umwandeln
    // damit . durch , ersetzt werden kann
    String AnzahlSekunden = String(Sekunden);

    // . durch , ersetzen
    AnzahlSekunden.replace(".", ",");

    // Ausgabe LCD
    lcd.clear();
    lcd.print("Runde: " + String(AnzahlRunden));

    lcd.setCursor(0, 1);
    lcd.print("Weiter -> Taste");

    lcd.setCursor(0, 3);
    lcd.print(AnzahlSekunden + " Sekunden");

    // letzte Runde -> Ergebnis anzeigen
    if (AnzahlRunden == RundenMax - 1)
    {
      RundenZeit[AnzahlRunden] = AnzahlSekunden;
      lcd.clear();
      Neustart = true;
      DoppelKlick();
    }
    else
    {
      RundenZeit[AnzahlRunden] = AnzahlSekunden;
      AnzahlRunden ++;
    }
  }

  // Tasterstatus umkehren
  TasterStatus = !TasterStatus;
}

void DoppelKlick()
{
  lcd.clear();
  int Zeile = 0;
  for (int i = 1; i <= RundenMax - 1; i ++)
  {
    lcd.setCursor(0, Zeile);
    if (RundenZeit[i] != "") lcd.print(String(i) + ": " + RundenZeit[i] + " Sekunden");
    Zeile ++;

    // Serieller Monitor
    if (RundenZeit[i] != "") Serial.println(String(i) + ": " + RundenZeit[i] + " Sekunden");

  }
}

void langerDruckStopp()
{
  AnzahlRunden = 1;
  TasterStatus = true;
  Neustart = true;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Neustart: Runde 1");
}

Letzte Aktualisierung: 2. Aug 2023 @ 8:30