Led lichter unterschiedlich steuern

Guten Tag, hab ich da mal ne frage an die Experten unter euch :wink:

Ich habe 5 Variablen die sich durch ein Touchscreen auf 1 oder 0 stellen lassen. (jenachdem was für eine Option ich auswähle), zudem ist jeder Variable eine Zeit einstellbar.

Ich kann also bei einem Durchgang alle Variablen auf 1 setzen. Zudem sollen dann dadurch alle 5 LEDs angehen und für eine bestimmte Zeit anbleiben aber jenachdem wie ich die Zeit am regler einstelle diese dann unterschiedlich ausgehen.

Habe es zwar mit einer Schritt Kette geschafft dennoch wenn ich bei den 5 Variablen immer die selbe Zeit einstelle arbeitet er mir das nach einander ab und nicht gleichzeitig und somit gehen zb alle 5 LEDs nach 5 sek. Jeweils immer aus.

Kann mir da jemand weiter helfen?

Hallo,

na ja wenn die 5 LED unabhänging voneinander arbeiten sollen ist eine Schrittkette nicht geeignet. Wenn sie nacheinander arbeiten sollen ist eine Schrittkette schon richtig. Ich vermute mal du hast das mit delay() gemacht.

Schau dir millis() und das Beispiel BlinkWithoutDelay an. Suche hier im Forum nach der Nachtwächtererklärung. Mach Dir einen Ablaufplan wie Dein Program ablaufen soll.

Heinz

Man könnte auch jeder einzel Led eine eigene Schrittkette/Abaufsteuerung verpassen.

ich habe es natürlich mit millis() versucht.

Bekomme es aber dennoch nicht hin, vielleicht kann mir da jemand helfen?

enum ZUSTAENDE {schritt1, schritt2, schritt3, schritt4, schritt5};
byte led = schritt1;
int stopp = 1;
int variable1 = 0;
int variable2 = 0;
int variable3 = 0;
int variable4 = 0;
int variable5 = 0;
bool led1 = false;
bool led2 = false;
bool led3 = false;
bool led4 = false;
bool led5 = false;
double Zeit1;
double Zeit2;
double Zeit3;
double Zeit4;
double Zeit5;
unsigned long ZeitPause;
unsigned long ZeitMillis;
unsigned long ZeitIntervall;
unsigned long ZeitMillis2;
unsigned long ZeitIntervall2;
unsigned long ZeitMillis3;
unsigned long ZeitIntervall3;
unsigned long ZeitMillis4;
unsigned long ZeitIntervall4;
unsigned long ZeitMillis5;
unsigned long ZeitIntervall5;

void leds()
{
  if (stopp == 0)
  {
    if (millis() - ZeitMillis >= ZeitIntervall)
    {
      switch (led)
      {
        case schritt1:
          led = schritt2;
          ZeitIntervall = Zeit1;
          ZeitMillis = millis();
          off1();
          break;

        case schritt2:
          led = schritt3;
          ZeitIntervall2 = Zeit2;
          ZeitMillis2 = millis();
          off2();
          break;

        case schritt3:
          led = schritt4;
          ZeitIntervall3 = Zeit3;
          ZeitMillis3 = millis();
          off3();
          break;

        case schritt4:
          led = schritt5;
          ZeitIntervall4 = Zeit4;
          ZeitMillis4 = millis();
          off4();
          break;

        case schritt5:
          led = schritt1;
          ZeitIntervall5 = Zeit5;
          ZeitMillis5 = millis();
          off5();
          stopp = 1;
          break;
      }
    }
  }
}

void off1()
{
  if (variable1 == 1)
  {
    Serial.print("OHOHOHOH2");
    if (millis() - ZeitMillis >= ZeitIntervall)
    {
      led1 = false;
      variable1 = 0;
    }
  }
}

void off2()
{
  if (variable2 == 1)
  {
    if (millis() - ZeitMillis2 >= ZeitIntervall2)
    {
      led2 = false;
      variable2 = 0;
    }
  }
}

void off3()
{
  if (variable3 == 1)
  {
    if (millis() - ZeitMillis3 >= ZeitIntervall3)
    {
      led3 = false;
      variable3 = 0;
    }
  }
}

void off4()
{
  if (variable4 == 1)
  {
    if (millis() - ZeitMillis4 >= ZeitIntervall4)
    {
      led4 = false;
      variable4 = 0;
    }
  }
}

void off5()
{
  if (variable5 == 1)
  {
    if (millis() - ZeitMillis5 >= ZeitIntervall5)
    {
      led4 = false;
      variable5 = 0;
    }
  }
}

void ledoutput()
{
  if (led1 == true || variable1 == 1 && stopp == 0 )
  {
    digitalWrite(8, HIGH);
  }
  if (led1 == false || variable1 == 0 && stopp == 0 )
  {
    digitalWrite(8, LOW);
  }
  if (led2 == true || variable2 == 1 && stopp == 0 )
  {
    digitalWrite(9, HIGH);
  }
  if (led2 == false || variable2 == 0 && stopp == 0 )
  {
    digitalWrite(9, LOW);
  }
  if (led3 == true || variable3 == 1 && stopp == 0 )
  {
    digitalWrite(10, HIGH);
  }
  if (led3 == false || variable3 == 0 && stopp == 0 )
  {
    digitalWrite(10, LOW);
  }
  if (led4 == true || variable4 == 1 && stopp == 0 )
  {
    digitalWrite(11, HIGH);
  }
  if (led4 == false || variable4 == 0 && stopp == 0 )
  {
    digitalWrite(11, LOW);
  }
  if (led5 == true || variable5 == 1 && stopp == 0 )
  {
    digitalWrite(12, HIGH);
  }
  if (led5 == false || variable5 == 0 && stopp == 0 )
  {
    digitalWrite(12, LOW);
  }
}

void setup()
{
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
}

void loop(void)
{
  leds();
  ledoutput();
}

Die variable1-5 & die Zeit1-5 werden natürlich von meinem touchscreen übermittelt, das funktioniert auch einwandfrei, deswegen habe ich das vom Code weggelassen.

Möchte lediglich wenn variable 1 oder 2 oder 3 oder 4 oder 5 oder eben so wie man es auswählt (zb: 1 und 3), dass die LEDs für die Zeit die man am touchscreen einstellt und hierbei in die var Zeit1,Zeit2,…etc. geschrieben wird, solange anbleiben wie eben die zeit eingestellt ist. (habe natürlich die Zeit in ms mit *1000 geändert).

So funktioniert es nicht, hat da jemand ne idee?

Hallo,

siehe 1 , versuch doch erst mal mit einer LED und einer Variablen, kann ja auch ein Taster sein. Dann schaust Du Dir das Thema Arrays an. Wenn dir das zu Komplex wird kannst Du das mit der einen LED ja auch 5 mal kopieren.

Eigendlich wäre einne eigene Klasse "LED" optimal. Wenn Du magst kannst Du ja mal hier was lesen und üben.

Tutorial für Anfänger

Heinz

ich würde eine Klasse für die LEDs + Zeitsteuerung machen,
die LED Objekte mit einem gemeinsamen Tastendruck einschalten
Und dann hat die LED Objekte sich selber überlassen und sich selber über den Zeitablauf kümmern lassen.

/*
  LED unterschiedlich steuern 
  für
  https://forum.arduino.cc/index.php?topic=694269
  by noiasca
  
*/

const byte buttonPin = A0;

class RetriggerOffDelay                      // a class for a retriggerable off delay
{
  private:
    const byte outputPin;                    // GPIO für die LED die nachläuft
    uint32_t previousMillis = 0;             // Zeitstempel, wann die LED das letzte mal eingeschaltet wurde
    byte interval = 3;                        // Nachlaufzeit in Sekunden

  public:
    RetriggerOffDelay(byte outputPin) :       // ein Constructor für unsere Klasse mit Initialisierungsliste
      outputPin(outputPin)
    {}

    void begin() {                            // a method which should be called in setup()
      pinMode(outputPin, OUTPUT);
    }

    void setInterval(byte newInterval)
    {
      interval = newInterval;
    }

    void start()                              // start on time
    {
      digitalWrite(outputPin, HIGH);
      previousMillis = millis();           // Einschaltzeit "merken"
    }

    void tick() {                             // a method which should be called permanently in loop()
      if (millis() - previousMillis > interval * 1000UL && digitalRead(outputPin) == HIGH)  // wenn Zeit abgelaufen und die LED leuchtet
      {
        digitalWrite(outputPin, LOW);
      }
    }
};

RetriggerOffDelay group[] {
  { 2},   // first object,  index 0:  outputPin
  { 3},   // second object, index 1:  outputPin
  { 4},   // third object,  index 2:  outputPin
  { 5},   // 4th object,    index 3:  outputPin
  { 6}    // 5th object,    index 4:  outputPin
};

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  for (auto & i : group)  i.begin();  // range based for iterates through array of objects and "i" gets a reference onto the object

  group[0].setInterval(4);            // set an individual interval for this button/output group
  group[1].setInterval(5);
}

void loop() {
  // button auslesen
  if (digitalRead(buttonPin) == LOW) {
    for (auto & i : group) i.start();
  }

  // die LEDs auf Zeitablauf anticken und checken lassen, ob sie abgeschaltet werden sollen
  for (auto & i : group) i.tick();
}

der Code ist entstanden auf Basis dieser Anleitungen:

https://werner.rothschopf.net/202003_arduino_retriggerbares_nachlaufrelais.htm
und
https://werner.rothschopf.net/202003_arduino_retriggerbares_nachlaufrelais_oop.htm

Der Unterschied im Sketch ist eigentlich nur, dass es halt einen "zentralen" Startbutton gibt.