Go Down

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

odi77

Apr 06, 2020, 01:38 pm Last Edit: Apr 07, 2020, 03:35 am by uwefed Reason: add CODE TAGs </>
Hallo zusammen
Bin relativ kurz erst dabei mich mit dem Thema zu beschäftigen. Bin aber permanent dabei mich zu informieren und am herum testen.
Jetzt steh ich allerdings vor einer Aufgabe die ich absolut nicht meistern kann obwohl ich diese Funktion x-fach auf meiner Modelbahnanlage brauchen würde.
Ich habe mein Board bestückt zum testen mit Taster und LED. Wenn ich den Taster drücke leuchtet sie und wenn ich den Taster loslasse geht sie aus ganz klar.
Jetzt hätt ich aber gerne das wenn ich den Taster betätige die LED zb für sagen wir mal 60 Sek leuchtet und dann wieder ausgeht. Ich hab mich jetzt schon eingehend mit millis beschäftigt aber das will einfach nicht in meinen Kopf rein. Mein momentaner Sketch sieht folgendermaßen aus.

Code: [Select]
const int buttonPin = 12;
const int ledPin = 2;

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

void loop() {
if (digitalRead(buttonPin) == HIGH) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}


Ich finde weder den passenden Befehl für diese Aktion noch würde ich dann wissen wo dieser in meinem Sketch einzufügen wäre.
Könnte mir bitte jemand unter die Arme greifen?

LG Odi77

MicroBahner

Du könntest es mal mit den MobaTools probieren. Da ist ein Beispiel drin, das genau das macht, was Du willst.
Gruß, Franz-Peter

Peter-CAD-HST

Moin odi77

Guck die im IDE das Beispiel "Blink without Delay" an.

Gruss Peter

und gesund bleiben

KISS Q&D - keep calm and carry on - mind the gap - beware of sharks! -

gregorss

#3
Apr 06, 2020, 01:55 pm Last Edit: Apr 06, 2020, 01:56 pm by gregorss
Jetzt hätt ich aber gerne das wenn ich den Taster betätige die LED zb für sagen wir mal 60 Sek leuchtet und dann wieder ausgeht. Ich hab mich jetzt schon eingehend mit millis beschäftigt aber das will einfach nicht in meinen Kopf rein.
Die einfachste Variante wäre, ein delay(60*1000); nach dem Einschalten einzufügen.

Wenn Du mit millis() arbeiten möchtest, musst Du Dir merken, wann gedrückt wurde, z.B. in einer Variablen vom Typ long. In weiteren loop()-Durchläufen testest Du dann, ob diese Variable um 60000 größer als der aktuelle Wert ist, den millis() zurückgibt:

if(millis() - millisMem > 60000)
{ digitalWrite(LEDPIN, LOW); }


Die nächste Überlegung wäre, ob der 60-Sekunden-Intervall bei jedem Tastendruck neu gestartet wird und ob die LED ausgehen soll, obwohl der Taster immer noch gedrückt ist.

Guck z.B. hier.

Gewöhne Dir außerdem an, grundsätzlich und vom Start weg „schönen" Code zu schreiben. Das hilft Dir und anderen, den Überblick zu behalten/zu bekommen.

Gruß

Gregor

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

odi77

@MicroBahner 

Danke für den link aber das funktioniert nicht, hab gesucht an was es liegt aber wird nicht fündig.




@Peter CAD-HST

Hab ich mir geladen aber komm nicht weiter, bin nicht ganz sicher wo ich welche Werte einsetzen soll/muss



@gregorss

Es müssen nicht unbedingt millis sein, das war nur der einzige Weg bzw Anwendung die ich dafür gefunden habe ohne aber zu wissen wie es funktioniert. Die LED soll definitiv nach den zb 60 Sekunden ausgehen. Sind kleine Aktionen auf meiner Modellbahnanlage zb Tastendruck 60 Sekunden Lagerfeuer später auch zb Rauchgenerator oder Servo der nen KRan bewegt etc.


Weitegekommen bin ich jetzt noch nicht. Aber schon mal vielen lieben Dank für euer Bemühen.


noiasca

#5
Apr 06, 2020, 03:12 pm Last Edit: Apr 06, 2020, 03:15 pm by noiasca
in anderen Worten:
millis() ist sozusagen deine System-Uhrzeit.
in previousMillis merkst du dir wann du die LED eingeschalten hast.

wenn die aktuelle Uhrzeit [wieder aus millis()] minus der gemerkten Einschaltuhrzeit größer ist als deine Wunschlaufzeit, dann schaltest die LED wieder ab.

Damit der zweite If nicht immer erfüllt ist und permanent die LED abgeschaltet wird, prüfst du einfach auch ab ob die LED überhaupt noch läuft.

Und vorsicht, previousMillis sollte unsigned sein, millis() hat keine Vorzeichen

kompiliert, aber ungeprüft:
Code: [Select]

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

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

void loop() {
  static uint32_t previousMillis = 0;  // du brauchst eine unsigned integer Variable mit 32bit/4Byte, weil millis() auch so groß werden kann.
  if (digitalRead(buttonPin) == HIGH) {
    digitalWrite(ledPin, HIGH);
    previousMillis = millis();   // Einschaltzeit "merken"
  }

  if (millis() - previousMillis > 60 * 1000UL && digitalRead(ledPin) == HIGH)  // wenn Zeit abgelaufen und die LED leuchtet
  {
    digitalWrite(ledPin, LOW);
  }
}


wenn das klappt, gibst bescheid, dann bauen wir das noch leicht um, sodass du mit den anderen Sachen nicht Troubles bekommst.
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

@MicroBahner 

Danke für den link aber das funktioniert nicht, hab gesucht an was es liegt aber wird nicht fündig.
Was funktioniert denn nicht? ( Du musst die MobaTools natürlich auch installieren - das geht direkt im Bibliotheksmanager der IDE )
Gruß, Franz-Peter

gregorss

#7
Apr 06, 2020, 03:17 pm Last Edit: Apr 06, 2020, 03:17 pm by gregorss
@gregorss
...
Danke für das Feedback!

Sieh Dir unbedingt das Modell des Endlichen Automaten an! Und die MobaTools sind für Modellbaukram eine echt nette Sammlung nützlicher Tools.

Gruß

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

odi77

@ noiasca

Dankeschön das war ja schon Zuviel des guten, das funktioniert genau so wie ich es wollte.


@ MicroBahner

Da muss ich zu meiner Schande gestehen das ich noch nicht weiß wie das funktioniert. Hab schon davon gelesen das es sowas gibt aber noch keine Zeit gefunden mich damit zu befassen. Klingt aber gut das es das gibt wenn es auf der Seite mehrere brauchbare Sachen gibt.


@ gregorss

Mobatools werden umgehend gesichtet und gelernt wie man sie richtig verwendet. So wie ich es Microbahner schon geschrieben habe.

noiasca

... und verstanden auch? Oder gibts noch Fragen?
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

#10
Apr 06, 2020, 03:30 pm Last Edit: Apr 06, 2020, 03:31 pm by MicroBahner
@ MicroBahner

Da muss ich zu meiner Schande gestehen das ich noch nicht weiß wie das funktioniert.
Bibliotheksmanager öffnen ( mit ctrl-shift-I  oder Werkzeuge->Bibliotheken verwalten... ). Dann im Suchfeld oben rechts 'mobatools' eingeben ( groß/Kleinschreibung ist egal ) . Rechts unten auf 'installieren' drücken - fertig.
Dann findest Du unter Datei->Beispiele->MobaTools->Zeitgeber_02  auch das Beispiel.
Gruß, Franz-Peter

odi77

#11
Apr 06, 2020, 03:40 pm Last Edit: Apr 06, 2020, 03:43 pm by odi77
@noiasca

Nein nicht ganz. Da steht bei dem einen Punkt  ( Einschaltzeit merken ). Warum ? Ist die Einschaltzeit nicht die Zeit wo ich den Taster betätige ?


@MicroBahner

Gesagt getan, hab sie jetzt drinnen. 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.



Ich kann mich nur wiederholen, vielen lieben Dank


noiasca

ja schon, aber du kannst bildlich gesprochen in eine Zeile nur eine Anweisung schreiben.
Also schaltest erst den Pin ein, und dann merkst dir Zeit wann du es gemachst hast. Das ist halt ein paar Microsekunden später, mit dieser "Ungenauigkeit" musst halt leben.
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.

odi77

@noiasca

Muss ich die Microsekunden denn irgendwo angeben ? sehen tu ich nix. Oder ist das einfach der normale Vorgang weil ja klar , erst Schalter dann LED.

combie

#14
Apr 06, 2020, 03:55 pm Last Edit: Apr 06, 2020, 04:23 pm by combie
Es gibt verschiedene Möglichkeiten, die Sache anzugehen...
Auch diese Variante nutzt intern das "BlinkWithoutDelay" Konzept.

Code: [Select]


#include <CombiePin.h>
#include <CombieTimer.h>
#include <CombieTypeMangling.h>

using namespace Combie::Millis;

//Combie::Pin::TasterGND<2> taster; // mit pullup, invertierend
Combie::Pin::InputPin<2> taster;    // mit pulldown
Combie::Pin::OutputPin<13> led;
Combie::Timer::FallingEdgeTimer fallingEdge(6_sec);// Nachleuchtdauer

void setup()
{
  //taster.initPullup();// mit pullup
  taster.init();// mit pulldown
  led.init();
}

void loop()
{
  led = fallingEdge = taster;
}


Die nötigen Libraries findest du hier
Unsichtbar wird der Wahnsinn, wenn er genügend große Ausmaße angenommen hat.
(Berthold Brecht)

Go Up