Go Down

Topic: Hilfe gesucht: millis() (Read 612 times) previous topic - next topic

Freeman82

Hallo Zusammen,

Ich bin Beginner aber total begeistert und habe schon einige Projekte im Kopf ;)

Ihr könnt mir bestimmt helfen, ich versuche schon seit einigen Stunden folgendes mit einem sehr einfachen Aufbau hinzukriegen:

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.

Ich bin mir sicher das es dazu eine einfach Lösung mit Hilfe der Zeitfunktion (millis) gibt, die ich aber leider noch nicht gefunden habe!

Merci vorab!

michael_x

Du kannst millis() nicht nur dazu verwenden, zu wissen wie lange die Led schon an / bzw. aus ist, ( wie bei BlinkWithoutDelay )
sondern natürlich auch zum ermitteln, wie lange dein Totmann-Taster nicht betätigt wurde.

Taster-Änderung erkennt man durch Vergleich mit dem Zustand beim vorigen Mal. ( den man sich so wie previousMillis von einem loop() zum nächsten merkt.

Für die erste Bedingung brauchst du noch eine extra Zähl-Variable die zählt, wie oft der Taster gedrückt wurde.

(
Da kommt aber das sogenannte Prellen dazu :
Wundere dich nicht, wenn dieser Zähler im ersten Ansatz nicht eins weiter zählt, sondern eine unbestimmte Zahl von Schaltwechseln registriert.
Die einfachste Abhilfe: Beim Erkennen eines Wechsels des Tasterzustands einfach eine kurze Zeit (z.B. 10 msec) warten.
Diese Zeit kann in deinem Fall ( Totmann ) sogar deutlich größer sein. Der Taster muss dann "richtig" betätigt werden: z.B. min 250 msec gedrückt und min 250 msec losgelassen, sonst "gilt" es nicht, weil dein sketch es -- wegen des delay(250) -- gar nicht merkt.
)

Freeman82

besten dank für die antwort. könnte es so ähnlich funktionieren?


void loop()
{

  currentTime = millis();


  if (digitalRead(2)==High && a <= 1)
  {
  loopTime = currentTime;
  a ++ 1;
  }

  else if (digitalRead(2)==High && a >= 2)
  {
  loopTime2 = currentTime;
  a ++ 1;

         if (loopTime2 < loopTime + 1000)
         {
         LEDpin == HIGH;
         a == 2;
         loopTime = currentTime;
       
         else
         {
         LEDpin == LOW;
         a == 0;
         }

}

jurs

#3
Jan 25, 2013, 11:29 am Last Edit: Jan 25, 2013, 02:06 pm by jurs Reason: 1

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:
Code: [Select]

#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.

Go Up