LED LEuchtdauer

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

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

Gruß

Gregor

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

odi77:
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:

#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);
  }

}

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

Meine Lieblingslinks dazu:
Die Nachtwächter-Erklärung
Eine Anleitung von agmue (auch hier im Forum)
Mein Gesabbel zum Thema

und wenn Du's eher trocken magst:

Gruß

Gregor

@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 ?

@ gregorss

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

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 :wink: ). 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.

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.

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

Na dann erstmal weiterhin viel Spaß. Arduino und Modellbahn passen jedenfalls sehr gut zusammen 8)

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.

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

/*
  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.

@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

paar Monate ist doch nichts, wie lange hast für deine Bahn gebraucht?

Ende nie :wink:

noiasca:
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.

odi77:
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 :wink: .
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:

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

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

odi77:
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 aus dem Nachbarforum beim Einarbeiten.

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.