Weicher PWM Übergang mit LEDs

Hallo Leute,

Ich möchte weiche Übergänge zwischen die LEDs hin bekommen. Ich weiß das es nicht sauber wird bei dem UNO. Aber zum üben reicht es erst mal. Wenn ich 5 LEDs an die PWM Ausgänge anschließe, kann ich die mit der for schleife einzeln der Reihe nach auf bzw abdimmen per PWM.

Wie mache ich es wenn die erste LED zu dimmen startet, dann bei ca 70% soll dann schon die nächste LED starten zu dimmen, ist die bei 70% dann die nächste usw. ? Den Übergang Regel ich dann über einen Poti. Die PWM Schritte nimm ich aus einen Array mit 32 Werten um Logarithmisch zu dimmen.

Wer kann mir bitte dabei helfen? Ein Code Beispiel zum lernen währe auch gut.

Lieben Gruß Markus

Beispielsweise durch eine Versatz im Index des Feldes.

Zeige doch mal Deinen Sketch, damit wir sehen können, wo Du stehst.

verwende millis() statt delay()

Ich habe das die LEDs einzeln aufdimmen hinbekommen, hier im Code versuch ich gerade 2 LEDs weich einzublenden. da bringt der MEGA alles durcheinander bei der ansteuerung.

Pastebin

Wie geht das mit Pastebin? hoffe das klappt so.

Du kannst den Code auch direkt hier posten (mit den Code-Tags), dann können die Tablet/Handyuser den Code besser lesen/helfen:

const int outputPin = 2;
int pausen = 50;

int vals [] = {     0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23,
                    27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255
              };
int numVal = 32; //number of values in array
int numValCross = 16;
int numValDim = 0;

int i = 0;
int x1 = 0;
int x2 = 0;
int y = 0;
int LED1 = 0;
int LED2 = 0;
void setup() {
  for (int i = 2; i < 10; i++) {
    pinMode(i, OUTPUT);
  }
  numValDim = numVal - numValCross; //32-12 = 20
}

void loop() {
  for (int i = 0; i < numValDim; i++) {
    analogWrite(2, vals[i]);
    delay(pausen);
    LED1 = i;
  }
  for (int i = 0; i < numValDim; i++) {
    if (LED1 <= numVal) {
      LED1++;
      analogWrite(2, LED1);
    }
    analogWrite(3, vals[i]);
    delay(pausen);
    LED2 = i;
  }
  delay(1000);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
}

Das Timing mußt Du mit millis() machen da ansonsten nicht 2 Sachen gleichzeitig gemacht werden können.

https://forum.arduino.cc/index.php?topic=423688.0

Grüße Uwe

Es währe schön wenn mir einer erklären könnte wie es genau funktioniert. mit deiner Timer idee komm ich auch nicht weiter.

Besser als mit Nachtwächter-Geschichte (Link aus Uwes voriger Antwort) kann man es nicht erklären.

Loop ist eben nur ein Zeitpunkt, und kommt während des Dimmens zigtausend mal dran. (Manchmal mit anderem Wert für Analogwrite)

Falls es dir einfacher fällt, kannst du auch einen Mittelweg machen und loop so weit abbremsen, dass du in jedem Durchlauf den analogWrite-Wert um eins veränderst. Das bremst dann parallele Aktivitäten immer noch gewaltig, aber immerhin passieren sie "gleichzeitig" während gedimmt wird.

es geht auch mit delay().

Du must halt nur alles in einer Schleife machen.

das könnte z.B. so aussehen:

int pausen = 500;
int vals [] = {     0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23,
                    27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255
              };
int numVal = 32; //number of values in array
byte schwelle = 178;  // 70% * 255; Schwelle, bei der die nächste LED einsetzt.
byte a,b,c;           // Zählervariablen für 3 LEDs

unsigned long sweepstart;  // Zeit merken, zu der der Dimmprozess gestartet wurde.

void setup() {
  for (int i = 2; i < 10; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
    // Zählervariablen berechnen
    a = min(a++, numVal-1);  // Zähler 1. LED   wird hochgezählt bis 31
    if (vals[a] > schwelle){    
      b = min(b++, numVal-1);  // Zähler 2. LED  wird hochgezählt bis 31, wenn Wert 1. LED > Schwelle, 
    }
    if (vals[b] > schwelle){    
      c = min(c++, numVal-1);  // Zähler 3. LED  wird hochgezählt bis 31, wenn Wert 2. LED > Schwelle, 
    }
    analogWrite(2, vals[a]);
    analogWrite(3, vals[b]);
    analogWrite(4, vals[c]);  
    delay(pausen);   


    // Rücksetzen alle Variablen und wiederholen nach einer Pause
    if(millis()-sweepstart > pausen * 128){  // Ist die Wartezeit abgelaufen? (Dauer=pausen*128)
      a=0;                                   // Zählervariablen rücksetzen
      b=0;
      c=0;
      sweepstart = millis();                  // Zeitpunkt des Neustarts merken
    }
}

Der Code ist nicht getestet, nur einfach mal so ins Blaue geschrieben.
er sollte nach dem Starten die LEDs nacheinander hochdimmen nur, um einfach mal eine Idee zu geben, wie man es machen könnte.

Grundsätzlich ist aber eine delay() Lösung immer schlecht.

Daher habe ich dir über millis() einen Neustart eingebaut, der das hochdimmen immer wieder wiederholt.

Was ich dir empfehlen würde: nimm ein Blatt Papier und zeichne dir mal auf, was der Arduino eigentlich machen soll. Ein Flussdiagramm ist da sehr hilfreich und leicht zu zeichen.

Mein UNO hat an Pin 2 und 4 kein PWM, ein analogWrite auf diese Pins macht daher keinen Sinn.

agmue:
Mein UNO hat an Pin 2 und 4 kein PWM, ein analogWrite auf diese Pins macht daher keinen Sinn.

Er hat ja auch einen MEGA…

Markylein:
… da bringt der MEGA alles durcheinander bei der ansteuerung.