Wie funktionieren Timer

Ich hab ein Problem. Ich will ein kleines Spiel bauen mit drei Lampen. Am Anfang geht eine von den drei lampen an und bleibg eine zufällige Zeit aus. Anschließend geht ein timer an, den man mit einem button stoppen kann. Aber jede lampe hat einen dazugehörigen Knopf. Am Ende geht eine Lampe an wenn man schneller als eine Sekunde den Knopf gedrückt hat.

danke für die hilfe

hier ist noch unser code der aber nicht funktioniert :frowning:

// C++ code

void setup()
{
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);

  Z1 = 0;
  Z2 = 0;
  Z3 = 0;
  A = 0;
  T = 0;
}

void loop()
{
  A += random(1, 3 + 1);
  if (A == 1) {
    Z1 += random(1, 2 + 1);
    digitalWrite(11, HIGH);
    delay(500); // Wait for 500 millisecond(s)
    digitalWrite(11, LOW);
    if ( 6 == HIGH) { 
      T += T + 1;
    }
 	if ( 6 == HIGH) { 
      T += T + 1;
    }
	 if ( 6 == HIGH) { 
      T += T + 1;
    }
	 if ( 6 == HIGH) { 
      T += T + 1;
    }
 	if ( 6 == HIGH) { 
      T += T + 1;
    }
 
    delay(Z1); // Wait for Z1 millisecond(s)
  }
  if (A == 2) {
    Z2 += random(1, 2 + 1);
    digitalWrite(10, HIGH);
    delay(500); // Wait for 500 millisecond(s)
    digitalWrite(10, LOW);
    delay(Z2); // Wait for Z2 millisecond(s)
    if ( 7 == HIGH) { 
      T += T + 1;
    }
 	if ( 7 == HIGH) { 
      T += T + 1;
    }
	 if ( 7 == HIGH) { 
      T += T + 1;
    }
	 if ( 7 == HIGH) { 
      T += T + 1;
    }
 	if ( 7 == HIGH) { 
      T += T + 1;
    }
  }
  if (A == 3) {
    Z3 += random(1, 2 + 1);
    digitalWrite(9, HIGH);
    delay(500); // Wait for 500 millisecond(s)
    digitalWrite(9, LOW);
    delay(Z3); // Wait for Z3 millisecond(s)
    if ( 8 == HIGH) { 
      T += T + 1;
    }
 	if ( 8 == HIGH) { 
      T += T + 1;
    }
	 if ( 8 == HIGH) { 
      T += T + 1;
    }
	 if ( 8 == HIGH) { 
      T += T + 1;
    }
 	if ( 8 == HIGH) { 
      T += T + 1;
    }
  }
 if ( T == "1")
   12 == HIGH;
} ```

Die Beschreibung ist sehr ungenau.
Eine Lampe geht an und ist eine Zeit aus?
Ein Timer geht an und tut nix, aber kann mit einer Taste gestoppt werden? Einer Stopptasste oder der Taste die zu jeder Lampe gehört?

lerne wie man einen Pin abfragt

Das sieht verdächtig nach einem endlichen Automaten aus.

Hallo Gruppe,
herzliche wilkommen im Arduino- Forum.

wenn es besonders schnell gehen soll

  • username schnell aber wahllos auf die Tastatur geklimpert
  • kurze und deshalb unpräzise Beschreibung

dann geht es in Wirklichkeit besonders laaaangsaaam.
Die Antwort auf die Frage: "Wie funktionieren Timer?"
lautet
"Man programmiert sie und dann benutzt man sie" zu der Antwort sagt ihr jetzt völlig zu recht "haha ha na jetz bin ich schlauer".

Auch die nächste Version hilft nicht weiter.
"Wenn man Tastenabfragen will während eine LED blinkt dann benutzt man millis()"

"Ja toll und was ist millis()???"
Eben. Mit zu wenig Information gibt's nur nachfragen.

Auf kurze Postings kommen keine konkreten Antworten sondern nachfragen nach den Details die man im Kurzposting glaubte weglassen zu können.

ihr arbeitet an einem Informatik-Projekt und was am meisten in einem Informatik-Projekt benötigt wird ist: Information.

Welchen Microcontroller benutzt ihr?
ungefähre Beschreibung wie viel Programmiererfahrung ihr habt.
ungefähre Beschreibung wie viel Ahnung ihr von Elektronik habt.

Die folgende Frage erscheint den meisten erst einmal sehr ungewöhnlich:
Wann muss das Projekt fertig sein?
Von Anfängern wird gnadenlos unterschätzt wie viel Zeit das Austesten eines Programmes braucht.

Und nach diesen Infos dann nochmal eine detaillierte Beschreibung in der alles genau und unterscheidbar benannt wird.
Lampe 1: L1
Lampe 2: L2
Lampe 3: L3

Taste 1: T1
Taste 2: T2
Taste 3: T3

Timer wie viele Timer? Nur einen oder mehrere ?

Und damit jetzt eine detaillierte Ablaufbeschreibung.

vgs

1 Like

Hallo
Ein ähnliches Spiel hatten wir vor Tagen:

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Hallo,
sehe ich ebenso , also erst mal da schlau machen, eventuell etwas anpassen.
Ansonsten auf die Frage "wie funktioniert ein Timer" solltest Du mal nach dem Nachtwächter suchen. (Ohne Link weil suchen)
Heinz

Dieses kleine Spiel hier vielleicht?
Die Idee dahinter:

  • Das Spiel startet mit anlegen der Betriebsspannung.
  • 1 zufällige LED leuchtet für eine zufällige Zeit (derzeit zwischen 1 und fast 10 Sekunden) und geht aus
  • Wird in dieser Zeit eine Taste gedrückt, wird erneut gestartet; dies verhindert, das jemand auf der Taste drückt, während die LED leuchtet und schummelt
  • Die Auszeit ist als Reaktionszeit vorgegeben.
  • wird innerhalb der Reaktionszeit der richtige Button gedrückt, blinkt die dazu gehörige LED
  • Alternative1: wird ein falscher Taster gedrückt Oder
  • Alternative2: wird in der Reaktionszeit kein Taster gedrückt, blinken ALLE LED's als Fehleranzeige
  • Danach kurze Pause - Alle LED's aus.
  • Und dann satrtet das Spiel von vorn.

Das ist ganz und gar ohne LED und Taster geschrieben - nur mit dem Seriellen Monitor.
Das ist der dritte und letzte Versuch innerhalb 4 Tage sowas zu bauen. (1 und 2)
Wenn irgendwas nicht geht, dann musst Du Dir das selbst erarbeiten.
Ich denke es ist ausreichend kommentiert, was das werden soll.

// Kleines Reaktionsspiel - Taster / LED-Kombis mit Zufallszeiten und Zufallsauswahl
// https://forum.arduino.cc/t/wie-funktionieren-timer/997433/8
// basiert auf https://forum.arduino.cc/t/wie-funktionieren-timer/997433/


const uint32_t reaktionsZeit = 1000UL * 2;  // Zeit in ms
uint32_t einZeit;                           // Variable für Leuchtzeit
const byte anzahl = 3;                      // Anzahl TAST/LED Kombinationen
const byte ledPin[anzahl] = {9, 10, 11};    // Pins für Ausgabe
const byte tastePin[anzahl] = {6, 7, 8};    // Pins für Eingabe
byte auswahl;                               // welche LED / Tastenkombi ausgewählt wird
uint32_t lastmillis;                        // Merker für Zeiten
byte schritt;                               // Merker für Ablauf

void setup()
{
  Serial.begin(115200);                     // zum debuggen
  Serial.println(F("Start..."));
  for (byte  b = 0; b < anzahl; b++)
  {
    pinMode(ledPin[b], OUTPUT);             // LED-Pins setzen
    pinMode(tastePin[b], INPUT_PULLUP);     // Tasten werden nach GND verbunden!
  }
  randomSeed(analogRead(A0));               // Zufallszahlen....
}

void loop()
{
  switch (schritt)
  {
    case 0:                                    // Auswahl: Start: Auswahl eine LED ein
      zufall();                                       // "Würfeln"
      ledAus();                                       // ...
      Serial.println(F("Alles aus!"));
      digitalWrite(ledPin[auswahl], HIGH);            // Aktiviert Auswahl
      lastmillis = millis();                          // Zeit merken
      Serial.println(F("Spielstart"));
      schritt = 1;                                    // weiter...
      break;
    case 1:                                    // Auswahl: LED soll zufällig ausgehen
      for (byte b = 0; b < anzahl; b++)               // Abfrage ob keine Taste gedrückt ist
      {
        if (digitalRead(tastePin[b]) == LOW)          // Wenn Taste gedrückt
        {
          lastmillis = millis();                      // Zeit zurück setzen
          Serial.println("Reset");
          break;                                      // Abbruch
        }
      }
      if (millis() - lastmillis >= einZeit)           // Wenn Zeit um
      {
        ledAus();
        Serial.println(F("Warte auf Taste"));
        lastmillis = millis();                        // Zeit merken
        schritt = 2;
      }
      break;
    case 2:                                    // Auswahl: Tasten abfragen
      if (millis() - lastmillis <= reaktionsZeit)     // Reaktionszeit nicht abgelaufen
      {
        for (byte b = 0; b < anzahl; b++)             // Abfrage ob Taste gedrückt
        {
          if (digitalRead(tastePin[b]) == LOW)        // Taste gedrückt?
          {
            lastmillis = millis();                    // Zeit merken
            if (b == auswahl)                         // richtige Taste?
            {
              Serial.println(F("Richtig!"));
              schritt = 3;                            // Erfolg melden
              break;
            }
            else
            {
              Serial.println(F("Falsch!"));
              schritt = 4;                            // Misserfolg melden
            }
          }
        }
      }
      else                                            // Reaktionszeit abgelaufen
      {
        lastmillis = millis();                        // Zeit merken
        Serial.println(F("Nicht gedrückt!"));
        schritt = 4;                                  // Misserfolg melden
      }
      break;
    case 3:                                   // Auswahl: richtige LED
      if (millis() - lastmillis < 3000)
      {
        blinkLed(ledPin[auswahl], 600);               // Erfolgsanzeige
      }
      else
      {
        lastmillis = millis();
        schritt = 5;                                  // Neustart abwarten
        Serial.println(F("Neustart nach Erfolg"));
      }
      break;
    case 4:                                  // Auswahl: falsche oder keine LED
      if (millis() - lastmillis < 5000)
      {
        blinkAll(600);                                // Fehleranzeige
      }
      else
      {
        lastmillis = millis();
        schritt = 5;
        Serial.println(F("Neustart nach Misserfolg"));
      }
      break;
    case 5:                                 // Auswahl: Ende Durchlauf
      ledAus();                                       // Alles erledigt
      if (millis() - lastmillis > 2000)               // Kleine Pause ohne delay()
        schritt = 0;                                  // Fange an von vorn
      break;
    default:
      schritt = 0;
      break;
  }
}
//
void zufall()
{
  static byte lastAuswahl = 255;                      // Merker
  einZeit = random(1000, 10000);                      // Zufall in ms
  byte umlauf = 0;                                    // Zähler
  while (lastAuswahl == auswahl &&                    // Letzte Zahl nicht anders als aktuelle?
         umlauf < 3)                                  // nicht genügend Wiederholungen?
  {
    auswahl = random (0, anzahl);                     // Neue Zahl
    umlauf++;                                         // 
  }
  lastAuswahl = auswahl;                              // merken
  Serial.print(F("Einschaltzeit in ms: "));           // Ausgaben
  Serial.println(einZeit);
  Serial.print(F("Ausgewählter Reaktionsweg: "));
  Serial.println(auswahl);
}
//
void ledAus()                                         // durchläuft alle AusgabePins
{
  for (byte b = 0; b < anzahl; b++)
  {
    digitalWrite(ledPin[b], LOW);
  }
}
//
void blinkLed(const byte ledpin, const uint32_t zeit)
{
  static uint32_t lastZeit = 0;                      // Merker letze Zeit
  if (millis() - lastZeit >= zeit)                   // Zeit abgelaufen
  {
    lastZeit = millis();                             // Merker setzen
    digitalWrite(ledpin, !digitalRead(ledpin));      // toggle
    Serial.print(F("Blink LED: "));
    Serial.println(digitalRead(ledpin));
  }
}

void blinkAll(const uint32_t zeit)                   // alle LED's ...
{
  static uint32_t lastzeit = 0;
  if (millis() - lastzeit >= zeit)
  {
    for (byte b = 0; b < anzahl; b++)
    {
      digitalWrite(ledPin[auswahl], HIGH);
    }
    lastzeit = millis();
  }
  else if (millis() - lastzeit >= zeit / 2)         // eine andere Möglichkeit fürs blinken
  {
    for (byte b = 0; b < anzahl; b++)
    {
      digitalWrite(ledPin[auswahl], LOW);
    }
  }
}

Bist du jetzt unter die Spiele Entwickler gegangen. :slightly_smiling_face: :+1:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.