Arduino Forum

International => Deutsch => Topic started by: odi77 on Apr 06, 2020, 01:38 pm

Title: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 01:38 pm
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
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 06, 2020, 01:43 pm
Du könntest es mal mit den MobaTools (https://github.com/MicroBahner/MobaTools) probieren. Da ist ein Beispiel (https://github.com/MicroBahner/MobaTools/blob/master/examples/Zeitgeber_02/Zeitgeber_02.ino) drin, das genau das macht, was Du willst.
Title: Re: LED LEuchtdauer
Post by: Peter-CAD-HST on Apr 06, 2020, 01:45 pm
Moin odi77

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

Gruss Peter

und gesund bleiben

Title: Re: LED LEuchtdauer
Post by: gregorss on Apr 06, 2020, 01:55 pm
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 (http://html.szaktilla.de/weekender/4.html).

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

Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 03:12 pm
@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.

Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 06, 2020, 03:12 pm
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.
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 06, 2020, 03:16 pm
@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 )
Title: Re: LED LEuchtdauer
Post by: gregorss on Apr 06, 2020, 03:17 pm
@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
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 03:24 pm
@ 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.
Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 06, 2020, 03:27 pm
... und verstanden auch? Oder gibts noch Fragen?
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 06, 2020, 03:30 pm
@ 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.
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 03:40 pm
@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

Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 06, 2020, 03:43 pm
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.
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 03:48 pm
@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.
Title: Re: LED LEuchtdauer
Post by: combie on Apr 06, 2020, 03:55 pm
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 (https://forum.arduino.cc/index.php?topic=675418.msg4546900#msg4546900)
Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 06, 2020, 03:59 pm
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?
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 06, 2020, 04:00 pm
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);
  }
}
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 04:15 pm
@ 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 ?
Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 06, 2020, 04:29 pm
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

Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 06, 2020, 04:30 pm
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?
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 04:41 pm
@ 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.
Title: Re: LED LEuchtdauer
Post by: gregorss on Apr 06, 2020, 04:44 pm
Wie gesagt, sieh Dir den „endlichen Automaten" als Strickmuster an. Gleichzeitig ablaufende Dinge sind damit gut in den Griff zu bekommen.

Gruß

Gregor
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 04:48 pm
Werd mal schauen was ich darüber finde, Dankeschön.
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 06, 2020, 05:14 pm
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);
  }

}
Title: Re: LED LEuchtdauer
Post by: gregorss on Apr 06, 2020, 05:41 pm
Werd mal schauen was ich darüber finde, Dankeschön.
Meine Lieblingslinks dazu:
Die Nachtwächter-Erklärung (https://forum.arduino.cc/index.php?topic=423688.0)
Eine Anleitung von agmue (auch hier im Forum) (https://forum.arduino.cc/index.php?topic=335352.0)
Mein Gesabbel zum Thema (http://html.szaktilla.de/weekender/4.html)

und wenn Du's eher trocken magst:

https://de.wikipedia.org/wiki/Endlicher_Automat (https://de.wikipedia.org/wiki/Endlicher_Automat)

Gruß

Gregor
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 05:44 pm
@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 ?
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 05:52 pm
@ gregorss

Fein fein da hab ich einiges zum lesen und lernen, Dankeschön.
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 06, 2020, 05:55 pm
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.
Title: Re: LED LEuchtdauer
Post by: combie on Apr 06, 2020, 06:01 pm
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.
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 06, 2020, 06:13 pm
@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.
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 06, 2020, 06:39 pm
Na dann erstmal weiterhin viel Spaß. Arduino und Modellbahn passen jedenfalls sehr gut zusammen 8)
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 07, 2020, 09:16 am
Gute Morgen, eine Frage hat mich in der Nacht noch ein wenig beschäftiget. Bei meiner Modellbahn hab ich dann ja mehrere solcher Tasteraktionen, wie schaffe ich es da jetzt auch mehrere Sketches gleichzeitig am arduino am laufen zu haben. Bis jetzt hab ich ja immer nur einen hochgeladen.
Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 07, 2020, 10:15 am
du kannst nur "einen" Sketch hochladen.

Du kannst mit viel Wissen aber all deine Sketches zu einem großen Monster zusammenfügen und dann am Arduino laden.

so wie es bei Franz-Peter aufgebaut ist, sollte es ein leichtes sein, weitere Taster, weitere LEDs hinzuzufügen.

Ich würde es an deiner Stelle dennoch noch zu Fuß machen um Sicherheit mit dem Umgang von millis() zu bekommen.

zunächst mal alles was zusammengehört in eine eigene Funktion geben
Code: [Select]

/*
  by noiasca
*/

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

void handleButtonAndLed()              // eine zusammenfassende Funktion die den Button ausliest und gegebenenfalls die LED abschaltet
{
  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);
  }
}

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

void loop() {
  handleButtonAndLed(); // den handle so oft wie möglich im loop aufrufen.
}


Wenn die Logik für die anderen Tasten/LEDs gleich ist, könnte man daraus eine Klasse machen, und dann ist es nur mehr eine Frage von Pin's hinzunehmen und genießen. Wenn du das mit der Funktion verstanden hast, gib bescheid, dann zeige ich dir den nächsten Schritt.
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 07, 2020, 10:30 am
@noisca,
Dann werde ich wohl noch ein paar Monate brauchen um meine Funktionen so steuern können wie ich sie gerne hätte. Macht aber nix will ja auch was lernen dabei. Wie gestern aber schon angemerkt ist das doch schon ganz harter Stoff für jemanden der absolut keine Ahnung hat/hatte von sowas haha
Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 07, 2020, 10:39 am
paar Monate ist doch nichts, wie lange hast für deine Bahn gebraucht?
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 07, 2020, 11:11 am
Ende nie  :smiley-wink:
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 07, 2020, 03:17 pm
Ich würde es an deiner Stelle dennoch noch zu Fuß machen um Sicherheit mit dem Umgang von millis() zu bekommen.
Ich weis, dass da die Meinungen auseinandergehen. Aber meiner Meinung nach muss man den direkten Umgang mit millis() nicht unbedingt wissen, wenn es Libs dazu gibt. Das Arduino-System ist ja prinzipell eher dazu gedacht, möglichst viel zu 'verstecken' und damit einen einfachen Zugang zu vielen Funktionalitäten zu ermöglichen. Wenn ich pinMode, digitalWrite und digitalRead nutze, muss ich ja auch nicht die darunterliegenden Portregister und Bitmasken kennen.
Wichtiger ist es meiner Meinung nach, das Prinzip der blockadefreien Programmierung zu verstehen. Und das ist einfacher, wenn man sich nicht auch noch mit den Details der millis() rumschlagen muss. Aber das muss er letztendlich selbst entscheiden.


Bei meiner Modellbahn hab ich dann ja mehrere solcher Tasteraktionen, wie schaffe ich es da jetzt auch mehrere Sketches gleichzeitig am arduino am laufen zu haben.den.
Wie noiasca schon schrieb, geht das nicht mit mehreren Sketches. Vielmehr muss man alles in einen Sketch stopfen. Aber die MobaTools hießen ja nicht so, wenn es da nicht noch mehr gäbe als den Timer ;) .
Wichtig ist allerdings, dass Du dich mit Arrays und (for-) Schleifen beschäftigst. Das sind ganz grundlegende Programmierkenntnisse, die man unbedingt braucht, wenn es etwas komplexer wird.

Dann bieten dir die MobaTool auch noch die Verwaltung von vielen Tastern an. Allerdings musst Du die Taster zwischen den Pin und Gnd anschließen. Einen zusätzlichen Widerstand brauchst Du dann nicht mehr.
Damit kannst Du den Sketch dann recht einfach erweitern - hier erstmal für 5 Taster:
Code: [Select]
#include <MobaTools.h>

// Definition der Taster und zugehörigen Ausgänge
// Die Taster müssen zwischen dem Pin und Gnd angeschlossen werden, ein
// Widerstand ist nicht notwendig.

// Festlegen der Anschlußpins
const byte buttonPins[] = { 15, 16, 17, 18, 19 };
const byte ledPins[]    = {  2,  3,  4,  5,  6};
const int effektDauer[] = { 10, 20,  5, 30, 60 }; // Dauer in Sekunden
const byte effektZahl = sizeof(buttonPins); // buttonPins MUSS als byte definiert sein

MoToTimer EffektZeit[effektZahl];
MoToButtons Taster( buttonPins, effektZahl, 20, 500 ) ;  // 20ms Entprellzeit, 500ms für den Unterschied kurz/lang gedrückt.

void setup() {
  for (byte i = 0; i < effektZahl; i++)  {
    // Die Taster müssen zwischen Pin und Gnd angeschlossen sein
    pinMode(buttonPins[i], INPUT_PULLUP);
    pinMode(ledPins[i], OUTPUT);
  }
}

void loop() {
  Taster.processButtons(); // Verwalten der Tasterpins;

  for ( byte i = 0; i < effektZahl; i++ ) {
    // Schleife über alle Taster
    if ( Taster.pressed(i) ) {
      // Taster wurde gedrückt
      if ( EffektZeit[i].running() ) {
        // Zeit läuft, abbrechen
        EffektZeit[i].stop();
        digitalWrite(ledPins[i], LOW);
      } else {
        // Zeit läuft nicht, neu starten
        digitalWrite(ledPins[i], HIGH);
        EffektZeit[i].setTime( effektDauer[i]*1000L );
      }
    }
    if ( EffektZeit[i].expired() ) {
      digitalWrite(ledPins[i], LOW);
    }
  }
}

Auf bis zu 16 Taster und Ausgänge kannst Du das nun ganz einfach aufbohren, indem Du einfach die Arrays am Anfang des Sketches entsprechend verlängerst. Sollen es mehr werden ( bis zu 32 ) geht das auch noch mit einer einzigen zusätzlichen Zeile.
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 07, 2020, 04:20 pm
@MicroBahner

Wenn ich ehrlich bin ist jetzt der Punkt wo mich alles nur noch mehr verwirrt und ich der Meinung bin das einfach Kippschalter manuell zu bedienen die einfachere Lösung wäre. Fühl mich gerade so als müsste ich Glück haben das ich aufrecht gehen kann. Bisher hat mich noch nix so gefordert wie dieser kleine Arduino hahaa…..
Wenn man sich dann so Videos auf YouTube ansieht bzw Foren durchsucht wie einfach das doch alles aussieht kommt man schon ins zweifeln.
Aber wird schon werden...
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 07, 2020, 04:29 pm
Aber wird schon werden...
Genau so muss man das sehen. Es ist ja  noch kein Meister vom Himmel gefallen. Wenn Du ein paar Grundlagen (s.o.) intus hast, sieht die Welt schon ganz anders aus.
Vielleicht hilft dir auch die Referenz (https://www.arduinoforum.de/referenz.php) aus dem Nachbarforum beim Einarbeiten.
Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 07, 2020, 05:09 pm
ja so ein "Nachlauf-Relais" könntest du klassisch mit einem RC-Glied auch machen. Vermutlich hat der C-Apotheke dafür sogar ein paar Fertigmodule oder Bausätze.
Aber stell dir vor, du brauchst nicht eins sondern 20, einige mit 6 Sekunden, einige mit 10 Sekunden, einige mit 14 Sekunden. In einem Sketch ist das jeweils eine Zeile ändern, neu flashen und läuft!

in Hardware lötest 6 deiner 20 Module um.

Und das war nur ein Anwendungsfall.

Ein Master-Ein, ein Notaus Button, eine Kindersicherung ... einfach entsprechende Buttons dazu definieren, neu kompilieren, neue Buttons anschließen - funktioniert.

Das sind die Vorteile die so ein Microcontoller dir bietet.
 
Title: Re: LED LEuchtdauer
Post by: odi77 on Apr 08, 2020, 07:41 pm
@MicroBahner

Danke für den link, noch mehr zum lesen und lernen. Zeit hab ich ja jetzt dank Kurzarbeit.

@noiasca

C Apotheke muss ich gleich mal googeln,  Nur eine Zeile ändern Trau ich mir fast schon zu haha..
Ja notaus hätte ich gerne bei allen meiner Tasteraktionen dabei denn man weiß nie was auf der Modellbahn passiert. Da will ich lieber auf Nummer sicher gehen.
Title: Re: LED LEuchtdauer
Post by: postmaster-ino on Apr 08, 2020, 08:36 pm
Auch Blauer Claus genannt? Conrad-Elektronik (die C-Apotheke, weil Vieles unangemessen teuer)
Title: Re: LED LEuchtdauer
Post by: gregorss on Apr 08, 2020, 08:51 pm
Nochmal der Tipp: Sieh Dir das Modell eines Endlichen Automaten an.

Und schlag' Dich dafür auch mit millis() herum, auch wenn man das dank vieler Bibliotheken nicht unbedingt muss. Mit einem Endlichen Automaten bekommst Du etwas wie Gleichzeitigkeit prima ohne Bibliotheken hin. Auch die „gleichzeitige" Abfrage von n Tastern.

Aber ich stehe halt auch eher auf Landkarten als auf Navi.

Gruß

Gregor
Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 08, 2020, 09:36 pm
noch mehr zum lesen und lernen. Zeit hab ich ja jetzt dank Kurzarbeit.
na dann.

hab hier mal quasi extra für dich zusammengefasst (http://werner.rothschopf.net/202003_arduino_retriggerbares_nachlaufrelais.htm).

ich weis der Ausflug zu OOP ist vieleicht eine Spur zu weit, aber es passt halt so gut.

Frei nach dem Motto:
Bis zur Unendlichkeit und noch viel weiter!
(Cpt. Buzz Lightyear, Toystory)
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 09, 2020, 09:34 am
Ist ja echt toll, was Du da zusammengestellt hast  8)  . Aber meinst Du nicht, dass Du mit OOP unseren odi77 doch schwer überforderst und eher abschreckst? . Er steht doch noch sehr am Anfang und sollte sich erstmal mit einfachen Strukturen und Arrays beschäftigen. Mit solchen 'Basics' fängt ja auch jedes C++ Buch an.

Wenn jemand Englisch lernen soll, gibst Du ihm doch auch nicht gleich nach der 3. Unterrichtsstunde Shakespeare zu lesen  ;)  .

@odi77: Für dich als Modellbahner ist vielleicht auch dieses Tutorial (https://www.stummiforum.de/viewtopic.php?f=21&t=163493) was. Da habe ich den Moba Kollegen versucht zu erklären, wie man auf dem Arduino ohne delay arbeitet, und mehrere unterschiedliche Dinge 'quasi gleichzeitig' abarbeiten kann.
Title: Re: LED LEuchtdauer
Post by: combie on Apr 09, 2020, 09:53 am
Ich finde das gut!

Ein Problem in mehreren Varianten ausgerollt.
Da kann sich dann jeder das raussuchen, was ihm am besten schmeckt.

Und nein!
Ein gutes C++ Buch fängt nicht mit Arrays und Strukturen an.
Sondern klärt als erstes die OOP Begrifflichkeiten und das wozu OOP gut ist.
Erst Referenzen dann Zeiger.
Das sind die sinnvollen Reihenfolgen.

Ich selber, halte jede Art von Informationszurückhaltung, mit dem Argument "Der Anfänger versteht das noch nicht" für verwerflich, arrogant und gemein.
Das ist meine private Ansicht.


Title: Re: LED LEuchtdauer
Post by: noiasca on Apr 09, 2020, 10:25 am
OT:
Grundsätzlich ist ja das geschriebene Stufenweise aufgebaut. Wenn jemand bei den Arrays aufhören will, hört er da halt auf und hat trotzdem einen (wie ich finde) passablen Code.

ich habe lange gehadert, ob ich den OOP part noch dazu nehmen. Vieleicht trenne ich das noch raus. Weis noch nicht.

vieleicht kommt noch ein Schrit in der prozeduralen dazu, die zwei Arrays (oder doch alle drei?) in eine Struktur zu bringen. Fände ich passend und dann gäbe es noch einen Grund mehr den Übergang zu OOP zu schaffen.

OOP halt aus meiner Sicht einfach der nächste logische Schritt.

OT2:
Ich habe sowieso den Eindruck dass man die Leute viel zu spät zu OOP lässt. Selbst auf die Gefahr hin dass ich mich wiederhole, in fast jeder Lib sind Klassen, jeder included irgendwelche Header-Dateien und legt irgendwelche Objekte an. Ja warum soll man dass dann nicht auch scheibchenweise den Leute näherbringen, was sie da eigentlich tun.

Nichts desto trotz, danke euch beiden für eurer Feedback. Meist fliesen eure Rückmeldungen ein oder regen zumindest zum Verbessern an.
Title: Re: LED LEuchtdauer
Post by: MicroBahner on Apr 09, 2020, 10:46 am
Ich finde das gut!
Grundsätzlich finde ich das auch toll, was noiasca da erstellt hat ( habe ich ja auch gesagt ). Und für alle 'Fortgeschrittenen' die hier mitlesen ist es eine super Zusammenstellung, wie man so etwas machen kann.

Nur 'didaktisch' für einen Anfänger halte ich persönlich es nicht für den richtigen Weg. OK, er kann es einfach ignorieren, und erstmal unter 'kann man machen - muss man aber nicht'  abhaken.
Das ganze Arduino System ist ja erstmal darauf ausgelegt, mit möglichst einfachen Mitteln viel Funktionaität zu erreichen (Dazu dienen ja auch die vielen Lib's). Und nicht jeder, der z.B. auf seiner Moba ein paar Gimmiks damit steuern will, möchte den Arduino nun zu seinem zentralen Hobby machen und tief einsteigen ( und z.B. auch selbst Lib's schreiben ). Wer mit der Zeit 'Blut leckt' und mehr will, kommt von alleine dahin - bzw. wird danach fragen.

Ich wollte hier aber keine Grundsatzdiskussion anzetteln und den Thread 'kapern'. Das bringt den TO auch nicht weiter. Insofern ärgere ich mich fast schon über meinen Post  :smiley-confuse: . Deshalb werde ich zu dem Thema hier nichts mehr schreiben. Die Meinungen gehen da nunmal sowieso ziemlich auseinander und den einzig richtigen Weg gibt es eh nicht.
Title: Re: LED LEuchtdauer
Post by: combie on Apr 09, 2020, 11:37 am
Quote
und den einzig richtigen Weg gibt es eh nicht.
Da hast du voll Wahr!

Leitmotiv:
Wer zuerst die prozedurale Programmierung lernt, ist für die OOP verdorben.
Hat es zumindest viel schwerer.
(habe ich in meinem Umfeld mehrfach so erlebt)
Das ist auch mittlerweile bei den Ausbildern angekommen.