Go Down

Topic: Lauflicht ohne delay mit Unterbrechung (Read 4693 times) previous topic - next topic

dimix100

Hi,
ich verwende einen Arduino Relais Board mit 16 Kanälen. Einer Ausgang schaltet über das Relais ein LED Band.
Das Arduino mega kann 40mA pro Ausgang. Die Ansteuerung der Relais benötigt 10mA den Rest übernimmt externe Spannungsversorgung.
Gruß

dimix100

Ach, noch was.
Aus oben beschrieben Grund brauche ich keine PMW Ansteuerung.
Die wäre Contra produktiv!

jurs

#17
Feb 16, 2017, 05:05 pm Last Edit: Feb 16, 2017, 05:09 pm by jurs
0 alles aus, 1 die erste LED leuchtet.... .... 14 die ersten 14 LEDs leuchten ... 27 die erste leuchtet.
Die Dauer aller Schritte ist 0,5 Sekunden, nur im Schritt 14 sollen es 10 Sekunden sein.
Ein Tastendruck (re)startet die Sequenz in Schritt 1.
Habe ich jetzt die vom Themenstarter beschriebene Programmlogik falsch verstanden oder Du?

Ich hatte es so verstanden:
- 14 LEDs sollen nacheinander von der ersten bis zur vierzehnten angehen
- wenn alle 14 an sind, soll sich 10 Sekunden lang nichts ändern
- danach sollen die LEDs in derselben Reihenfolge, von der ersten bis zur vierzehnten wieder ausgehen.
Nach meinem Verständnis wäre die zuletzt leuchtende einzelne LED dann die vierzehnte, bevor wieder alles aus ist.

Aber Du scheinst die LEDs in umgekehrter Reihenfolge ausuischalten  wie einzuschalten. so dass die zuletzt leuchtende einzelne LED die erste LED ist und nicht die vierzehnte.
Das habe ich irgendwie anders verstanden.

Whandall

#18
Feb 16, 2017, 05:09 pm Last Edit: Feb 16, 2017, 05:24 pm by Whandall Reason: Kode hinzugefügt, dann eine Variable umbenannt
Ich habe "im selben Muster wieder ausgehen" als "das Ganze rückwärts" verstanden.

Aber Ausgehenlassen geht fast genauso
Code: [Select]
#include <Bounce2.h>

const byte ledPin[] = { 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37};
const byte tastenPin = 50;
const byte ledPins = sizeof(ledPin) / sizeof(ledPin[0]);

Bounce Taste;

void setup() {
  Taste.attach(tastenPin, INPUT_PULLUP);
  for (byte i = 0; i < ledPins; i++) {
    pinMode(ledPin[i], OUTPUT);
  }
}

void loop() {
  static unsigned long letzteAktion;
  static unsigned long dauerDiesesSchritts;
  static byte zustand;
  unsigned long topLoop = millis();
  if (Taste.update() && Taste.fell()) {
    zustand = 1;
    dauerDiesesSchritts = 1;
  }
  if (dauerDiesesSchritts && topLoop - letzteAktion >= dauerDiesesSchritts) {
    letzteAktion = topLoop;
    bool zweitePhase = zustand > ledPins;
    byte anzahlAusgewaehlterLeds = zweitePhase ?  zustand - ledPins : zustand ;
    for (byte i = 0; i < ledPins; i++) {
      digitalWrite(ledPin[i], zweitePhase ^ (i < anzahlAusgewaehlterLeds));
    }
    dauerDiesesSchritts = zustand == ledPins ? 10000 : 500;
    if (++zustand > 2 * ledPins) {
      dauerDiesesSchritts = 0;
    }
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

dimix100

Ich hatte es so verstanden:
- 14 LEDs sollen nacheinander von der ersten bis zur vierzehnten angehen
- wenn alle 14 an sind, soll sich 10 Sekunden lang nichts ändern
- danach sollen die LEDs in derselben Reihenfolge, von der ersten bis zur vierzehnten wieder ausgehen.
Nach meinem Verständnis wäre die zuletzt leuchtende einzelne LED dann die vierzehnte, bevor wieder alles aus ist.

So habe ich es auch gemeint!
Alles richtig verstanden!

Whandall

Du siehst ja, wie simple beide Varianten sind, und wie wenig sich die unterscheiden müssen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

dimix100

Wie gesagt,
ich probiere es heute abend aus und melde mich.
Gruß

Whandall

Möglicherweise musst du die Logik des digitalWrite() für die Relais noch umkehren und am Anfang alle Pins auf High setzen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

dimix100

Danke für den Hinweis.
Ich teste es.
Gruß

dimix100

Hallo Whandall,

ich habe das Programm getestet und es funktioniert! Doch 2 Sachen stimmen nicht ganz.
1. du hast Recht, die Logik für die Relais muss man umkehren. Das kriege ich nicht hin. Egal was ich versuche, meckert der Compiler. Wie soll ich das am besten machen?
2. der Taster (re)startet das Programm zu abrupt!
Es soll eine Treppensteuerung sein. D.h. mit einem Bewegungsmelder (Eingangspin) soll das Programm aktiviert werden. Dann gehen led's (eingebaut in Stufen) nach und nach an bis alle an sind und gehen nach 10s wieder nach und nach aus. Doch es kann sein dass im Ausschaltprozess wieder einer die Treppen passieren möchte. Da soll der Prozess neu gestartet werden, aber die led die noch an sind dürfen nicht abrupt abgeschaltet werden. Die sollen ja ihr Zyklus zu ende abarbeiten.
Ich weis nicht ob du mich verstehst, was ich meine. Ich hiffe, dass ich mich verständlich ausgedrückt habe.
Wenn nicht ist nicht schlimm, du hast mir sehr geholfen!

Falls du mir weiterhin helfen möchtest, nehme ich die Hilfe gerne an. Danke
Gruß

dimix100

Und das Programm läuft erst dann an, wenn ich den Taster drücke und loslassen. Also erst beim loslassen.
Es wäre gut wenn es schon beim drücken starten könnte.
Ich würde es selber machen, aber dazu fehlt mir das Verständnis. Ich bin in der Materie nicht so fit und verstehe die Hälfte des Codes nicht ganz.
Sorry, schwerer Fall ne?! ;-)
Gruß

Whandall

#26
Feb 17, 2017, 09:10 am Last Edit: Feb 17, 2017, 09:48 am by Whandall Reason: quote und Kommentare
Du hast nicht verraten wie du deine Taste verdrahtet hast, ich habe den internen Pullup benutzt.
Du scheinst keinen oder einen externen Pulldown zu verwenden.

Quote
2. der Taster (re)startet das Programm zu abrupt!
Wann bzw wie. soll er denn sonst die Vorgabe erfüllen?

Quote
ein Lauflicht auslösen. Jede der 14 LED soll dazwischen 0,5s Pause haben. Wenn alle LED's an sind, dann bleiben für 10s alle an und dann sollen im selben Muster auch alle ausgehen mit 0,5 sek Verzögerung.
und unwidersprochen:
Quote
Ich verstehe dich so, dass der Taster die Sequenz sofort wieder neu starten soll, egal ob sie schon fertig war oder noch nicht.
Code: [Select]
#include <Bounce2.h>

const byte ledPin[] = { 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37};
const byte tastenPin = 50;
const byte ledPins = sizeof(ledPin) / sizeof(ledPin[0]);

Bounce Taste;

void setup() {
  //Taste.attach(tastenPin, INPUT_PULLUP);  // intern PullUp
  Taste.attach(tastenPin);              // extern PullDown
  for (byte i = 0; i < ledPins; i++) {
    pinMode(ledPin[i], OUTPUT);
    digitalWrite(ledPin[i], HIGH); // Anfangszustand
  }
}

void loop() {
  static unsigned long letzteAktion;
  static unsigned long dauerDiesesSchritts;
  static byte zustand;
  unsigned long topLoop = millis();
  if (Taste.update() && Taste.rose()) { // oder fell() für PullUp
    zustand = 1;
    dauerDiesesSchritts = 1;
  }
  if (dauerDiesesSchritts && topLoop - letzteAktion >= dauerDiesesSchritts) {
    letzteAktion = topLoop;
    bool zweitePhase = zustand > ledPins;
    byte anzahlAusgewaehlterLeds = zweitePhase ?  zustand - ledPins : zustand ;
    for (byte i = 0; i < ledPins; i++) {
      digitalWrite(ledPin[i], !(zweitePhase ^ (i < anzahlAusgewaehlterLeds))); // das ! kehrt die Logik um
    }
    dauerDiesesSchritts = zustand == ledPins ? 10000 : 500;
    if (++zustand > 2 * ledPins) {
      dauerDiesesSchritts = 0;
    }
  }
}
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

combie

#27
Feb 17, 2017, 09:53 am Last Edit: Feb 17, 2017, 10:29 am by combie
Quote
Ich würde es selber machen, aber dazu fehlt mir das Verständnis. Ich bin in der Materie nicht so fit und verstehe die Hälfte des Codes nicht ganz.
Lerne!
Schreib es selber!


Also, wenn ich mir die Arbeit gemacht hätte, dir so ein Programm, nach deinen Anforderungen zu schreiben...
Und du sagst mir dann: Nee, dass entspricht zwar meinen Anforderungen, ist aber doch nicht das was ich will, denn eigentlich habe ich ganz andere Anforderungen, und sowieso denke ich mir dauernd neue Anforderungen aus...
Dann wäre ich frustriert!
Enttäuscht!

Aus meiner Sicht, solltest du alles daran setzen, deine Probleme selber zu lösen!


Also nicht vor den Apfelbaum stellen, und solange jammern, bis dir einer einen Apfel in den Mund steckt. Sondern selber den Arm ausstrecken, Mühe geben.
Selber die Leiter zum Baum tragen.

Ja, das dauert etwas, bis man das gelernt hat!
Programmieren ist ein Ausbildungsberuf... 3,5 Jahre dauert es, für die Grundlagen!
ca. 0,5 Jahre für jedes weitere Spezialgebiet.


Aus meiner langjährigen Foren Erfahrung, sehe ich folgendes:
--
Quote
Ich würde es selber machen, aber dazu fehlt mir das Verständnis. Ich bin in der Materie nicht so fit und verstehe die Hälfte des Codes nicht ganz.
Je öfter du das vor dich hin plapperst, desto fester glaubst du selber daran!
Das nennt man Selbstsuggestion.
Also, je öfter aufgesagt, desto stabiler wird der Zustand.
--
Mag sein, dass ich mich in dir irre....
Aber ich habe sowas schon zu oft erlebt ...

Vielleicht kann man das nicht vergleichen, da ihr unterschiedliche Personen seid, aber hier ist so jemand: Topic: Falsche Ausgabe, komm nicht drauf warum
Weit über 1000 Postings auf der Uhr, aber immer noch nicht gelernt selber zu denken...
ca 5 Jahre diese Einstellung.... so kann es kommen ....

Also, Wenn ich was verstehen will, dann sage ich mir:
"Ich werde das lernen!"
"Ich will das verstehen!"
"Wenn auch noch nicht heute, oder morgen, aber sicher nächste Woche!"

Und nicht: "Ich bin zu doof, ich bin zu klein, ich bin so unwissend."
Denn, selbst wenn es stimmen würde, dann blockiert man sich immer noch selber damit.
Man blockiert seine eigene Entwicklung.
Und das, ohne jede Not...
Das mag ich nicht unterstützen.



PS:
Das schreiben dieses Textes hat ähnlich viel Mühe gekostet, wie das schreiben deines Programms kosten würde.

Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Whandall

@combie:

Das schreiben dieses Textes hat ähnlich viel Mühe gekostet, wie das schreiben deines Programms kosten würde.
Wenn dann mal endlich feststünde was genau auf welcher Hardware erreicht werden soll.  ;)

Die Anzahl von Posts ist nur ein sehr grober Hinweis auf Lern-Willen oder Bereitschaft, speziell bei kleinen Zahlen.

Ansonsten gebe ich dir absolut recht, besonders bei dem NLP Effekt.
Ich persönlich bin lieber größenwahnsinnig als depressiv.  8)

@dimix100:

Ich erkläre dir die Zeilen die du nicht verstehst, keine Angst.

Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

combie

Quote
Die Anzahl von Posts ist nur ein sehr grober Hinweis auf Lern-Willen oder Bereitschaft, speziell bei kleinen Zahlen.
Das stimmt, ist nicht mehr als ein Indiz.

Aber die häufig zu sehende Entwicklung ist ein Grund für mich, möglichst früh zu versuchen, den sich abzeichnenden Teufelskreis zu unterbrechen.

Naja....

Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

Go Up