Taster für Stoppuhr zum halten bekommen ?!

Hallo,

Ich möchte eine Stoppuhr programmieren.
Diese soll durch einen Taster zum starten und stoppen gebracht werden.

Alles klappt soweit nur das ich den Taster gedrückt halten muss damit die Uhr läuft und wenn ich den Taster wieder loslasse stoppt die Uhr.

Allerdings soll bei einem Drücken die Uhr loslaufen und beim 2. mal Drücken wieder stoppen....
(Das ganze wird in Millisekunden angegeben)

Danke schonmal im vorraus!!! :slight_smile:

byte einer = 0;
byte zehner = 0;
byte hunderter = 0;
// unsigned long start;
unsigned long previousMicros = 0;
unsigned long currentMicros;
int Seg7[]                                        //Array für 7-Seg Anzeige
{
  0b00111111,  //0
  0b00000110,  //1
  0b01011011,  //2
  0b01001111,  //3
  0b01100110,  //4
  0b01101101,  //5
  0b01111101,  //6
  0b00000111,  //7
  0b01111111,  //8
  0b01101111   //9 
};

void setup() 
{
  for(i=0; i<12; i++)                             //Millisekunden werden an Pin 0-11 über 7-Seg Anzeige ausgegeben
  {
    pinMode(i, OUTPUT);
    digitalWrite(i, OUTPUT);
  }

  for(i=12; i<13; i++)                            //Stoptaster wird an Pin 12 eingelesen
  {
    digitalWrite (i, INPUT_PULLUP);
  }

  digitalWrite(9, INPUT);                         //7-Seg Anzeige Ground wird als Eingang geschaltet
  digitalWrite(10, INPUT);
  digitalWrite(11, INPUT);
}


void loop()
{ 
  loslaufen();
  reset();
  speichern();
  anzeigen();
  pausieren();
}


void loslaufen()
{
  if (digitalRead (12) == LOW)
  {
    
  currentMicros = micros();
  
  if(currentMicros - previousMicros >=999)       //Wartet bis Micros bei 1000 (bzw. 999) ist
  {
    previousMicros = currentMicros;
    einer++;                                     //Wenn Micros 1000 erreicht hat wird 1 hochgezählt
  }
  
  if (einer > 9)                                 //Wenn einer Stelle bei 9 ist, wird zehner 1 hochgezählt -> einer reset
  {
    einer = 0;
    zehner++;
  }
  
  if(zehner > 9)                                 //Wenn zehner Stelle bei 9 ist, wird hunderter 1 hochgezählt -> zehner reset
  {
    zehner = 0;
    hunderter++;
  }
  
  if(hunderter > 9)                             //Wenn hunderter Stelle bei 9 ist, wird hunderter resetet -> alles 0 
  {
    hunderter = 0;
  }
  
  anzeigen();                                    //Springt ins Unterprogramm für die Ausgabe an den 7-Seg Anzeigen
  }
}

void reset()
{
  
}

void speichern()
{
  
}

void anzeigen()
{
  digitalWrite(9,0);                           //Pin 9 aus
    PORTD = Seg7[einer];                       //Setzt "einer Counter" an Pin 9
  digitalWrite(9,1);                           //Pin 9 an
    PORTD = 0b00000000;                        //Vergleicht Binär "einer Counter" mit 0b00000000 und fängt an zu multiplexen
  digitalWrite(10,0);
    PORTD = Seg7[zehner];
  digitalWrite(10,1);
    PORTD = 0b00000000;
  digitalWrite(11,0);
    PORTD = Seg7[hunderter];
  digitalWrite(11,1);
    PORTD = 0b00000000;  
}

void pausieren()
{
  
}
void loslaufen()
{
  if (digitalRead (12) == LOW)
  {

Dann macht das Programm doch genau das, was du ihm aufgetragen hast.
Du schreibt: wenn Taster am Pin 12 gedrückt, dann mach das und das.

Du könntest einen Merker setzen, wenn die Taste gedrückt wurde und den Merker zurück setzen, wenn der Taster erneut gedrückt wurde.

Und solange der Merker gesetzt ist, soll er zählen.

Grüße
:slight_smile:

Wenn Du da selbst drauf kommen möchtest..

dort wird bei wiederholtem drücken die Variable ledState getoggelt.