Go Down

Topic: LED LEuchtdauer (Read 1 time) previous topic - next topic

noiasca

#15
Apr 06, 2020, 03:59 pm Last Edit: Apr 06, 2020, 04:11 pm by noiasca
möglicherweise reden wir aneinander vorbei.

im Code steht:

    digitalWrite(ledPin, HIGH);
    previousMillis = millis();   // Einschaltzeit "merken"


du fragtest
Quote
Warum ? Ist die Einschaltzeit nicht die Zeit wo ich den Taster betätige ?
die blaue Zeile schaltet den Taster ein.
die rote Zeile merkt sich unmittelbar danach die Zeit.
Das sind zwei Anweisungen.
Gleichzeitig, oder "auf einmal" geht nicht.
Die blaue Zeile merkt sich keine Zeit.
Daher brauchst du die rote auch.
Verständlich?
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

MicroBahner

Nur bei dem 02 kenn ich mich gar nicht aus wüsste nicht wo ich da Parameter ändern muss das ich da was zum laufen bekomme.
Eigentlich musst Du nur die Pinnummern am Amfang anpassen. Aber ich habe gesehen, dass Du nicht den eingebauten PullUp Widerstand verwendest, sondern mit einem externen PullDown arbeitest.

Aber im Prinzip ist es dasselbe wie der Sketch von noiasca, nur dass man sich nicht direkt mit millis() rumschlagen muss:
Code: [Select]
#include <MobaTools.h>

const int buttonPin = 12;
const int ledPin = 2;

MoToTimer Blinkzeit1;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  if (digitalRead(buttonPin) == HIGH) {
    digitalWrite(ledPin, HIGH);
    Blinkzeit1.setTime( 60000L );
  }

  if ( Blinkzeit1.expired() )
  {
    digitalWrite(ledPin, LOW);
  }
}
Gruß, Franz-Peter

odi77

#17
Apr 06, 2020, 04:15 pm Last Edit: Apr 06, 2020, 04:18 pm by odi77
@ noiasca

Sie merkt sich die Zeit wann ich den Schalter betätigt habe und ab da läuft dann die vorgegebene Zeit ? Ist die vorgegebene Zeit die Zeit die es sich merkt oder um welche Zeit geht's da ?Ich glaub da blick ich nicht ganz durch mehr, war jetzt alles schon bissi viel. Entschuldigung...


@Microbahner

Soweit so gut, funktioniert auch problemlos. Was ich nicht verstehe ist allerdings warum es mit Blinkzeit angegeben ist, es blinkt ja nix.



Eine Frage hab ich jetzt zusätzlich noch. Wenn jetzt zb was schief läuft sagen wir mal mit einem Servo das wo was hängt oder so. Kann ich den Taster auch ZUSÄTZLICH damit belegen das er bei neuer Betätigung das Zeitprogramm unterbricht ?

noiasca

#18
Apr 06, 2020, 04:29 pm Last Edit: Apr 06, 2020, 04:35 pm by noiasca
jein.

geh den Code Schrittweise durch, der Controller machts auch nicht anders.

der loop läuft
if (digitalRead(buttonPin) == HIGH) {

ist der erste if true, werden die blaue und rote Zeile ausgeführt.

millis sagen wir hat zu dem Zeitpunkt den wert 2000 also steht in previousMillis auch 2000.

Dann komm es zum zweiten if

millis wird vieleicht schon auf 2002 stehen,


 if (millis() - previousMillis > 60 * 1000UL && digitalRead(ledPin) == HIGH)  // wenn Zeit abgelaufen und die

(2002 - 2000 > 60 * 1000UL)

also
(2 >  60000)
nein ist nicht. Daher wird der if nicht ausgeführt.

Wir kommen ans ende von loop.
Daher beginnt es wieder von vorne:

erster grüner If  ... der Taster ist nicht gedrückt, der Controller geht also drüber
zweiter if

millis hat jetzt etwa 2015
also

if (2015-2000 > 60000)

nein ist immer noch nicht erfüllt.
Zum Ende von loop.
Wieder an den Anfang von loop.
erster If
Zweiter if
etc

Das passiert viele tausende male.
Bis millis mindestens 62.001 ist

ab dann wird diese Bedinung true:
if (62001- 2000 > 60000)

ausrechnen:
60001 > 60000
Bingo! der if ist erfüllt.
JETZT nach 60001 Millisekunden, gehen wir in den zweiten If und schalten die LED aus.
"Systemzeit" ist also 62001, eingeschaltet haben wir um 2000. Also passt. Nach einer Wartezeit von 60 Sekunden haben wir die LED ausgeschaltet.

So, jetzt erfindest einen neuen Zeitstempel wann du die Taste drückst und spielst es selber 60TSD mal durch

how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

MicroBahner

Was ich nicht verstehe ist allerdings warum es mit Blinkzeit angegeben ist, es blinkt ja nix.
Namen sind Schall und Rauch ;) . Wenn Du immer wieder den Taster drückst blinkt es ja 8) .
Du kannst es ja einfach anders benennen.

Eine Frage hab ich jetzt zusätzlich noch. Wenn jetzt zb was schief läuft sagen wir mal mit einem Servo das wo was hängt oder so. Kann ich den Taster auch ZUSÄTZLICH damit belegen das er bei neuer Betätigung das Zeitprogramm unterbricht ?
Du meinst, wenn Du drückst während die Zeit läuft, dass dann die Led vorzeitig ausgeht?
Gruß, Franz-Peter

odi77

@ noiasca

Okee Dankeschön, jetzt raucht mir der Kopf aber ich werd schon dahinterkommen. Fürn Anfang ist das schon ganz schön harter Stoff haha...


@MicroBahner

Verstehe, weil es ja jedesmal auslöst wenn ich drücke kann man es als blinken definieren.

Ja als so eine Art Schutzabschaltung. Sollte dann aber wieder ganz normal laufen bei neuerlicher Betätigung. Aber ich denke mal das würde jetzt den Rahmen sprengen, bin so froh schon über das was ich jetzt schon von euch an Hilfe bekommen habe.

gregorss

Wie gesagt, sieh Dir den „endlichen Automaten" als Strickmuster an. Gleichzeitig ablaufende Dinge sind damit gut in den Griff zu bekommen.

Gruß

Gregor
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

odi77

Werd mal schauen was ich darüber finde, Dankeschön.

MicroBahner

#23
Apr 06, 2020, 05:14 pm Last Edit: Apr 06, 2020, 05:16 pm by MicroBahner
Ja als so eine Art Schutzabschaltung. Sollte dann aber wieder ganz normal laufen bei neuerlicher Betätigung.
Dann wird es ein wenig komplizierter, da Du dann eine Flankenerkennung am Taster brauchst. Und dann must Du ihn auch entprellen. Das könnte dann so aussehen:
Code: [Select]
#include <MobaTools.h>

const int buttonPin = 12;
const int ledPin = 2;

MoToTimer Blinkzeit1;
bool buttonState = false;       // zur Flankenerkennung

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  //Flankenerkennung am Taster
  bool buttonEdge = false; // wird nur im Moment des Drückens true
  if ( digitalRead(buttonPin) == HIGH && buttonState == LOW ) {
    buttonState = HIGH;
    buttonEdge = HIGH;
  } else if ( digitalRead(buttonPin) == LOW ) {
    buttonState = LOW;
  }
  delay(20); // zum Entprellen - hier ganz einfach mit einem kleinen delay realisiert


  if ( buttonEdge ) {
    // Taster wurde gedrückt
    if ( Blinkzeit1.running() ) {
      // Zeit läuft, abbrechen
      Blinkzeit1.stop();
      digitalWrite(ledPin, LOW);
    } else {
      // Zeit läuft nicht, neu starten
      digitalWrite(ledPin, HIGH);
      Blinkzeit1.setTime( 60000L );
    }
  }


  if ( Blinkzeit1.expired() ) {
    digitalWrite(ledPin, LOW);
  }

}
Gruß, Franz-Peter

gregorss

Nicht lange fackeln, lass' Backen wackeln! (Seeed)

odi77

#25
Apr 06, 2020, 05:44 pm Last Edit: Apr 06, 2020, 05:52 pm by odi77
@MicroBahner

Funktioniert einwandfrei, muss aller ehrlich sein das ich den Sketch nicht ganz verstehe. Wie kann ein einfaches delay zum entprellen dienen. Hab mir dazu einige Videos schon angesehen aber da war das wesentlich komplizierter.
Bin es bis dato gewohnt also die paar Tage in denen ich das jetzt mache das ich mit delay eine Laufzeit definiere. Woher weiß nun das Programm das gerade dieses delay als entprellen dient ?

odi77

@ gregorss

Fein fein da hab ich einiges zum lesen und lernen, Dankeschön.

MicroBahner

#27
Apr 06, 2020, 05:55 pm Last Edit: Apr 06, 2020, 06:01 pm by MicroBahner
Um einen mechanischen Taster zu entprellen, musst Du nur dafür sorgen, dass Du ihn nicht zu häufig abfragst. Wenn die Durchlaufzeit deines loop() nicht sehr kritisch ist, reicht es also aus, einfach die Durchlaufzeit etwas zu verzögern. Das macht das delay(20). Damit wird der Taster nur noch alle 20ms abgefragt, und das reicht zum Entprellen.
Edit: es ist deshalb auch vollkommen egal, wo das delay(20) im loop steht ( Ok, nicht in einer if-Abfrage  ;) ). Hauptsache die Durchlaufzeit wird größer.
Ist die loop-Zeit kritisch, und du kannst dir da keine 20ms Umlaufzeit leisten, wird es komplizierter, denn dann musst Du dafür sorgen, dass der Taster nicht mehr in jedem loop-Durchlauf abgefragt wird.
Gruß, Franz-Peter

combie

#28
Apr 06, 2020, 06:01 pm Last Edit: Apr 06, 2020, 06:13 pm by combie
Quote
denn dann musst Du dafür sorgen, dass der Taster nicht mehr in jedem loop-Durchlauf abgefragt wird.
Oder eben die Entprellung "anders" bauen, so dass sie das überlebt.
Unsichtbar wird der Wahnsinn, wenn er genügend große Ausmaße angenommen hat.
(Berthold Brecht)

odi77

@combie & MicroBahner

Wohl ein Thema mit dem ich mich noch ausführlicher beschäftigen werde bzw muss. Ist ja generell sehr vielfältig denk aber das ich mich für die paar Tage schon ganz gut schlage. Ist ja auch ne feine Sache u d interessant. Allein heute Sitz ich schon seit 0700 dran.

Go Up