Go Down

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

agmue

Wird ihm nicht helfen...
Dann hilft die Verwendung von INTERVAL.h wohl auch nicht:

Code: [Select]
#include <INTERVAL.h>
const byte taster = 8; // interner Pullup, Taster schaltet gegen GND
const byte ledPin[] = { 2, 3, 4, 5};
const byte ledPins = sizeof(ledPin) / sizeof(ledPin[0]);
#define EIN LOW
#define AUS HIGH
#define BLINKZEIT 500
#define PAUSENZEIT 5000
uint32_t blinkIntervall;
enum {WARTEN, RAUF, RUNTER};
byte led, status = WARTEN;

void loop()
{
  if (!digitalRead(taster))
  {
    status = RAUF;
  }
  INTERVAL(blinkIntervall)
  {
    switch (status)
    {
      case WARTEN:
        led = 0;
        break;
      case RAUF:
        digitalWrite(ledPin[led], EIN);
        if (led < ledPins - 1)
        {
          blinkIntervall = BLINKZEIT;
          led++;
        } else {
          blinkIntervall = PAUSENZEIT;
          status = RUNTER;
        }
        break;
      case RUNTER:
        digitalWrite(ledPin[led], AUS);
        if (led > 0)
        {
          blinkIntervall = BLINKZEIT;
          led--;
        } else {
          blinkIntervall = 0;
          status = WARTEN;
        }
        break;
    }
  }
}

void setup()
{
  pinMode(taster, INPUT_PULLUP); // intern PullUp
  for (byte i = 0; i < ledPins; i++)
  {
    digitalWrite(ledPin[i], AUS); // Anfangszustand
    pinMode(ledPin[i], OUTPUT);
  }
}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

combie

Ja, nehme ich auch an...
Wir werden sehen ...
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

ElEspanol

interval ist mein absoluter Favorit, aber vor der Verwendung sollte man das zu Fuss mit millis sicher beherrschen.

dimix100

Dann hilft die Verwendung von INTERVAL.h wohl auch nicht:

Code: [Select]
#include <INTERVAL.h>
const byte taster = 8; // interner Pullup, Taster schaltet gegen GND
const byte ledPin[] = { 2, 3, 4, 5};
const byte ledPins = sizeof(ledPin) / sizeof(ledPin[0]);
#define EIN LOW
#define AUS HIGH
#define BLINKZEIT 500
#define PAUSENZEIT 5000
uint32_t blinkIntervall;
enum {WARTEN, RAUF, RUNTER};
byte led, status = WARTEN;

void loop()
{
  if (!digitalRead(taster))
  {
    status = RAUF;
  }
  INTERVAL(blinkIntervall)
  {
    switch (status)
    {
      case WARTEN:
        led = 0;
        break;
      case RAUF:
        digitalWrite(ledPin[led], EIN);
        if (led < ledPins - 1)
        {
          blinkIntervall = BLINKZEIT;
          led++;
        } else {
          blinkIntervall = PAUSENZEIT;
          status = RUNTER;
        }
        break;
      case RUNTER:
        digitalWrite(ledPin[led], AUS);
        if (led > 0)
        {
          blinkIntervall = BLINKZEIT;
          led--;
        } else {
          blinkIntervall = 0;
          status = WARTEN;
        }
        break;
    }
  }
}

void setup()
{
  pinMode(taster, INPUT_PULLUP); // intern PullUp
  for (byte i = 0; i < ledPins; i++)
  {
    digitalWrite(ledPin[i], AUS); // Anfangszustand
    pinMode(ledPin[i], OUTPUT);
  }
}


Hallo agmue,

Danke für das Programm! das ist richtig gut!
ich kann auch soweit nach vollziehen ,  was du da gemacht hast.

jetzt wollte ich, das case RUNTER so verändern, dass die led 1 zuerst aus geht und dann der Rest, also Alle an, LED1 Aus, LED2 Aus usw...

nur zum Verständnis:
beim RAUF:
Du sagt: variable led=0
dann schreibe mir ledPin[0] auf HIGH, dann kommt die Bedienung:
wenn led (ist 0) kleiner ist als ledPins (14) -1, also Bedienung erfüllt, warte BLINKZEIT, variable led ++ (also +1, Wert 1), schreibe ledPin[1]. dann ist immer noch led (was 1 ist) kleiner als 14 und so geht es weiter...

wenn die Bedienung nicht erfüllt wird ( led =13 = ledPins -1), dann warte PAUSENZEIT und mache Status RUNTER.

Bei RUNTER das selbe Spiel bis var. led = 0 ist. Programmdurchlauf beendet.

Jetzt will ich beim RUNTER dass er mit led 0 anfängt die auszuschalten:

also sage ich:

case RUNTER:
       led=0;     // Muss die var. auf Null setzen
       digitalWrite(ledPin[led], AUS); /7 mach led[0] aus
       if (led < ledPins -1) // Bedienung wie oben, aber led ist wieder 0
       {
         blinkIntervall = BLINKZEIT; // dann warten BLINKZEIT
         led++;                               // led +1
       } else {
         blinkIntervall = 0;
         status = WARTEN;

das funktioniert aber nicht, WIESO???
       }

combie

#49
Feb 19, 2017, 03:24 pm Last Edit: Feb 19, 2017, 03:28 pm by combie
Wie soll led jemals 13 werden können, wenn du bei jedem Durchlauf des Automaten led = 0 machst?

Verwende bitte die Code Tags...

Quote
WIESO???
Und bitte nicht schreien, wir schreien dich ja auch nicht an, oder?
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

dimix100

Quote
Und bitte nicht schreien, wir schreien dich ja auch nicht an, oder?
sorry, ich wollte nicht dass es so rüber kommt als würde ich jemanden anschreien ;-)

die var led wird doch im case RAUF hochgezählt oder nicht?!
und deshalb habe ich die auf Null gesetzt.
Falsch?

combie

#51
Feb 19, 2017, 03:43 pm Last Edit: Feb 19, 2017, 03:50 pm by combie
Quote
die var led wird doch im case RAUF hochgezählt oder nicht?!
Soweit ich das erkennen kann, trifft das zu!

Quote
und deshalb habe ich die auf Null gesetzt.
Ja, schon richtig!
Das led = 0 ist Pflicht, bei dem Verfahren.

Das widerspricht aber alles nicht meiner Aussage!
Ich wiederhole sie auch gerne nochmal:
Wie soll led jemals 13 werden können, wenn du bei jedem Durchlauf des Automaten led = 0 machst?
Was verstehst du an dieser Aussage nicht?


Quote
Falsch?
So wie du es tust: Ja!
Siehst du doch auch: Programm tut nicht das, was du dir wünscht!

---

Und:
Bitte verwende die Code Tags.
Das kannst du auch nachträglich noch ändern.
Alle sagen: Das geht nicht!
Einer wusste das nicht und probierte es aus.
Und: Es ging nicht.

jurs

Falsch?
Habe ich irgendwas nicht mitbekommen?
Ich dachte, das Thema wäre mit #18 von Whandall erledigt und abgeschlossen?
Und jetzt ist heute Nachmittag schon #50 überschritten und noch immer wird über die Programmlogik diskutiert. Allerdings wohl nicht über die Programmlogik von dem, was Whandall in #18 als Sketch gepostet hat.

Ich glaube ich werde zu alt für dieses Forum: Warum werden hier nicht gepostete, funktionierende Sketche kommentiert, sondern stattdessen zu nicht-funktionierenden Sketchepalavert?
Oder funktionierte der Whandall Sketch aus #18 doch nicht so wie gewünscht?

dimix100

Wie soll led jemals 13 werden können, wenn du bei jedem Durchlauf des Automaten led = 0 machst?
Was verstehst du an dieser Aussage nicht?


---

Und:
Bitte verwende die Code Tags.
Das kannst du auch nachträglich noch ändern.
hhmmm,
also, die var led wird doch nur in case WARTEN auf Null gesetzt. ledPins wird in eine const Byte festgehalten, (also Anzahl von Elementen im Array) und die ist 14.
in if Bedienung steht (wenn led (0) kleiner ist als ledPins - 1 (also 14-1 =13) dann führe die Transaktion durch... und in Transaktion wird led++ immer um +1 gezählt bis led (Wert 13 erreicht hat) und die Bedienung nicht mehr erfüllt wird.
dann kommt case RUNTER und danach erst wieder WARTEN, wo die var. led auf Null gesetzt wird.
Also gehe ich davon aus, dass var led mit dem Wert 13 vom case RAUF ins CASE RUNTER übernommen wird. So könnte die led 13 werden.

P.S. was heißt, verwende bitte die Code Tags???

combie

#54
Feb 19, 2017, 04:02 pm Last Edit: Feb 19, 2017, 04:06 pm by combie
Ach Jurs ....
Das verstehst du nicht...

Quote
P.S. was heißt, verwende bitte die Code Tags???
Du sollst die Quellcodeformaterungsmöglichkeiten des Forums nutzen.

Der </> Button über dem Editfeld ist gemeint


Quote
also, die var led wird doch nur in case WARTEN auf Null gesetzt.
Diese Aussage widerspricht dem von dir gepostetem Quellcode.

Quote
Code: [Select]
case RUNTER:
       led=0;     // Muss die var. auf Null setzen

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

jurs

#55
Feb 19, 2017, 04:12 pm Last Edit: Feb 19, 2017, 04:13 pm by jurs
P.S. was heißt, verwende bitte die Code Tags???
Das steht in How to use this forum unter Punkt 7.

dimix100

Ach Jurs ....
Das verstehst du nicht...
Du sollst die Quellcodeformaterungsmöglichkeiten des Forums nutzen.

Der </> Button über dem Editfeld ist gemeint

Diese Aussage widerspricht dem von dir gepostetem Quellcode.

Oh man, jetzt bin ich total durcheinander!
also der ursprungscode war ja so:

Code: [Select]

case RUNTER;
  digitalWriet(ledPin[led], AUS);
  if (led > 0)
    {
      blinkIntervall = BLINKZEIT;
      led--;
     } else {
      blinkIntervall = 0;
      Status = WARTEN;
      }


und in dem Code ist wird die var. led nicht auf Null gesetzt, und die LED's werden von LED14 bis nach 0 abgeschaltet!

jetzt wollte ich dass es von 0 an beginnt abzuschalten, also habe ich vorher led auf Null gesetzt. damit er die var. led hochzählt und die LED's rückwärts ausschaltet. tut er aber nicht.

mein Code:
Code: [Select]

 case RUNTER:
        led = 0;
        digitalWrite(ledPin[led], AUS);
        if (led < ledPins)
        {
          blinkIntervall = BLINKZEIT;
          led++;
        } else {
          blinkIntervall = 0;
          status = WARTEN;
        }


wo ist da der Fehler, das verstehe nicht...

combie

Quote
wo ist da der Fehler, das verstehe nicht..
Wie oft soll der Case Runter durchlaufen werden?
14 mal!
Und jedes mal machst du led = 0
led kann also bestenfalls, für kurze Zeit, 1 werden.



Stimmt es, oder habe ich recht?







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

dimix100

Stimmt es, oder habe ich recht?

Natürlich hast du RECHT!

Jetzt habe ich es hingekriegt!

Code: [Select]

case RAUF:
        digitalWrite(ledPin[led], EIN);
        if (led < ledPins - 1)
        {
          blinkIntervall = BLINKZEIT;
          led++;
        } else {
          blinkIntervall = PAUSENZEIT;
          status = RUNTER;
          led=0;
        }
        break;
      case RUNTER:
        digitalWrite(ledPin[led], AUS);
        if (led < ledPins)
        {
          blinkIntervall = BLINKZEIT;
          led++;
        } else {
          blinkIntervall = 0;
          status = WARTEN;
        }


Danke!

Go Up