Hilfe gesucht: millis()

Freeman82:
Ich habe einen Taster und eine LED.

Bedingung 1: Das LED soll erst aufleuchten wenn der Taster mindestens zweimal gedrückt wird.
Bedingung 2: Das LED soll weiter aufleuchten wenn der Taster wiederholt in einer gewissen Geschwindigkeitsabfolge betätigt wird. Daher nur weiter leuchten wenn der Taster beispielsweise mindestens jede Sekunde gedrückt wird.

Quasi eine Totmannschaltung mit verschärften Bedingungen.

Mein Codevorschlag:

#define TASTEPIN 7
#define LEDPIN 13
#define OBEN false
#define UNTEN true
#define ENTPRELLMILLIS 10

void setup() {
  pinMode(TASTEPIN,INPUT);
  pinMode(LEDPIN,OUTPUT);
}

boolean totMann(byte tastePin, long totMannTimeout) {
  static boolean tasteStatus, tasteStatusLogisch;
  static long tasteObenZuletzt, tasteUntenZuletzt;
  static long tasteObenVorZuletzt=-1000000000L;
  static long tasteUntenVorZuletzt=-1000000000L;
  tasteStatus=digitalRead(tastePin);
  if ((tasteStatus==OBEN)&&(tasteStatusLogisch==UNTEN)&&(millis()-tasteUntenZuletzt>ENTPRELLMILLIS))
  {
    tasteStatusLogisch=OBEN;
    tasteObenVorZuletzt=tasteObenZuletzt;
    tasteObenZuletzt=millis();
  }
  else if ((tasteStatus==UNTEN)&&(tasteStatusLogisch==OBEN)&&(millis()-tasteObenZuletzt>ENTPRELLMILLIS))
  {
    tasteStatusLogisch=UNTEN;
    tasteUntenVorZuletzt=tasteUntenZuletzt;
    tasteUntenZuletzt=millis();
  }
  if (millis()-tasteObenZuletzt > totMannTimeout) return(true);
  if (millis()-tasteUntenZuletzt > totMannTimeout) return(true);
  if (millis()-tasteObenVorZuletzt > 2*totMannTimeout) return(true);
  if (millis()-tasteUntenVorZuletzt > 2*totMannTimeout) return(true);
  return(false);  
}

#define TOTMANNMILLIS 1000

void loop() {
 if (totMann(TASTEPIN, TOTMANNMILLIS))
   digitalWrite(LEDPIN, false);
 else   
   digitalWrite(LEDPIN,true);
}

Falls die Taste entgegengesetzte Pegel liefert, einfach die Definitionen für OBEN und UNTEN vertauschen.

Falls der entprellte Tastenstatus irgendwo im Programm benötigt wird, einfach die Variable tasteStatusLogisch aus der totMann() Funktion herausziehen und stattdessen global deklarieren.

So ungefähr würde ich das machen.