Go Down

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

MicroBahner

Na dann erstmal weiterhin viel Spaß. Arduino und Modellbahn passen jedenfalls sehr gut zusammen 8)
Gruß, Franz-Peter

odi77

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.

noiasca

#32
Apr 07, 2020, 10:15 am Last Edit: Apr 07, 2020, 10:30 am by noiasca
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.
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

@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

noiasca

paar Monate ist doch nichts, wie lange hast für deine Bahn gebraucht?
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


MicroBahner

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.
Gruß, Franz-Peter

odi77

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

MicroBahner

#38
Apr 07, 2020, 04:29 pm Last Edit: Apr 07, 2020, 04:30 pm by MicroBahner
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.
Gruß, Franz-Peter

noiasca

#39
Apr 07, 2020, 05:09 pm Last Edit: Apr 07, 2020, 05:12 pm by noiasca
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.
 
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

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

postmaster-ino

Auch Blauer Claus genannt? Conrad-Elektronik (die C-Apotheke, weil Vieles unangemessen teuer)
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

gregorss

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
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

noiasca

#43
Apr 08, 2020, 09:36 pm Last Edit: Apr 08, 2020, 09:37 pm by noiasca
noch mehr zum lesen und lernen. Zeit hab ich ja jetzt dank Kurzarbeit.
na dann.

hab hier mal quasi extra für dich zusammengefasst.

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)
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

#44
Apr 09, 2020, 09:34 am Last Edit: Apr 09, 2020, 09:36 am by MicroBahner
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 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.
Gruß, Franz-Peter

Go Up