Go Down

Topic: Tastereingabe mit Wartezeit/Verzögerung (Read 2224 times) previous topic - next topic

uwefed

Wieso nimmst Du einen Zähler und nicht den Millisekundenzähler millis() den wir Dir vorschlagen?
Grüße Uwe

Theseus

#16
Oct 09, 2016, 01:22 pm Last Edit: Oct 09, 2016, 01:23 pm by Theseus
Habe das vor Jahren mal in einer Modellraketen Startprozedur mit eingebaut. Bin gerade durch Zufall drauf gestoßen.
Es funktioniert einwandfrei  :)
Da finde ich deinen Code aus #11 um Längen eleganter.

uxomm

Da finde ich deinen Code aus #11 um Längen eleganter.
Ja, auf jeden Fall!
Aber wichtig ist richtig zu rechnen. Ich denke, das wird nicht so gut funktionieren:
Code: [Select]
if ( Zeitmarke - millis() >= 5000 )
...

(vor allem auch) weil Zeitmarke und millis unsigned long sind.
Da wird von der kleineren Zahl die größere abgezogen. Das gibt dann einen Überlauf und eine "ziemlich große" Zahl, die wohl immer größer als 5000 ist.
Aber so funktioniert es besser:
Code: [Select]
if ( millis() - Zeitmarke >= 5000 )
...

Die kleiner von der größeren Zahl abziehen.
:)
Always decouple electronic circuitry.

guntherb

Dein Code macht trotzdem noch nicht das, was du willst:
muss ein Taster mindestens 5 Sekungen lang gedrückt werden.
Du musst noch eine Zeile einfügen, in der der Zähler _ABVAR_1_Counter auf Null gesetzt wird, wenn der Taster nicht gedrückt wird.


Aber ansonsten: Wenn du für dich eine funktionierende Lösung gefunden hast, ist es gut.
Es gibt immer jemanden, der meint eine andere Lösung sei besser.
Laß dich nicht irritieren.

Viel Spaß noch

Gunther
Grüße
Gunther

ElEspanol

#19
Oct 09, 2016, 07:51 pm Last Edit: Oct 09, 2016, 07:51 pm by ElEspanol
[ironie an]Und es ist immer vorteilhaft und ratsam, in einen Sketch delays und Schleifen einzubauen.[/ironie aus]

Astrojens

Hey,

ich versuche es die Tage nochmal mit der millis() Funktion.
Wie weiter vorn schon gesagt, ich habs nicht so mit diesen Zeitsachen.

Habe auch schon an eine State-Mashine gedacht. Mal sehen. Wenn ich Zeit und Muse habe versuche ich mich nochmal an der Thematik.

Zur Erklärung sei noch gesagt, dass ich jetzt länger nicht mehr mit dem Board gearbeitet habe und erst langsam wieder reinfinde.

LG Jens

MaHa76

Hi Jens- nimm die 2 Zeilen die ich unten geschrieben habe.... nur die Variablen noch deklarieren und gut ist... ;-)

guntherb

#22
Oct 10, 2016, 12:53 pm Last Edit: Oct 10, 2016, 12:53 pm by guntherb
ich versuche es die Tage nochmal mit der millis() Funktion.
Wie weiter vorn schon gesagt, ich habs nicht so mit diesen Zeitsachen.
Schau dir mal diesen Fred an: BlinkWithoutDelay - Die Nachtwächtererklärung
Hier wird sehr anschaulich erklärt, wie das funktioniert, mit den millis()
Grüße
Gunther

MaHa76

#23
Oct 10, 2016, 02:39 pm Last Edit: Oct 10, 2016, 02:41 pm by MaHa76
Hier hatte das doch mal jemand so anschaulich mit dem Nachtwächter erklärt.

Letztendlich hast du deine millis(), das ist quasi die Uhr des Arduinos die läuft und läuft und läuft.... in Millisekunden eben. (geht aber auch in Mikrosekunden)

Wenn du etwas Zeitabhängiges machen willst schaust du eben auf die Uhr und merkst dir die Zeit. Du speicherst also die aktuellen millis() in der Variablen "Zeitmarke". Nun willst du ja nach einer Zeit "Intervall" eine Aktion auslösen. Woher weißt du nun wann die Zeit "Intervall" abgelaufen ist, wenn du doch garnicht weißt bei welchem Wert millis() steht? Du fragst deine Zeitmarke.... Aber um dir langes Rechnen zu ersparen um dann bei einem bestimmten Wert für millis() deine Aktion aus zu lösen, ziehst du einfach von dem aktuellen millis() deine "Zeitmarke" ab.

Wenn du in deinem Tagesablauf 12min brauchst um eine Aktion auszulösen interessiert dich der Stundenzeiger auf der Uhr kaum... da weißt unter Umständen nucht wirklich wie spät es ist... um aber in 12min bei der Kollegin zum Kaffee zu sein, reicht dir auch der Minutenzeiger .... ;-)

Du ziehst als einfach von den aktuellen millis() deine "Zeitmarke" ab und hast automatisch die Differenz.

Überschreitet diese Differenz nun deinen Intervall startest du deine Aktion. Soll nun der Ablauf immer wieder ablaufen setzt du deine "Zeitmarke" wie der auf die aktuelle Zeit.... das Spiel beginnt von vorn.... du gehst also alle 30min zur Kollegin auf einen Kaffee und mußt dafür weder Datum noch Uhrzeit wissen... du mußt nur wissen wie lange es her ist, dass du das letzte mal bei ihr warst... ;-)

Astrojens

Nabend,

so, jetzt läuft es mit millis().
Ich habe jetzt nochmal den Tipp von euch probiert, indem ich millis() - Zeitmarke nehme.
Das funktioniert soweit.
Habe mir auch diese Nachtwächter-Sache mal durchgelesen und jetzt auch verstanden.

Ich bin nicht dumm, ich tu mich nur schwer micht manchen Sachen. Ich denke ich habe die Zusammenhänge soweit verstanden und probiere jetzt mal munter weiter.

Wenn mein Projekt dann endlich mal Form angenommen hat, poste ich mal darüber  :)


Code: [Select]
int ledPin = 12;
int tastPin = 3;


unsigned long Zeitmarke = 0;

void setup() {

pinMode(ledPin, OUTPUT);
pinMode(tastPin, INPUT);
digitalWrite(ledPin, LOW);

}

void loop() {
 
  if ( digitalRead(tastPin) != HIGH )  //Ersetzen ob high oder low gedrücktem Taster entspricht
   {
     Zeitmarke = millis();
 }
   

if ( millis() - Zeitmarke >= 5000 )
   { digitalWrite(ledPin, HIGH);
 }

else
 { digitalWrite(ledPin, LOW);
 }

}


MaHa76

Prima :-)

Es ist gut wenn man sich möglichst früh mit so was befaßt... mein größtes Projekt ist schon bei über 3000 Zeilen Code- mit sehr vielen (über 100) zeitlichen Abhängigkeiten... zum Glück von Anfang an alles mit millis() und nicht mit delays...

Astrojens

 :o Respekt !

Ja mal sehen wie es weiter geht. Ich werd viel mit Shift-Registern und Passwörten arbeiten.
Dafür hab ich aber Librarys, die mir sehr helfen werden  ;)

agmue

#27
Oct 10, 2016, 09:03 pm Last Edit: Oct 10, 2016, 09:03 pm by agmue
:o Respekt !
Ich habe sein Projekt angesehen und schließe mich Dir an :o

Ja mal sehen wie es weiter geht.
Sind kleine stilistische Anmerkungen erlaubt?

Das sind Konstanten:
Code: [Select]
const int ledPin = 12;
const int tastPin = 3;

Internen PullUp-Widerstand nutzen:
Code: [Select]
pinMode(tastPin, INPUT_PULLUP);
Code: [Select]
if ( digitalRead(tastPin) != HIGH )oder
Code: [Select]
if ( digitalRead(tastPin) == LOW )
 oder
Code: [Select]
if ( !digitalRead(tastPin) )
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

MaHa76

och... das sieht nur von außen so groß aus... ;-)    Ich hab das nur dank des Forums hier so hinbekommen... Und es läuft so gut.... :-D Habe schon einige Interessenten die in meiner Wohnung waren und das auch wollen... ganz vorn meine Eltern... jetzt hab ich 2 Wochen geschwitzt die Struktur so zu ändern, dass man die Funktionen die von Wohnung zu Wohnung unterschiedlich sind ganz einfach tauschen kann... :-D   Und wie gesagt das meiste davon- gut 90% verdanke ich dem Forum hier...

Aber was ich draus gelernt habe und versuche jedem mitzugeben, ist sich erst keine "schlechten" Angewohnheiten, wie delay anzueignen.... gleich richtig machen, auch wenn mal die Birne qualmt und es macht viel Spaß, weil die Erfolge schlagartig kommen....

uwefed

Ich bin nicht dumm,
Hat nie jemand gedacht.
Quote
ich tu mich nur schwer micht manchen Sachen.
Bei irgendwelchen Sachen tut sich jeder schwer. Der eine bei den einen und der andere bei anderen.

Wir zwingen Dich nur zu verstenen und dann kannst Du es aus dem ff.  ;)  ;)  ;)  :D  :D
Darum versuchen wir keine Lösungen zu geben sondern einen Lösungsweg den Du selbst beschreiten mußt.

Grüße Uwe

Go Up