LED 2x ein-& ausschalten, danach einschalten & "ausfaden"

Hallo zusammen,

ich bin neu hier, daher habt bitte Gnade :stuck_out_tongue_winking_eye:

Ich möchte mit meiner Arduino mehrere Gruppen von LEDs, die an den PWM-Ports angeschlossen sind, insgesamt 3x hintereinander ein- und ausschalten. Beim dritten Mal sollen die LEDs aber nicht einfach aus gehen, sondern wie eine Glühbirne ein wenig nachleuchten, quasi ein Fadeout.

Ich habs schon so versucht wie hier, aber das hat nicht funktioniert:

// the PWM pin the LED is attached to
int led1 = 3;
int led2 = 5;
int led3 = 6;
int led4 = 9;
int led5 = 10;
int led6 = 11;

int high = 255;
int midh = 255; 
int low = 0;
int fadeAmount = 5; // how many points to fade the LED by

/* Declare functions */
void action();


/* Setup function */
void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
    // declare leds to be an output:
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
}

/* loop section */
// loop 1
void loop(){
      for (int i = 0; i <= 1; i++){
analogWrite (led1, high);
analogWrite (led2, high);
analogWrite (led3, high);
  delay(60); 
analogWrite (led1, low);
analogWrite (led2, low);
analogWrite (led3, low);
  delay(60); 
    
}
analogWrite (led1, midh);
analogWrite (led2, midh);
analogWrite (led3, midh);


midh = midh - fadeAmount;
if (midh <= 0) {
  analogWrite (led1, low);
  analogWrite (led2, low);
  analogWrite (led3, low);
     }
delay (20);


}

Vielleicht ist die Lösung ja greifbar nahe, ich finde sie leider nicht. Hab auch schon nach allem möglichen gesucht, aber nichts brauchbares gefunden.

Mein Board ist eine angepasste Diecimila soweit ich weiß. Sie kommt aus dem "Franzis Lernpaket Lichteffekte mit Arduino" (https://www.amazon.de/Franzis-Lernpaket-Lichteffekte-ArduinoTM-Lightpaintings/dp/3645651306)

Ich danke euch im Voraus für eure Hilfe!

Liebe Grüße

The_Organist

Dein Link ist defekt.

Gruß Tommy

Moin
das Thema war hier schon mal "online", wenn ich mich richtig erinnere, das Thema scheint ein Standardthema zu sein. :slight_smile:

Nimm die Aruino-Suchmaschine und schaue mal.

the_organist:
Ich möchte mit meiner Arduino mehrere Gruppen von LEDs, die an den PWM-Ports angeschlossen sind, insgesamt 3x hintereinander ein- und ausschalten. Beim dritten Mal sollen die LEDs aber nicht einfach aus gehen, sondern wie eine Glühbirne ein wenig nachleuchten, quasi ein Fadeout.

analogWrite (led3, high);

delay(60);
analogWrite (led1, low);

Also... Du solltest wenn Du EIN oder AUS schalten willst, das auch so machen.
Aber was meinst Du was Du in 60ms siehst?

Und ja, wir hatten sowas letztens erst in einer ähnlichen Variante.

Hallo
Bevor Du und ich viel Zeit verschwenden, erkläre bitte ausführlich, wofür der Sketch eingesetzt wird.

Zuerst:

 for (int i = 0; i <= 1; i++){

Das läuft nur einmal.

analogWrite (led1, high);

Zum Faden mußt du einen Wet zwischen 0 und 255 übergeben und diesen dann über eine for Schleife langsam ändern.

for (int i =255; i >= 0; i=i-25)
{
analogWrite(led1, i);
delay (100);
}

So ändert sich die Helligkeit von ganz hell auf aus in 10 Schritten innerhalb einer Sekunde.

Ich gebe Dir zu bedenken daß diesr Code blockierend ist, dh es kann nur das Faden gemacht werden nicht anderes.

Grüße Uwe

uwefed:

analogWrite (led1, high);

Zum Faden mußt du einen Wet zwischen 0 und 255 übergeben und diesen dann über eine for Schleife langsam ändern.

Da will er nicht faden.
Da soll nur EIN AUS und wenn der Umlauf durch ist: faden.

Auch das versucht er ja:

midh = midh - fadeAmount;

Idee passt so - allerdings falsch eingebunden.

Erstmal danke für die vielen Antworten!

Nimm die Aruino-Suchmaschine und schaue mal.

Gesucht habe ich - aber gefunden leider nichts. Zumindest nichts, was mich weiter bringen würde.

Aber was meinst Du was Du in 60ms siehst?

Ich habe einen ähnlichen Code mit digitaler Ansteuerung schon erfolgreich geladen und in 60 ms sieht man genug für meine Vorhaben :wink:

Bevor Du und ich viel Zeit verschwenden, erkläre bitte ausführlich, wofür der Sketch eingesetzt wird.

Es sollen LEDs blitzen und beim letzten "Blitz" soll das Licht eben aus-faden.

Zum Faden mußt du einen Wet zwischen 0 und 255 übergeben und diesen dann über eine for Schleife langsam ändern.

dazu habe ich "high" (nicht HIGH) als Wert (255) deklariert.

int high = 255;

Ich gebe Dir zu bedenken daß diesr Code blockierend ist, dh es kann nur das Faden gemacht werden nicht anderes

Das ist dann leider nicht so geeignet für mein Projekt :confused:

Idee passt so - allerdings falsch eingebunden.

Wie binde ich das dann richtig ein? :slight_smile:

Neuer Link zur Platine: Das Franzis Lernpaket Lichteffekte mit Arduino | Weltbild.de

ist das im Video nicht der Fuzie vom WDR-Computer-Club? :slight_smile:

Wenn ich Franzis lese, wird mir schon schlecht.

Gruß Tommy

the_organist:
Das ist dann leider nicht so geeignet für mein Projekt :confused:

Anders machen.
Ich hatte ja schon erfasst, was Du willst. Ob das richtig ist, weiss ich nicht.
es kompiliert fehlerfrei

const byte led1 = 3;
const int fadeAmount = 5; // how many points to fade the LED by

enum {wait, on, off, fadeout};
unsigned int schritt = on;
void setup() {
  Serial.begin(115200);
  Serial.println(F("Start.... "));
  pinMode(led1, OUTPUT);
}

void loop()
{
  schrittkette();
}
void schrittkette()
{
  static unsigned int durchlauf = 5;
  unsigned long lastmillis = 0;
  static byte midh = 255;
  const unsigned long pause = 1000; // Zeit in ms
  const unsigned long nextfade = 500; // in ms
  switch (schritt)
  {
    case wait:
      durchlauf = 5;
      // Hier muss eine Bedingung rein, die den Zustand wieder beendet
      // Beipielsweise ein Neustart mit einer Tasterabfrage
      break;
    case on:
      digitalWrite(led1, HIGH);
      lastmillis = millis();
      schritt = off;
      break;
    case off:
      if (millis() - lastmillis > pause)
      {
        digitalWrite(led1, LOW);
        durchlauf--;
      }
      if (durchlauf != 0) {
        schritt = on;
      } else {
        schritt = fadeout;
      }
      break;
    case fadeout:
      if (millis() - lastmillis > nextfade)
      {
        if (midh <= 0) {
          digitalWrite (led1, LOW);
          schritt = wait;
        }
        else
        {
          midh = midh - fadeAmount;
          analogWrite(led1, midh);
          lastmillis = millis();
        }
      }
      break;
  }
}

Hallo,
es gibt in der IDE auch ein Beispiel analog/fading wenn Du das verstanden hast machst Du in meinem Tutorial weiter wenn Du magst.

Von delay() bis zur Methode

Heinz

Nachtrag : hatte irgendwie Probleme mit dem link :wink:

dazu habe ich "high" (nicht HIGH) als Wert (255) deklariert.

Gute Verschleierungstechnik.
Grüße Uwe

Hi, C&P error :wink:

Rentner:

my_xy_projekt:
Hi, C&P error :wink:

hat ja doch noch geklappt

Gruß Heinz

Inspiriert duch #10 eine Anregung basierend auf einem variierten Gerüst von combie:

enum class Schritte {EIN1, AUS1, EIN2, AUS2, EIN3, BLENDEN, STOPP};
class Ablauf {
    const byte pin;
    const uint32_t schaltintervall;
    const byte ueberblendweite;
    const uint32_t ueberblendintervall;
    uint32_t vorhin=0;
    uint32_t intervall=0;
    byte helligkeit = 255;
    Schritte schritt = Schritte::EIN1;

  public:
    Ablauf(const byte pin, const uint32_t schaltintervall, const byte ueberblendweite, const uint32_t ueberblendintervall)
      : pin(pin), schaltintervall(schaltintervall), ueberblendweite(ueberblendweite), ueberblendintervall(ueberblendintervall)
    {}

    void init() {
      pinMode(pin, OUTPUT);
    }

    void run() {
      uint32_t jetzt = millis();
      if (jetzt - vorhin >= intervall) {
        vorhin = jetzt;
        switch (schritt) {
          case Schritte::EIN1:
            digitalWrite(pin, HIGH);
            intervall = schaltintervall;
            schritt = Schritte::AUS1;
            break;
          case Schritte::AUS1:
            digitalWrite(pin, LOW);
            schritt = Schritte::EIN2;
            break;
          case Schritte::EIN2:
            digitalWrite(pin, HIGH);
            schritt = Schritte::AUS2;
            break;
          case Schritte::AUS2:
            digitalWrite(pin, LOW);
            schritt = Schritte::EIN3;
            break;
          case Schritte::EIN3:
            digitalWrite(pin, HIGH);
            intervall = ueberblendintervall;
            schritt = Schritte::BLENDEN;
            break;
          case Schritte::BLENDEN:
            helligkeit -= ueberblendweite;
            analogWrite(pin, helligkeit);
            if (helligkeit < ueberblendweite) {
              digitalWrite(pin, LOW);
              schritt = Schritte::STOPP;
            }
            break;
          case Schritte::STOPP:
            break;
        }
      }
    }
};

Ablauf ablauf[] {
  // pin schaltintervall ueberblendweite ueberblendintervall
  {3, 60, 5, 20}, // 1. LED
  {5, 60, 5, 20}, // 2. LED
  {6, 60, 5, 20}  // 3. LED
};

void setup() {
  for (auto &a : ablauf) a.init();
}

void loop() {
  for (auto &a : ablauf) a.run();
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.