Laplace-Ver­such

// Start mit 10 Durchläufen
double MaxDurchlauf = 10;

// statistische Wahrscheinlichkeit eine bestimmte Zahl zu wuerfeln
const double StatistischeWahrscheinlichkeit = 16.67;
String Leerzeichen;

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  Serial.println("Laplace-Versuch");
  Serial.println("s -> Start");
  Serial.println("-----------------------------------------");
  randomSeed(analogRead(A0));
}

void loop()
{
  // alle Variablen 0 setzen
  int Durchlauf = 0;
  int AnzahlEins = 0;
  int AnzahlZwei = 0;
  int AnzahlDrei = 0;
  int AnzahlVier = 0;
  int AnzahlFuenf = 0;
  int AnzahlSechs = 0;

  // Zahlen von 1 bis 6
  int Minimum = 1;
  int Maximum = 7;

  String AnzahlFormat;
  String AbweichungFormat;
  double Abweichung;
  String Zeichen;

  while (Serial.available() > 0)
  {
    // Eingabe im Seriellen Monitor lesen
    char Eingabe = Serial.read();

    // Enter/Senden gedrückt
    if (Eingabe == 's')
    {
      Serial.println("Anzahl der W\u00fcrfe: " + String(MaxDurchlauf));
      Serial.println("------------------------------------------------------------------");

      while (Durchlauf < MaxDurchlauf)
      {
        int Zahl = ZufallsZahl(Minimum, Maximum);

        // Anzahl der Wuerfe speichern
        if (Zahl == 1) AnzahlEins ++;
        if (Zahl == 2) AnzahlZwei ++;
        if (Zahl == 3) AnzahlDrei ++;
        if (Zahl == 4) AnzahlVier ++;
        if (Zahl == 5) AnzahlFuenf ++;
        if (Zahl == 6) AnzahlSechs ++;

        Durchlauf ++;
      }

      // Ergebnis berechnen und formatieren
      // 1
      /*
        Anzahl Leerzeichen ergaenzen
        < 10 -> 3 Leerzeichen
        > 10 und < 100 -> 2 Leerzeichen
        > 100 kein Leerzeichens
        > 10.000 nicht möglich, maximale Durchlaeufe = 20.000
      */
      Leerzeichen = "";

      if (AnzahlEins < 10) Leerzeichen = "  ";
      if (AnzahlEins < 100 && AnzahlEins > 9) Leerzeichen = " ";

      // % berechnen und als String formatieren
      AnzahlFormat = String(AnzahlEins / MaxDurchlauf * 100);

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

      // wenn %-Wert < 10 -> Leerzeichen ergaenzen
      if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;

      // Abweichung von der zu erwartenden Wahrscheinlichkeit in % berechnen
      Abweichung = StatistischeWahrscheinlichkeit - AnzahlEins / MaxDurchlauf * 100;

      /*
        die Berechnung der Abweichung hat als Ergebnis eine negative Zahl, wenn
        das Ergebnis nach oben von 16,67 abweicht und eine positive Zahl, wenn das Ergebnis
        unten abweicht
        die Abweichung soll so formatiert werden, dass
        -  die Differenz von einem niedrigen Wert als 16,67 bis 16,67
           mit dem Vorzeichen - angezeigt wird
        -  die die Differenz von einem höheren Wert als 16,67 bis 16,67
           mit dem Vorzeichen + angezeigt wird
      */
      if (AnzahlEins / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
      {
        /*
          %-Wert < 16.67
          Wert für Abweichung soll negativ werden
          Vorzeichen - char(43) setzen
        */
        Abweichung = Abweichung * - 1;
        Zeichen = char(43);
      }

      // %-Wert > 16,67 -> Vorzeichen + char(45) setzen
      else Zeichen = char(45);

      // Abweichung in String umwandeln und . durch , ersetzen
      AbweichungFormat = String(Abweichung);
      AbweichungFormat.replace(".", ",");

      // wenn Wert < 10 -> Leerzeichen ergaenzen
      if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";

      // Ergebnis anzeigen mit \t = Tabulator formatieren
      Serial.print("Anzahl 1: \t" + Leerzeichen + String(AnzahlEins));
      Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
      Serial.println(Zeichen + AbweichungFormat + "%");
      
      // 2
      Leerzeichen = "";
      if (AnzahlZwei < 10) Leerzeichen = "  ";
      if (AnzahlZwei < 100 && AnzahlZwei > 9) Leerzeichen = " ";
      AnzahlFormat = String(AnzahlZwei / MaxDurchlauf * 100);
      AnzahlFormat.replace(".", ",");
      if (AnzahlFormat.length() < 2) AnzahlFormat = AnzahlFormat + " ";

      if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;
      Abweichung = StatistischeWahrscheinlichkeit - AnzahlZwei / MaxDurchlauf * 100;

      if (AnzahlZwei / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
      {
        Abweichung = Abweichung * - 1;
        Zeichen = char(43);
      }
      else Zeichen = char(45);
      AbweichungFormat = String(Abweichung);
      AbweichungFormat.replace(".", ",");
      if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
      Serial.print("Anzahl 2: \t" + Leerzeichen + String(AnzahlZwei));
      Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
      Serial.println(Zeichen + AbweichungFormat + "%");
      
      // 3
      Leerzeichen = "";

      if (AnzahlDrei < 10) Leerzeichen = "  ";
      if (AnzahlDrei < 100 && AnzahlDrei > 9) Leerzeichen = " ";
      AnzahlFormat = String(AnzahlDrei / MaxDurchlauf * 100);
      AnzahlFormat.replace(".", ",");
      Abweichung = StatistischeWahrscheinlichkeit - AnzahlDrei / MaxDurchlauf * 100;

      if (AnzahlDrei / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
      {
        Abweichung = Abweichung * - 1;
        Zeichen = char(43);
      }
      else Zeichen = char(45);
      AbweichungFormat = String(Abweichung);
      AbweichungFormat.replace(".", ",");
      if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
      Serial.print("Anzahl 3: \t" + Leerzeichen + String(AnzahlDrei));
      Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
      Serial.println(Zeichen + AbweichungFormat + "%");
      
      // 4
      Leerzeichen = "";

      if (AnzahlVier < 10) Leerzeichen = "  ";
      if (AnzahlVier < 100 && AnzahlVier > 9) Leerzeichen = " ";

      AnzahlFormat = String(AnzahlVier / MaxDurchlauf * 100);
      AnzahlFormat.replace(".", ",");

      if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;
      Abweichung = StatistischeWahrscheinlichkeit - AnzahlVier / MaxDurchlauf * 100;

      if (AnzahlVier / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
      {
        Abweichung = Abweichung * - 1;
        Zeichen = char(43);
      }
      else Zeichen = char(45);
      AbweichungFormat = String(Abweichung);
      AbweichungFormat.replace(".", ",");
      if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
      Serial.print("Anzahl 4: \t" + Leerzeichen + String(AnzahlVier));
      Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
      Serial.println(Zeichen + AbweichungFormat + "%");
      
      // 5
      Leerzeichen = "";
      if (AnzahlFuenf < 10) Leerzeichen = "  ";
      if (AnzahlFuenf < 100 && AnzahlFuenf > 9) Leerzeichen = " ";

      AnzahlFormat = String(AnzahlFuenf / MaxDurchlauf * 100);
      AnzahlFormat.replace(".", ",");

      if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;
      Abweichung = StatistischeWahrscheinlichkeit - AnzahlFuenf / MaxDurchlauf * 100;

      if (AnzahlFuenf / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
      {
        Abweichung = Abweichung * - 1;
        Zeichen = char(43);
      }
      else Zeichen = char(45);
      AbweichungFormat = String(Abweichung);
      AbweichungFormat.replace(".", ",");
      if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
      Serial.print("Anzahl 5: \t" + Leerzeichen + String(AnzahlFuenf));
      Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
      Serial.println(Zeichen + AbweichungFormat + "%");
      
      // 6
      Leerzeichen = "";

      if (AnzahlSechs < 10) Leerzeichen = "  ";
      if (AnzahlSechs < 100 && AnzahlSechs > 9) Leerzeichen = " ";

      AnzahlFormat = String(AnzahlSechs / MaxDurchlauf * 100);
      AnzahlFormat.replace(".", ",");
      if (AnzahlFormat.length() < 5) AnzahlFormat = " " + AnzahlFormat;

      Abweichung = StatistischeWahrscheinlichkeit - AnzahlSechs / MaxDurchlauf * 100;

      if (AnzahlSechs / MaxDurchlauf * 100 - StatistischeWahrscheinlichkeit > 0)
      {
        Abweichung = Abweichung * - 1;
        Zeichen = char(43);
      }
      else Zeichen = char(45);
      AbweichungFormat = String(Abweichung);
      AbweichungFormat.replace(".", ",");
      if (AbweichungFormat.length() < 5) Zeichen = Zeichen + " ";
      Serial.print("Anzahl 6: \t" + Leerzeichen + String(AnzahlSechs));
      Serial.print("\t-> " + AnzahlFormat + "%" + "\t-> Abweichung ");
      Serial.println(Zeichen + AbweichungFormat + "%");
      Serial.println("------------------------------------------------------------------");

      if (MaxDurchlauf < 20000) MaxDurchlauf = MaxDurchlauf * 2;
      else MaxDurchlauf = 10;
    }
  }
}

int ZufallsZahl(int Minimum, int Maximum)
{
  int Zahl =  random(Minimum, Maximum);
  return Zahl;
}

Letzte Aktualisierung: Wei­ter lesen ...

Schne­cken­ren­nen

Solo­rennen

// Anzahl der Schritte Minimum/Maximum
int Minimum = 1;
int Maximum = 4;

// Schritte bis zum Ziel
int Ziel = 10;

int BisherigeSchritte = 0;
int Schritte = 0;

long Start;

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  // Info über das Spiel
  Serial.println("Schneckenrennen");
  Serial.println("-------------------------------------------");

  // \n = neue Zeile
  Serial.println("Ziel: " + String(Ziel));
  Serial.println("-------------------------------------------");

  // Zufallsgenerator starten
  randomSeed(analogRead(A0));

  // Zeitmessung starten
  Start = millis();
}

void loop()
{
  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // Eingabe im Seriellen Monitor lesen
    char Zeichen = Serial.read();

    // Enter/Senden gedrückt
    if (Zeichen == '\n')
    {
      // Anzahl der Schritte zufällig ermitteln
      Schritte = ZufallsZahl(Minimum, Maximum);

      // Summe der Schritte berechnen
      BisherigeSchritte = BisherigeSchritte + Schritte;

      // Aufruf der Methode Bildschirmausgabe
      Bildschirmausgabe(BisherigeSchritte);

      if (BisherigeSchritte > Ziel)
      {
        Serial.println("Ziel erreicht!");

        // Zeit berechnen
        int Sekunden;
        long VerstricheneZeit = millis() - Start;
        Sekunden = int(VerstricheneZeit / 1000);
        Serial.println("Zeit: " + String(Sekunden) + " Sekunden");

        // Variablen zurücksetzen
        BisherigeSchritte = 0;
        Start = millis();
      }
    }
  }
}

int ZufallsZahl(int Minimum, int Maximum)
{
  int Zahl =  random(Minimum, Maximum);
  return Zahl;
}

void Bildschirmausgabe(int AnzahlSchritte)
{
  // entsprechend der Anzahl der Schritte Zeichen anzeigen
  for (int i = 0; i < AnzahlSchritte; i ++)
  {
    Serial.print("► ");
  }
  Serial.println("(" + String(AnzahlSchritte) + ")");

}

Zwei Schne­cken

// Anzahl der Schritte Minimum/Maximum
int Minimum = 1;
int Maximum = 4;

// Schritte bis zum Ziel
int Ziel = 10;

int Schritte = 0;
int Runde = 1;

// wenn Neustart = true -> Variable zurücksetzen
bool Neustart = false;

/*
  Arrays für die Schnecken
  BisherigeSchritte[] -> Anzahl zurückgelegter Schritte
  Schnecke[] -> Namen der Schnecken
  SchrittZeichen[] -> Zeichen für die zurückgelegten Schritte
  es können (fast) beliebige Zeichen verwendet werden
*/
int BisherigeSchritte[2];
String Schnecke[2] = {"Lisa", "Karl"};
String SchrittZeichen[2] = {"> ", "+ "};

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  // Info über das Spiel
  Serial.println("Schneckenrennen");
  Serial.println("Schnecken: " + Schnecke[0] + " und " + Schnecke[1]);
  Serial.println("Ziel: " + String(Ziel));
  Serial.println("Tasten:\nw -> weiter\nn -> Neustart");
  Serial.println("-------------------------------------------");

  // Zufallsgenerator starten
  randomSeed(analogRead(A0));
}

void loop()
{
  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // Eingabe im Seriellen Monitor lesen
    char Zeichen = Serial.read();

    // Enter/Senden gedrückt
    if (Zeichen == 'n')
    {
      Neustart = true;
    }

    if (Zeichen == 'w')
    {
      // beim Neustart -> alle Variable zurücksetzen
      if (Neustart)
      {
        BisherigeSchritte[0] = 0;
        BisherigeSchritte[1] = 0;
        Runde = 1;
        Neustart = false;
      }

      Serial.println("Runde " + String(Runde));

      // Schnecke 1
      // Anzahl der Schritte zufällig ermitteln
      Schritte = ZufallsZahl(Minimum, Maximum);

      // Summe der Schritte berechnen
      BisherigeSchritte[0] = BisherigeSchritte[0] + Schritte;

      /*
        Variabeln an die Funktion Bildschirmausgabe übergeben
        Name der Schnecke, Summe der Schritte, Zeichen für die zurückgelegten Schritte
        für das erste Element [0] -> die erste Schnecke
      */
      Bildschirmausgabe(Schnecke[0], BisherigeSchritte[0], SchrittZeichen[0]);

      /*
        Variabeln an die Funktion Bildschirmausgabe übergeben
        Name der Schnecke, Summe der Schritte, Zeichen für die zurückgelegten Schritte
        für das zweite Element [1] -> die zweite Schnecke
      */
      Schritte = ZufallsZahl(Minimum, Maximum);
      BisherigeSchritte[1] = BisherigeSchritte[1] + Schritte;
      Bildschirmausgabe(Schnecke[1], BisherigeSchritte[1], SchrittZeichen[1]);

      Serial.println("-------------------------------------------");

      // Runde hochzählen
      Runde ++;

      // Sieger Schnecke 1
      if (BisherigeSchritte[0] > Ziel)
      {
        if (BisherigeSchritte[0] > BisherigeSchritte[1])
        {
          Serial.println(Schnecke[0] + " hat gewonnen!");
          Neustart = true;
        }
      }

      // Sieger Schnecke 2
      if (BisherigeSchritte[1] > Ziel)
      {
        if (BisherigeSchritte[0] < BisherigeSchritte[1])
        {
          Serial.println(Schnecke[1] + " hat gewonnen!");
          Neustart = true;
        }
      }

      // unentschieden
      if (BisherigeSchritte[0] > Ziel && BisherigeSchritte[1] > Ziel)
      {
        if (BisherigeSchritte[0] == BisherigeSchritte[1])
        {
          Serial.println("Unentschieden!");
          Neustart = true;
        }
      }
    }
  }
}

int ZufallsZahl(int Minimum, int Maximum)
{
  int Zahl =  random(Minimum, Maximum);
  return Zahl;
}

void Bildschirmausgabe(String Name, int Schritte, String SchrittZeichen)
{
  // Name der Schnecke und Anzahl der Schritte anzeigen
  Serial.println(Name + " " + String(Schritte));

  // entsprechend der Anzahl der Schritte Zeichen anzeigen
  for (int i = 0; i < Schritte; i ++)
  {
    Serial.print(SchrittZeichen);
  }

  // mit Leerzeichen auffüllen und Ziel anzeigen
  if (Schritte <= Ziel)
  {
    for (int i = Schritte; i < Ziel; i ++)
    {
      Serial.print("  ");
    }
    Serial.print("| Ziel");
  }
  Serial.println();
}

Drei Schne­cken

// Anzahl der Schritte Minimum/Maximum
int Minimum = 1;
int Maximum = 4;

// Schritte bis zum Ziel
int Ziel = 10;

int Schritte = 0;
int Runde = 1;
bool Neustart = false;

/*
  Arrays für die Schnecken
  BisherigeSchritte[] -> Anzahl zurückgelegter Schritte
  Schnecke[] -> Namen der Schnecken
  SchrittZeichen[] -> Zeichen für die zurückgelegten Schritte
*/
int BisherigeSchritte[3];
String Schnecke[3] = {"Lisa", "Karl", "Maria"};
String SchrittZeichen[3] = {"● ", "► ", "█ "};

void setup()
{
  Serial.begin(9600);

  // Info über das Spiel
  Serial.println("Schneckenrennen");
  Serial.println("Schnecken: " + Schnecke[0] + ", " + Schnecke[1] + " und " + Schnecke[2]);
  Serial.println("Ziel: " + String(Ziel));
  Serial.println("Tasten:\nw -> weiter\nn -> Neustart");
  Serial.println("-------------------------------------------");

  // Zufallsgenerator starten
  randomSeed(analogRead(A0));
}

void loop()
{
  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // Eingabe im Seriellen Monitor lesen
    char Zeichen = Serial.read();

    // Enter/Senden gedrückt
    if (Zeichen == 'n')
    {
      Neustart = true;
    }

    if (Zeichen == 'w')
    {
      // beim Neustart -> alle Variable zurücksetzen
      if (Neustart)
      {
        BisherigeSchritte[0] = 0;
        BisherigeSchritte[1] = 0;
        BisherigeSchritte[2] = 0;
        Runde = 1;
        Neustart = false;
      }

      Serial.println("Runde " + String(Runde));

      // Schnecke 1
      // Anzahl der Schritte zufällig ermitteln
      Schritte = ZufallsZahl(Minimum, Maximum);

      // Summe der Schritte berechnen
      BisherigeSchritte[0] = BisherigeSchritte[0] + Schritte;

      /*
        Variabeln an die Methode Bildschirmausgabe übergeben
        Name der Schnecke, Summe der Schritte, Zeichen für die zurückgelegten
        Schritte
        für das erste Element [0] -> die erste Schnecke
      */
      Bildschirmausgabe(Schnecke[0], BisherigeSchritte[0], SchrittZeichen[0]);

      // Schnecke3
      Schritte = ZufallsZahl(Minimum, Maximum);

      BisherigeSchritte[1] = BisherigeSchritte[1] + Schritte;
      Bildschirmausgabe(Schnecke[1], BisherigeSchritte[1], SchrittZeichen[1]);

      // Schnecke 3
      Schritte = ZufallsZahl(Minimum, Maximum);

      BisherigeSchritte[2] = BisherigeSchritte[2] + Schritte;
      Bildschirmausgabe(Schnecke[2], BisherigeSchritte[2], SchrittZeichen[2]);

      Serial.println("-------------------------------------------");

      // Runde hochzählen
      Runde ++;

      // Sieger Schnecke 1
      if (BisherigeSchritte[0] > Ziel)
      {
        if (BisherigeSchritte[0] > BisherigeSchritte[1] && BisherigeSchritte[0] > BisherigeSchritte[2])
        {
          Serial.println(Schnecke[0] + " hat gewonnen!");
          Neustart = true;
        }
      }

      // Sieger Schnecke 2
      if (BisherigeSchritte[1] > Ziel)
      {
        if (BisherigeSchritte[1] > BisherigeSchritte[0] && BisherigeSchritte[1] > BisherigeSchritte[2])
        {
          Serial.println(Schnecke[1] + " hat gewonnen!");
          Neustart = true;
        }
      }

      // Sieger Schnecke 3
      if (BisherigeSchritte[2] > Ziel)
      {
        if (BisherigeSchritte[2] > BisherigeSchritte[0] && BisherigeSchritte[2] > BisherigeSchritte[1])
        {
          Serial.println(Schnecke[2] + " hat gewonnen!");
          Neustart = true;
        }
      }

      // unentschieden alle Schnecken haben das Ziel überschritten
      if (BisherigeSchritte[0] > Ziel && BisherigeSchritte[1] > Ziel && BisherigeSchritte[2] > Ziel)
      {
        // alle Schnecken haben die gleiche Anzahl Schritte
        if (BisherigeSchritte[0] == BisherigeSchritte[1] == BisherigeSchritte[2])
        {
          Serial.println("Unentschieden!");
          Neustart = true;
        }
      }
    }
  }
}

int ZufallsZahl(int Minimum, int Maximum)
{
  int Zahl =  random(Minimum, Maximum);
  return Zahl;
}

void Bildschirmausgabe(String Name, int Schritte, String SchrittZeichen)
{
  // Name der Schnecke und Anzahl der Schritte anzeigen
  Serial.println(Name + " " + String(Schritte));

  // entsprechend der Anzahl der Schritte Zeichen anzeigen
  for (int i = 0; i < Schritte; i ++)
  {
    Serial.print(SchrittZeichen);
  }

  // mit Leerzeichen auffüllen und Ziel anzeigen
  if (Schritte <= Ziel)
  {
    for (int i = Schritte; i < Ziel; i ++)
    {
      Serial.print("  ");
    }
    Serial.print("| Ziel");
  }
  Serial.println();
}

Letzte Aktualisierung: Wei­ter lesen ...

Lauf­licht mit Drehgeber

// Array mit 5 Elementen und den zugehörigen Pins
byte LED[5] = {3, 4, 5, 6, 7};

// Anzahl der LEDs feststellen
byte LEDMax = sizeof(LED);

// Interruptpin
# define EncoderPinA 2
# define EncoderPinB 8

// Leuchtdauer beim Start: 100 Millisekunden
volatile unsigned int Leuchtdauer = 100;

// Sprung in Schritten, wenn eine Bewegung erkannt wird
int SprungSchritte = 10;

void setup()
{
  Serial.begin(9600);
  for (int i = 0; i < LEDMax; i++)
  {
    pinMode(LED[i], OUTPUT);
  }
  pinMode(EncoderPinA, INPUT_PULLUP);
  pinMode(EncoderPinB, INPUT_PULLUP);

  // Interrupt-Pin EncoderPinA zuordnen
  attachInterrupt(digitalPinToInterrupt(EncoderPinA), DrehgeberLesen, CHANGE);
}

void loop()
{
  // Lauflicht starten
  for (int i = 0; i < LEDMax; i ++)
  {
    Lauflicht();
  }
}

void DrehgeberLesen()
{
  /*
    wenn beide Drehgeber-Pins gleich sind -> Bewegung vorwärts
    sind sie unterschiedlich -> Bewegung rückwärts.
    Drehung nach links -> Leuchtdauer vergrößern
    Drehung nach rechts -> Leuchtdauer verkleinern
  */
  if (digitalRead(EncoderPinA) == digitalRead(EncoderPinB))
  {
    Leuchtdauer += SprungSchritte;
  }
  else Leuchtdauer -= SprungSchritte;
  if (Leuchtdauer < 100) Leuchtdauer = 100;
}

void Lauflicht()
{
  for (int i = 0; i < LEDMax; i++)
  {
    // aktuelle LED i einschalten
    digitalWrite(LED[i], HIGH);
    delay(Leuchtdauer);
    digitalWrite(LED[i], LOW);
  }
}

Letzte Aktualisierung: Wei­ter lesen ...

LEDs ohne Puls­wei­ten­mo­du­la­ti­on dimmen

# include "SoftPWM.h"

// Array mit 5 Elementen und den zugehörigen Ports
byte LED[5] = {3, 4, 5, 6, 7};

// Anzahl der LEDs feststellen
byte LEDMax = sizeof(LED);

void setup()
{
  // SoftPWM starten
  SoftPWMBegin();
  for (int i = 0; i < LEDMax; i++)
  {
    // Status aus für jede LED setzen
    SoftPWMSet(LED[i], 0);

    /*
      Dimmzeiten setzen:
      Parameter LED, Auf-Dimmen (in Millisekunden), Ab-Dimmen (in Millisekunden)
      Dimmzeiten müssen mit der Wartezeit übereinstimmen
    */
    SoftPWMSetFadeTime(LED[i], 400, 400);
  }
}

void loop()
{
  for (int i = 0; i < LEDMax; i++)
  {
    // aktuelle LED einschalten und dimmen
    SoftPWMSet(LED[i], 255);

    // Wartezeit muss mit den Dimmzeiten übereinstimmen
    delay(400);

    // aktuelle LED ausschalten
    SoftPWMSet(LED[i], 0);

    // Wartezeit vor der nächsten LED
    delay(100);
  }
}

Letzte Aktualisierung: Wei­ter lesen ...

Knif­fel

# include "EEPROM.h"

byte Zufallszahl;
byte MaxWuerfeln = 5;
int Minumum = 1;
int Maximum = 7;
int TASTER = 12;
int TasterLesen;

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}
  pinMode(TASTER, INPUT_PULLUP);
  randomSeed(analogRead(A0));

  /*
    Überblick Statistik
    Speicherstelle EEPROM
    0 -> Anzahl der Spiele
    1 -> Anzahl Dreierpasch
    2 -> Anzahl Vierpasch
    3 -> Anzahl Kniffel
  */
  Serial.print("Anzahl bisheriger Spiele: ");
  Serial.println(EEPROM[0]);
  Serial.print("Anzahl Dreierpasch: ");
  Serial.println(EEPROM[1]);
  Serial.print("Anzahl Viererpasch: ");
  Serial.println(EEPROM[2]);
  Serial.print("Anzahl Kniffel: ");
  Serial.println(EEPROM[3]);
  
  /*
    Statistik in %
    für die Division muss der ausgelesene Wert nach float umgewandelt werden
    nur rechnen, wenn AnzahlSpiele &gt; 0 (durch 0 kann nicht geteilt werden)
  */
  if (EEPROM[0] > 0)
  {
    Serial.println("-----------------------------");
    Serial.print("Anzahl bisheriger Spiele: ");
    Serial.println(EEPROM[0]);
    
    // Anzahl der bisherigen Dreier- Vierpasch und Kniffel anzeigen
    Serial.print("Anzahl Dreierpasch: ");
    Serial.print(EEPROM[1]);
    Serial.print("  ");
    
    String PaschDrei = String(float(EEPROM[1]) / float(EEPROM[0]) * 100);
    PaschDrei.replace(".", ",");
    Serial.println(PaschDrei + " %");
    Serial.print("Anzahl Viererpasch: ");
    Serial.print(EEPROM[2]);
    Serial.print("  ");
    
    String PaschVier = String(float(EEPROM[2]) / float(EEPROM[0]) * 100);
    PaschVier.replace(".", ",");
    Serial.println(PaschVier + " %");
    Serial.print("Anzahl Kniffel: ");
    Serial.print(EEPROM[3]);
    Serial.print("  ");
    
    String KniffelAnzahl = String(float(EEPROM[3]) / float(EEPROM[0]) * 100);
    KniffelAnzahl.replace(".", ",");
    Serial.println(KniffelAnzahl + " %");
  }

  /*
    Abfrage ob die bisherigen Daten aus dem EEPROM gelöscht werden sollen
    Umlaute ersetzen:
    ö -> \u00f6
    ü -> \u00fc
  */
  Serial.println("---------------------------------------");
  Serial.println("Bisherige Statistik l\u00f6schen (j/n)?");
  Serial.println("---------------------------------------");
}

void loop()
{
  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // solange lesen, bis return \n eingegeben wurde
    String Eingabe = Serial.readStringUntil('\n');
    
    // das letzte Zeichen ist return = \n → soll entfernt werden (-1)
    Eingabe = Eingabe.substring(0, Eingabe.length() - 1);
    
    // die ersten 5 Speicherstellen mit 0 überschreiben
    if (Eingabe == "j")
    {
      for (int i = 0; i < 5; ++i)
      {
        EEPROM.write(i, 0);
      }
      Serial.println("Statistik gel\u00f6scht!");
    }
    else Serial.println("Statistik bleibt erhalten!");
    Serial.println("Bitte zum W\u00fcrfeln Taster dr\u00fccken!");
  }
  
  // alle Werte zurücksetzen
  byte Summe = 0;
  int AnzahlEins = 0;
  int AnzahlZwei = 0;
  int AnzahlDrei = 0;
  int AnzahlVier = 0;
  int AnzahlFuenf = 0;
  int AnzahlSechs = 0;
  
  // Werte aus EEPROM lesen
  byte AnzahlSpiele = EEPROM[0];
  byte DreierPasch = EEPROM[1];
  byte ViererPasch = EEPROM[2];
  byte Kniffel = EEPROM[3];
  
  if (AnzahlSpiele < EEPROM.length())
  {
    TasterLesen = digitalRead(TASTER);
    delay(200);
    if (TasterLesen == LOW)
    {
      AnzahlSpiele ++;
      Serial.println("W\u00fcrfele ...");
      for (int i = 0; i  < MaxWuerfeln; i++)
      {
        Zufallszahl = random(Minumum, Maximum);
        // Anzahl der einsen, zweien ... zählen
        // wird für die Auswertung benötigt
        switch (Zufallszahl)
        {
          case 1:
            AnzahlEins ++;
            break;
          case 2:
            AnzahlZwei ++;
            break;
          case 3:
            AnzahlDrei ++;
            break;
          case 4:
            AnzahlVier ++;
            break;
          case 5:
            AnzahlFuenf ++;
            break;
          case 6:
            AnzahlSechs ++;
            break;
        }
        Serial.println(Zufallszahl);
        
        // Summe berechnen
        Summe += Zufallszahl;
      }
      
      // Summe anzeigen
      Serial.println("-----------------------------");
      Serial.print("Summe:  ");
      Serial.println(Summe);
      
      /*
        Auswertung Dreierpasch
        Anzahl wird um 1 erhöht und in die Speicherstelle 1 geschrieben
      */
      if (AnzahlEins == 3)
      {
        Serial.println("Dreierpasch 1");
        DreierPasch ++;
        EEPROM.update(1, DreierPasch);
      }
      if (AnzahlZwei == 3)
      {
        Serial.println("Dreierpasch 2");
        DreierPasch ++;
        EEPROM.update(1, DreierPasch);
      }
      if (AnzahlDrei == 3)
      {
        Serial.println("Dreierpasch 3");
        DreierPasch ++;
        EEPROM.update(1, DreierPasch);
      }
      if (AnzahlVier == 3)
      {
        Serial.println("Dreierpasch 4");
        DreierPasch ++;
        EEPROM.update(1, DreierPasch);
      }
      if (AnzahlFuenf == 3)     {
        Serial.println("Dreierpasch 5");
        DreierPasch ++;
        EEPROM.update(1, DreierPasch);
      }
      if (AnzahlSechs == 3)
      {
        Serial.println("Dreierpasch 6");
        DreierPasch ++;
        EEPROM.update(1, DreierPasch);
      }
      
      /*
        Auswertung Viererpasch
        Anzahl wird um 1 erhöht und in die Speicherstelle 2 geschrieben
      */
      if (AnzahlEins == 4)
      {
        Serial.println("Viererpasch 1");
        ViererPasch ++;
        EEPROM.update(2, ViererPasch);
      }
      if (AnzahlZwei == 4)
      {
        Serial.println("Viererpasch 2");
        ViererPasch ++;
        EEPROM.update(2, ViererPasch);
      }
      if (AnzahlDrei == 4)
      {
        Serial.println("Viererpasch 3");
        ViererPasch ++;
        EEPROM.update(2, ViererPasch);
      }
      if (AnzahlVier == 4)
      {
        Serial.println("Viererpasch 4");
        ViererPasch ++;
        EEPROM.update(2, ViererPasch);
      }
      if (AnzahlFuenf == 4)
      {
        Serial.println("Viererpasch 5");
        ViererPasch ++;
        EEPROM.update(2, ViererPasch);
      }
      if (AnzahlSechs == 4)
      {
        Serial.println("Viererpasch 6");
        ViererPasch ++;
        EEPROM.update(2, ViererPasch);
      }
      
      /*
        Auswertung Kniffel
        wenn AnzahlEins == 5 oder (||) AnzahlZwei = 5 ...
        keine Auswertung mit welcher Zahl der Kniffel gewürfelt wurde
        Anzahl wird um 1 erhöht und in die Speicherstelle 2 geschrieben
      */
      if (AnzahlEins == 5 || AnzahlZwei == 5 || AnzahlDrei == 5 || AnzahlVier == 5 || AnzahlFuenf == 5 || AnzahlSechs == 5)
      {
        Serial.println("Kniffel");
        Kniffel ++;
        EEPROM.update(3, Kniffel);
      }
      
      // Anzahl der Spiele in Speicherstelle 0 schreiben und anzeigen
      EEPROM.update(0, AnzahlSpiele);
      Serial.println("-----------------------------");
      Serial.print("Anzahl bisheriger Spiele: ");
      Serial.println(EEPROM[0]);
      
      // Anzahl der bisherigen Dreier- Vierpasch und Kniffel anzeigen
      Serial.print("Anzahl Dreierpasch: ");
      Serial.print(EEPROM[1]);
      Serial.print("  ");
      
      String PaschDrei = String(float(EEPROM[1]) / float(EEPROM[0]) * 100);
      PaschDrei.replace(".", ",");
      Serial.println(PaschDrei + " %");
      Serial.print("Anzahl Viererpasch: ");
      Serial.print(EEPROM[2]);
      Serial.print("  ");
      
      String PaschVier = String(float(EEPROM[2]) / float(EEPROM[0]) * 100);
      PaschVier.replace(".", ",");
      Serial.println(PaschVier + " %");
      Serial.print("Anzahl Kniffel: ");
      Serial.print(EEPROM[3]);
      Serial.print("  ");
      
      String KniffelAnzahl = String(float(EEPROM[3]) / float(EEPROM[0]) * 100);
      KniffelAnzahl.replace(".", ",");
      Serial.println(KniffelAnzahl + " %");
      Serial.println("-----------------------------");
    }
  }
  else Serial.println("Kein Speicherplatz mehr vorhanden!");
}

Letzte Aktualisierung: Wei­ter lesen ...

Lauf­licht Schieberegister

int BitsSchieben = 8;
int AusgabePin = 9;
int EingangPin = 10;

// Array LEDs leuchten von außen nach innen und zurück
byte AussenNachInnen[] =
{
  B10000001, B01000010, B00100100, B00011000,
  B00100100, B01000010, B10000001
};

void setup()
{
  pinMode(BitsSchieben, OUTPUT);
  pinMode(AusgabePin, OUTPUT);
  pinMode(EingangPin, OUTPUT);
}

void loop()
{
  /*
    Lauflicht vorwärts
    LSBFIRST Bits von rechts ins Register schieben
    dann jeweils 1 Bit nach rechts schieben
    Startpunkt hängt davon ab, an welchen Pins die
    1. Led und die weiteren LEDs gesteckt sind
  */
  byte LED = B10000000;

  // die letzte LED bleibt an
  for (int i = 0; i <= 6; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits von rechts in das Register schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 1 Bit nach rechts schieben
    LED = LED >> 1;
  }

  /*
    durch die Verschiebung ist der aktuelle Stand:
    LED = B00000001
    Lauflicht rückwärts -> 1 Bit nach links schieben
  */
  for (int i = 0; i <= 7; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits von rechts in das Register schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 1 Bit nach links schieben
    LED = LED << 1;
  }

  // Lauflicht 2 LEDs vorwärts
  LED = B11000000;

  for (int i = 0; i <= 2; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // LSBFIRST -> Bits von rechts in das Register schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 2 Bits nach rechts schieben
    LED = LED >> 2;
  }

  // Lauflicht 2 LEDs rückwärts
  for (int i = 0; i <= 3; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits von links in das Register schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 2 Bits nach links schieben
    LED = LED << 2;
  }

  // Lauflicht -> LEDs gehen nach und nach aus
  // LSBFIRST -> Bits von rechts in das Register schieben
  LED = B11111111;

  for (int i = 0; i <= 7; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits in das Schiebregister schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 1 Bit nach rechts schieben
    LED = LED >> 1;
  }

  // LSBFIRST -> Bits von rechts in das Register schieben
  LED = B11111111;
  for (int i = 0; i <= 7; i++)
  {
    // Ausgaberegister ausschalten
    digitalWrite(AusgabePin, 0);

    // Bits in das Schiebregister schieben
    shiftOut(EingangPin, BitsSchieben, LSBFIRST, LED);

    // Ausgaberegister einschalten
    digitalWrite(AusgabePin, 1);
    delay(200);

    // 1 Bit nach links schieben
    LED = LED << 1;
  }

  // LEDS leuchten von außen nach innen und zurück
  // Array AussenNachInnen
  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, AussenNachInnen[i]);
    digitalWrite(AusgabePin, 1);
    delay(200);
  }

  // alle LEDs blinken
  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, LED);
    digitalWrite(AusgabePin, 1);
    delay(200);

    // alle Werte umkehren
    LED = ~ LED;
  }

  // MSBFIRST -> Bits von links in das Register schieben
  // jede zweite LED im Wechsel
  LED = B10101010;

  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, LED);
    digitalWrite(AusgabePin, 1);
    delay(200);

    // alle Werte umkehren
    LED = ! LED;
  }

  // jeweils 2 LEDs im Wechsel
  LED = B11001100;

  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, LED);
    digitalWrite(AusgabePin, 1);
    delay(200);

    // alle Werte umkehren
    LED = ~ LED;
  }

  // äußere LEDs/innere LEDs im Wechsel
  LED = B11000011;

  for (int i = 0; i <= 6; i++)
  {
    digitalWrite(AusgabePin, 0);
    shiftOut(EingangPin, BitsSchieben, MSBFIRST, LED);
    digitalWrite(AusgabePin, 1);
    delay(200);

    // alle Werte umkehren
    LED = ~ LED;
  }
}

Letzte Aktualisierung: Wei­ter lesen ...

Lauf­licht

int LED[5] = {3, 4, 5, 6, 7};
int Leuchtdauer = 200;

void setup() 
{
  for (int i = 0; i <= 4; i++) 
  {
    pinMode(LED[i], OUTPUT);
  }
}

void loop() 
{
  for (int i = 0; i <= 4; i++) 
  {
    // aktuelle LED i einschalten
    digitalWrite(LED[i], HIGH);

    delay(Leuchtdauer);
    digitalWrite(LED[i], LOW);
  }
}

Letzte Aktualisierung: Wei­ter lesen ...

Lauf­licht blin­ken­de LEDs

int LED[5] = {3, 4, 5, 6, 7};
int AnzahlBlinken; 
int LEDNummer;

void setup()
{
  for (int i = 0; i <= 4; i ++)
  {
    pinMode(LED[i], OUTPUT);
  }

   // Zufallsgenerator starten
   randomSeed(analogRead(A0));
}

void loop()  
{ 
  for (int i = 0; i <= 4; i ++)    
  {  
    // Anzahl des Blinkens der LEDs zufällig bestimmen       
    AnzahlBlinken = random(1, 5);   

    // Leuchtdauer zufällig bestimmen
    int Leuchtdauer = random(50, 500);  

    /* 
      aktuelle LED i einschalten     
      -> Funktion LEDBlinken aufrufen   
    */    
    LEDBlinken(LED[i], AnzahlBlinken, Leuchtdauer);   
  } 
}

void LEDBlinken(int LEDNummer, int Anzahl, int Leuchtdauer) 
{ 
  for (int i = 0; i <= Anzahl; i ++)   
  {  
    digitalWrite(LEDNummer, HIGH);   
    delay(Leuchtdauer);   
    digitalWrite(LEDNummer, LOW);   
    delay(Leuchtdauer); 
  }
}

Letzte Aktualisierung: Wei­ter lesen ...

Wecker

# include "RTClib.h"
# include "LiquidCrystal_I2C.h"

// Name des RTC-Moduls
RTC_DS3231 rtc;

LiquidCrystal_I2C lcd(0x27, 20, 4);

int Lautsprecher = 3;
int TasterLinks = 7;
int TasterRechts = 8;

int TasterLesenLinks;
int TasterLesenRechts;

// Beginn der Weckzeit
int StundeWeckzeit = 6;
int MinuteWeckzeit = 0;

// Dauer des Signal
int DauerWecksignal = 3;

// Zeit messen für Ticken der Uhr
long Startzeit;
long ZeitJetzt;

void setup()
{
  pinMode(TasterLinks, INPUT_PULLUP);
  pinMode(TasterRechts, INPUT_PULLUP);
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  rtc.begin();
  /*
    wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
    Jahr, Monat, Tag, Stunde, Minute, Sekunde
    keine führende 0 setzen
    rtc.adjust(DateTime(2020, 12, 13, 13, 31, 30));
  */
  // rtc.adjust(DateTime(2020, 12, 13, 13, 31, 30));

  // LCD initialisieren
  lcd.init();
  lcd.backlight();

  Serial.println("Bitte die Weckzeit eingeben:");
  Serial.println("Taster links -> Stunde +/Taster rechts -> Minute +");
  Startzeit = millis();
}

void loop()
{
  String Stunde, Minute, Weckzeit;

  // aktuelle Zeit lesen
  DateTime aktuell = rtc.now();

  // Stunde einstellen
  TasterLesenLinks = digitalRead(TasterLinks);

  // Minute einstellen
  if (TasterLesenLinks == LOW)
  {
    delay(200);
    if (StundeWeckzeit >= 24) StundeWeckzeit = 1;
    else StundeWeckzeit ++;
  }

  TasterLesenRechts = digitalRead(TasterRechts);
  if (TasterLesenRechts == LOW)
  {
    delay(200);
    if (MinuteWeckzeit >= 59) MinuteWeckzeit = 0;
    else MinuteWeckzeit ++;
  }

  // Wochentag, Datum und Zeit anzeigen
  lcd.setCursor(0, 0);

  /*
    Wochentag anzeigen
    0 = Sonntag
    1 = Montag
    ...
    6 = Samstag
  */
  switch (aktuell.dayOfTheWeek())
  {
    case 0:
      lcd.print("Sonntag");
      break;
    case 1:
      lcd.print("Montag");
      break;
    case 2:
      lcd.print("Dienstag");
      break;
    case 3:
      lcd.print("Mittwoch");
      break;
    case 4:
      lcd.print("Donnerstag");
      break;
    case 5:
      lcd.print("Freitag");
      break;
    case 6:
      lcd.print("Samstag");
      break;
  }

  lcd.setCursor(0, 1);
  lcd.print(aktuell.day());
  lcd.print(".");

  // Monatsnamen anzeigen
  lcd.print(" ");

  switch (aktuell.month())
  {
    case 1:
      lcd.print("Januar");
      break;
    case 2:
      lcd.print("Februar");
      break;
    case 3:
      lcd.print("M\341rz");
      break;
    case 4:
      lcd.print("April");
      break;
    case 5:
      lcd.print("Mai");
      break;
    case 6:
      lcd.print("Juni");
      break;
    case 7:
      lcd.print("Juli");
      break;
    case 8:
      lcd.print("August");
      break;
    case 9:
      lcd.print("September");
      break;
    case 10:
      lcd.print("Oktober");
      break;
    case 11:
      lcd.print("November");
      break;
    case 12:
      lcd.print("Dezember");
      break;
  }
  lcd.print(" ");

  lcd.print(aktuell.year());
  lcd.setCursor(0, 2);

  // wenn Stunden < 10 -> führende 0 setzen
  if (aktuell.hour() < 10) lcd.print("0");
  lcd.print(aktuell.hour());
  lcd.print(':');

  // wenn Minuten < 10 -> führende 0 setzen
  if (aktuell.minute() < 10) lcd.print("0");
  lcd.print(aktuell.minute());
  lcd.print(':');

  // wenn Sekunden < 10 -> führende 0 setzen
  if (aktuell.second() < 10) lcd.print("0");
  lcd.print(aktuell.second());

  /*
    Weckzeit formatieren -> führende 0 ergänzen
    4 mögliche Fälle
    Stunde < 10 Minute < 10
    Stunde < 10 Minute > 9
    Stunde > 10 Minute < 10
    Stunde > 10 Minute > 9
  */
  if (StundeWeckzeit < 10 && MinuteWeckzeit < 10) Weckzeit = "0" + String(StundeWeckzeit) + ":0" + String(MinuteWeckzeit);

  if (StundeWeckzeit < 10 && MinuteWeckzeit > 9) Weckzeit = "0" + String(StundeWeckzeit) + ":" + String(MinuteWeckzeit);

  if (StundeWeckzeit > 9 && MinuteWeckzeit < 10) Weckzeit = String(StundeWeckzeit) + ":0" + String(MinuteWeckzeit);

  if (StundeWeckzeit > 9 && MinuteWeckzeit > 9) Weckzeit = String(StundeWeckzeit) + ":" + String(MinuteWeckzeit);

  lcd.setCursor(0, 3);
  lcd.print("Weckzeit: " + Weckzeit);

  // führende 0 setzen
  if (aktuell.hour() < 10) Stunde = "0" + String(aktuell.hour());
  else Stunde = String(aktuell.hour());

  // führende 0 setzen
  if (aktuell.minute() < 10) Minute = "0" +  String(aktuell.minute());
  else Minute = String(aktuell.minute());

  // String zusammensetzen
  String aktuelleZeit = Stunde + ":" + Minute;
  if (aktuelleZeit == Weckzeit && aktuell.second() <  DauerWecksignal)
  {
    tone(Lautsprecher, 1000, 500);
  }

  /*
    Ticken der Uhr
    aktuelle Zeit (ZeitJetzt) messen
    millis() -> Zeit, die seit dem Start des Programms
    vergangen ist
    wenn die Differenz zwischen der gerade gemessenen Zeit
    und der im setup gemessenen Startzeit >= 1000 (1 Sekunde) ist
    -> kurzen Ton wiedergeben
    Startzeit muss anschließend auf die aktuelle Zeit gesetzt werden
  */
  ZeitJetzt = millis();

  if (ZeitJetzt - Startzeit >= 1000)
  {
    tone(Lautsprecher, 1000, 2);
    Startzeit = ZeitJetzt;
  }
}

Letzte Aktualisierung: Wei­ter lesen ...

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: Wei­ter lesen ...