Leds faden

Hallo zusammen :wink:

wie bekomme ich es hin das mehrere leds nacheinander langsam (FadeIn?!) angeschaltet werden und dann auch an bleiben, nicht wieder aus gehen??

Ich hoffe ich habe es einigermaßen verständlich ausgetrückt

Die einzelnen LEDs in einer For/While-Schleife langsam mit PWM (analogWrite(ledPin, fadeValue); ) einschalten, dann mittels einer Variable verhindern, dass diese Schleife erneut angefahren wird.

Statt der For-Schleife, besser mit verschiedenen Variablen und millis arbeiten.

Stichworte: Blinken without Delays, Nachtwächter, Endlicher Automat.

Hallo,

eine for Schleife blockiert. Da hilft nur viel Logik zum steuern und alles mit if.

Gibt es dazu einen passenden sketch? Ich kann mit euren Antworten leider nur bedingt etwas anfangen denn ich bin absoluter Anfänger :frowning:

Es gibt zu allem erwähnten Sketche und Beispiele, bitte such mal hier im Forum danach, da wirst du 100fach fündig. Ich habe dir ja hierzu einige Stichworte gegeben, such nach diesen jeweils einzeln und fang mit dem "endlichen Automaten" an.

Wenn du ein wenig Code zusammen hast, dann bitte hier posten bei Problemen, dann kann man noch besser helfen.

vielen dank ich mach mich sofort auf die suche :wink:

Und konzentrier dich erstmal auf eine oder zwei LEDs, hinzufügen kannste später immer noch.
Und vergiss analogWrite nicht in deiner Suche.

ich komme leider überhaupt nicht weiter

Hallo,

das ist nur eine Feststellung. Keine Frage, keine Antwort.

Hast du dich denn schon mit analogWrite befasst? Also was das macht?
Wenn ja, musste jetzt überlegen, wie du den übergegebenen Wert zyklisch änderst, damit sich an der LED was ändert.

Bei "nicht weiterkommen" denke ich an einen sketch, der nicht kompilieren will, oder an ein nicht nachvollziehbares Verhalten der LEDs.

Fang mal im allerersten Schritt damit an, aufzuzeigen wie du deine LEDs verschaltet hast, daraus ergeben sich die digitalen Ports.

Diese kannst du dann direkt in deinem Sketch per pinMode und analogWrite schon manipulieren, ohne das weitere aus deinem Vorhaben erstmal umzusetzen - irgendwo musst du ja anfangen.

Danach gehst du her und versuchst mit einer LED und - zunächst - einer For-Schleife es so hinzubiegen, dass die LED einfadet, dann mit einer zweiten For wieder ausfadet.

Danach gehst du her und schaust dir die Nachtwächtergeschichte und den endlichen Automaten an, verstehst diese und baust sie für eine LED ein, erweitern geht später immer noch.

Für jeden einzelnen Punkt kannst du gern hier Sketche posten, die wir alle dann korrigieren und mit Anmerkungen versehen können.

Aber der Code muss primär von dir kommen.

Also ich hab etwas gefunden. Der Sketch mach eigentlich genau das was ich möchte.

Wie kann ich jetzt darin leds hinzufügen?

int ledPin = 3;
int ADC0 = 0; // Analogeingang
int wert, volt;
void setup()
{
Serial.begin(9600);
}

void loop()
{
wert = analogRead(ADC0);
volt = wert * 5.0 / 1024.0;
Serial.println(volt);
for (int i = 0; i <= 255; i++)
{
analogWrite(ledPin, i);
delay(wert);
}
for (int i = 255; i >= 0; i--)
{
analogWrite(ledPin, i);
delay(wert);
}
}

Detsimbo:
Wie kann ich jetzt darin leds hinzufügen?

Beispielsweise so:

#define DIFF 20
const byte led1Pin = 3;
const byte led2Pin = 5;
const byte ADC0 = 0; // Analogeingang
float volt;
int wert, a;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  wert = analogRead(ADC0);
  volt = wert * 5.0 / 1024.0;
  Serial.println(wert);
  Serial.println(volt);
  for (int i = 0; i <= (255 + DIFF); i++)
  {
    a = i;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led1Pin, a);
    }
    a = i - DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led2Pin, a);
    }
    delay(wert);
  }
  for (int i = 255; i >= (0 - DIFF); i--)
  {
    a = i;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led1Pin, a);
    }
    a = i + DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led2Pin, a);
    }
    delay(wert);
  }
}

Für was hast du das analogRead da drin?

Mit den FOR-Schleifen können die LEDs aber nur parallel oder komplett nacheinander gefadet werden.
(Abgesehen vom Diff-Trick).

So??

#define DIFF 20
const byte led1Pin = 3;
const byte led2Pin = 5;
const byte led3Pin = 6;
const byte led4Pin = 9;
const byte led5Pin = 10;
const byte led6Pin = 11;
const byte ADC0 = 0; // Analogeingang
float volt;
int wert, a;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  wert = analogRead(ADC0);
  volt = wert * 5.0 / 1024.0;
  Serial.println(wert);
  Serial.println(volt);
  for (int i = 0; i <= (255 + DIFF); i++)
  {
    a = i;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led1Pin, a);
    }
    a = i - DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led2Pin, a);
    }
    a = i - DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led3Pin, a);
    }
    a = i - DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led4Pin, a);
    }
    a = i - DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led5Pin, a);
    }
    a = i - DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led6Pin, a);

    }
    delay(wert);
  }
  for (int i = 255; i >= (0 - DIFF); i--)
  {
    a = i;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led1Pin, a);
    }
    a = i + DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led2Pin, a);
    }
    a = i + DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led3Pin, a);
    }
    a = i + DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led4Pin, a);
    }
    a = i + DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led5Pin, a);
    }
    a = i + DIFF;
    if ((a >= 0) && (a <= 255)) {
      analogWrite(led6Pin, a);
    }
  }
  delay(wert);
}

Alle Variablen a dürften im weiteren Verlauf den selben Wert haben, theoretisch müsstest du bei der 3. a = Zuweisung das i in a ersetzen, dann könnte das gehen.
Getestet habe ich es jetzt nicht.

Willst du die LEDs zeitgleich dimmen oder nacheinander oder "bunt" durcheinander?

Bei einfach nur nacheinander, könntest du auch sowas überlegen:

for (uint_8 dpin = 3; dpin <= 7; dpin++)
{
  for (uint_8 pwmvalue = 0; pwmvalue <= 255; pwmvalue++)
  {
    analogWrite(dpin, pwmvalue);
    delay(wert);
  }
}

Detsimbo:
So??

Du könntest es noch etwas zusammenfassen:

#define DIFF 20
const byte ledPin[] = {3, 5, 6, 9, 10, 11};
const byte leds = sizeof(ledPin);
const byte ADC0 = 0; // Analogeingang
float volt;
int wert, a;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  wert = analogRead(ADC0);
  volt = wert * 5.0 / 1024.0;
  Serial.println(wert);
  Serial.println(volt);
  for (int i = 0; i <= (255 + DIFF * (leds - 1)); i++)
  {
    for (byte j = 0; j < leds; j++)
    {
      a = i - DIFF * j;
      if ((a >= 0) && (a <= 255)) {
        analogWrite(ledPin[j], a);
      }
    }
    delay(wert);
  }
  for (int i = 255; i >= (0 - DIFF * (leds - 1)); i--)
  {
    for (byte j = 0; j < leds; j++)
    {
      a = i + DIFF * j;
      if ((a >= 0) && (a <= 255)) {
        analogWrite(ledPin[j], a);
      }
    }
    delay(wert);
  }
}

alle nacheinander...

wie baue ich dein Beispiel genau ein?

Detsimbo:
wie baue ich dein Beispiel genau ein?

Mein Sketch ist so komplett, kannst Du direkt mit C&P übernehmen und ausprobieren.

Sorry, ich hatte es noch nicht getestet....

perfekt genau so wollte ich es gerne haben!!!

Vielen Dank

Jetzt bleibt noch eine Frage

kann ich das ganze so "umbauen" das es an der Modelbahn mit 12 volt funktioniert?

Ich habe da was von Mosfed gelesen.

funktioniert das mit jedem Sketch?

Detsimbo:
funktioniert das mit jedem Sketch?

Das hat erstmal nichts mit dem Sketch zu tun. Du must nur beachten, daß PWM relativ schnell schaltet. Ein träger Optokoppler eignet sich beispielsweise nicht.

Es gibt viele Möglichkeiten, daher richtet sich eine für Dich gute Lösung nach Deinen Vorlieben: Lochstreifen, fertige Module ... was spricht Dich an? Welchen Strom benötigen die LEDs? Wäre eine galvanische Trennung von Vorteil?