Problem bei PWM mit Meanwell Ldd

Hallo,
ich habe eine LED-Lampe mit Menwell Ldd Treibern die ich mit meinem Arduino UNO dimmen will.
Wenn ein Schalter einschalted soll die Lampe von 0 bis 100% hochdimmen in einer gewissen Zeit.
Wenn der Schalter wider ausschalted soll sie von 100% auf 0 runterdimmen.

Das ganze funktioniert auch schon aber beim betätigen des Schalters flackern die Led´s einmal auf und dimmen dann hoch, und beim ausschalten des Schalters schalten sie kurz aus und dimmen dann runter.
Ich habe jetzt schon den debouncer eingebaut, da die vermutung auf das prellen des Schalters nahe lag, aber das hat auch nichts geholfen.

Kann mir wer bitte sagen wo der Fehler in meinem Code liegt?

#include <Bounce2.h>

int weiss = 3;   // Weißer Led Kanal
int rblau = 9;  // Royalblauer Led Kanal
int blau = 10;  // Blauer Led Kanal
int rot = 11;   // Roter Led Kanal
int tag = 13;   // Tag, Nacht Schalter von SPS
int tagstatus;
int fadeValue = 0;
Bounce debouncer = Bounce();

void setup() {
pinMode(weiss, OUTPUT);
pinMode(rblau, OUTPUT);
pinMode(blau, OUTPUT);
pinMode(rot, OUTPUT);
pinMode(tag, INPUT_PULLUP);
debouncer.attach(tag);
debouncer.interval(20);
}

void loop() {

  debouncer.update(); 

  int value = debouncer.read();
  
  if(value == LOW)
    tagmodus();
  
  if(value == HIGH)
    nachtmodus();  
    }

void tagmodus(){
    for(fadeValue == 0; fadeValue <= 255; fadeValue += 1){
      analogWrite(rot, fadeValue);
      delay(30);}}
              
 
  
void nachtmodus(){
    for(fadeValue == 255; fadeValue >= 0; fadeValue -= 1){
      analogWrite(rot, fadeValue);
      delay(30);}}

Ich wäre für hilfe sehr dankbar. Ich habe das ganze mit den Treibern und kleinen LED´s mit Vorwiderstand versucht, immer das gleiche Ergebnis.
MFG Wolfgang

fadeValue == 0``fadeValue == 255

Ist ein Vergleich!

Du meinst fadeValue = 0
Bzw fadeValue = 255

Hallo,
Danke für die rasche Antwort. Sorry das ich erst jetzt schreibe aber hatte leider keine zeit es zu testen bis jetzt.
Das flackern der Led ist jetzt weg aber der Schalter funktioniert nicht mehr. Wie kann ich eine Led nach dem hochdimen auf high setzen? Ich habe folgendes probiert, aber leider dimmt die Led dann immer hoch.

#include <Bounce. h>
int weiss = 3;   // Weißer Led Kanal
int rblau = 9;  // Royalblauer Led Kanal
int blau = 10;  // Blauer Led Kanal
int rot = 11;   // Roter Led Kanal
int tag = 13;   // Tag, Nacht Schalter von SPS
int tagstatus;
int fadeValue = 0;
Bounce debouncer = Bounce();

void setup() {
pinMode(weiss, OUTPUT);
pinMode(rblau, OUTPUT);
pinMode(blau, OUTPUT);
pinMode(rot, OUTPUT);
pinMode(tag, INPUT_PULLUP);
debouncer.attach(tag);
debouncer.interval(20);
}

void loop() {

  debouncer.update(); 

  int value = debouncer.read();
  
  if(value == LOW)
    tagmodus();
  
  if(value == HIGH)
    nachtmodus();  
    }

void tagmodus(){
    for(fadeValue == 0; fadeValue <= 255; fadeValue += 1){
      analogWrite(rot, fadeValue);
      if (fadeValue == 255) digitalWrite(rot, HIGH);
      delay(30);}}
              
 
  
void nachtmodus(){
    for(fadeValue == 255; fadeValue >= 0; fadeValue -= 1){
      analogWrite(rot, fadeValue);
      if (fadeValue == 0)digitalWrite (rot, LOW);
      delay(30);}}

Wolfgang77:
Ich habe folgendes probiert ...

Combie hat Dich darauf aufmerksam gemacht, dass Du „==“ und „=“ falsch benutzt hast. Wieso guckst Du nicht einfach in Deinem Code, ob das noch an mehr Stellen falsch ist? Ich habe das auch in der neuen Version auf Anhieb mehr als einmal gesehen.

Gruß

Gregor

Sorry, bin mitn tablet on und hab den alten code eingefügt >:( . So sieht der code jetzt aus

#include <Bounce. h>
int weiss = 3;   // Weißer Led Kanal
int rblau = 9;  // Royalblauer Led Kanal
int blau = 10;  // Blauer Led Kanal
int rot = 11;   // Roter Led Kanal
int tag = 13;   // Tag, Nacht Schalter von SPS
int tagstatus;
int fadeValue = 0;
Bounce debouncer = Bounce();

void setup() {
pinMode(weiss, OUTPUT);
pinMode(rblau, OUTPUT);
pinMode(blau, OUTPUT);
pinMode(rot, OUTPUT);
pinMode(tag, INPUT_PULLUP);
debouncer.attach(tag);
debouncer.interval(20);
}

void loop() {

  debouncer.update(); 

  int value = debouncer.read();
  
  if(value == LOW)
    tagmodus();
  
  if(value == HIGH)
    nachtmodus();  
    }

void tagmodus(){
    for(fadeValue = 0; fadeValue <= 255; fadeValue += 1){
      analogWrite(rot, fadeValue);
      if (fadeValue == 255) digitalWrite(rot, HIGH);
      delay(30);}}
              
 
  
void nachtmodus(){
    for(fadeValue = 255; fadeValue >= 0; fadeValue -= 1){
      analogWrite(rot, fadeValue);
      if (fadeValue == 0) digitalWrite (rot, LOW);
      delay(30);}}

Wie kann ich eine Led nach dem hochdimen auf high setzten?
Mfg

Wolfgang77:
Wie kann ich eine Led nach dem hochdimen auf high setzten?

So, wie man es auch ohne das Dimmen macht.

Gruß

Gregor

der pwm Wert 255 entspricht dem digitaWrite HIGH, da brauchst du nichts mehr machen:

ich vermute, dein Problem ist, dass die Schleife immer wieder durchlaufen wird und immer wieder neu gedimmt wird.
Du solltest, wenn die Schleife einmal durchgelaufen ist, ein Flag setzen und das erst löschen wenn die Gegenrichtung durchläuft.

Hallo,
danke nochmals für die Antworten und besonderen dank an ardubu der mir wirklich weitergeholfen hat. Nach langem Probieren hab ich das Programm jetzt so das es für mich funktioniert, aber es geht sicher einfacher oder besser. Kann ich irgendwie mehrere LED´s in einer for schleife ansteuern und auf verschiedene werte dimmen?
Hier mal meine derzeitige Lösung

#include <Bounce2.h>
int weiss = 3;   // Weißer Led Kanal 190 = alt
int blau = 9;    // Blauer Led Kanal 255
int rblau = 10;  // Royalblauer Led Kanal 220 = alt
int rot = 11;    // Roter Led Kanal 255
int tag = 13;    // Tag, Nacht Schalter von SPS
int fadeValueR = 0;  
int FlagR = LOW;
int FlagR1 = HIGH;
int fadeValueW = 0;
int fadeValueB = 0;
int fadeValueRB = 0;
Bounce debouncer = Bounce();

void setup() {
pinMode(weiss, OUTPUT); 
pinMode(blau, OUTPUT);
pinMode(rblau, OUTPUT);
pinMode(rot, OUTPUT);
pinMode(tag, INPUT_PULLUP);
debouncer.attach(tag);
debouncer.interval(20);
}

void loop() {

  debouncer.update(); 

  int value = debouncer.read();
  
  if(value == LOW)
    tagmodus();
  
  if(value == HIGH)
    nachtmodus();  
    }

void tagmodus(){
    if(FlagR == LOW){
    for(fadeValueR = 0; fadeValueR <= 255; fadeValueR += 1){
      analogWrite(rot, fadeValueR);
      analogWrite(blau, fadeValueR);
      fadeValueW = fadeValueR / 6;
      analogWrite(weiss, fadeValueW);
      fadeValueRB = fadeValueR / 1,2;
      analogWrite(rblau, fadeValueRB);
      
      delay(20); 
    if(fadeValueR == 255){
      break;}}
      FlagR = HIGH;
      FlagR1 = LOW;}}
              
 void nachtmodus(){
    if(FlagR1 == LOW){
    for(fadeValueR = 255; fadeValueR >= 0; fadeValueR -= 1){
      analogWrite(rot, fadeValueR);
      analogWrite(blau, fadeValueR);
      fadeValueW = fadeValueR / 6;
      analogWrite(weiss, fadeValueW);
      fadeValueRB = fadeValueR / 1,2;
      analogWrite(rblau, fadeValueRB);
      delay(20);
      if(fadeValueR == 0){
      break; }}
      FlagR = LOW;
      FlagR1 = HIGH;}}

Ich dachte an sowas falls es das gibt

for(fadeValueR = 0; fadeValueR <= 255; fadeValueR += 1)&&
   (fadeValueW = 0; fadeValueW <= 200; fadeValueW += 1)

Danke im voraus.
MFG Wolfgang

Was hälst du von dem Gedankenansatz?
if (++fadeValueR >=255) fadeValueR=255;
if (++fadeValueW >=200) fadeValueW=200;

So wie es aussieht ist mir das leider zu hoch. :o
Bin jetzt auf das gestoßen, aber er verlässt die Schleife sobald der kleinere wert erreicht ist.

for(fadeValueR = 0, fadeValueW = 0; fadeValueR <= 255, fadeValue <= 200; fadeValueR += 1, fadeValueW += 1){

natürlich kann ich das Programm danach noch erwietern, aber das ist ja nicht der sinn der Übung. Kann ich irgendwie bei += Kommazahlen eingeben?
MFG

Hallo Wolfgang,
ich hatte mir das etwa so gedacht:

#define rot 3
#define weiss 5
#define taster 2
byte fadeValueR=0;
void setup() {
 Serial.begin(9600);
 pinMode(2,INPUT_PULLUP);

}

void loop() 
{    
     if (digitalRead(taster)&&fadeValueR<255)  fade_up();
     if (!digitalRead(taster)&&fadeValueR>0)  fade_down();
      
}

void fade_up()
{
  fadeValueR ++;
       if ( fadeValueR >=255)  fadeValueR=255;
       analogWrite(rot, fadeValueR);
  fadeValueW ++;    
       if (fadeValueW >=200) fadeValueW=200;
       analogWrite(weiss, fadeValueW);
}
void fade_down()
{
  fadeValueR --;
       if ( fadeValueR <=0)  fadeValueR=0;
       analogWrite(rot, fadeValueR);
  fadeValueW --;    
       if (fadeValueW <=0) fadeValueW=0;
       analogWrite(weiss, fadeValueW);      
}
byte fadevalueR = 255;
fadeValueR ++;
if ( fadeValueR >=255)  fadeValueR=255;

if (fadevalueR == 0) Serial.println("Pech gehabt");

if (fadevalueR == 0) Serial.println("Pech gehabt");

sollte eigentlich nicht passieren, da die Funktion von hier

if (digitalRead(taster)&&fadeValueR<255) fade_up();

aufgerufen wird.
aber man könnte sicherheitshalber if ( fadeValueR >=254) fadeValueR=255; machen

Hallo ardubu,
Danke vielmals für deine Hilfe. Ich hab das Ganze jetzt etwas geändert und jetzt funktionierts.
Hier ist der Code falls jemand ähnliche Probleme hat.

#define rot 3
#define weiss 9
#define taster 2
#define blau 10
#define rblau 11
byte fadeValueR=0;
byte fadeValueW=0;
byte fadeValueRB=0;

void setup() {
 Serial.begin(9600);
 pinMode(2,INPUT_PULLUP);
 pinMode(weiss, OUTPUT); 
 pinMode(blau, OUTPUT);
 pinMode(rblau, OUTPUT);
 pinMode(rot, OUTPUT);
}

void loop()
{   
     if (!digitalRead(taster)&&fadeValueR<255)  fade_up();
     if (digitalRead(taster)&&fadeValueR>0)  fade_down();
     delay(30);
}

void fade_up()
{
  fadeValueR ++;
       if ( fadeValueR >=255)  fadeValueR=255;
       analogWrite(rot, fadeValueR);
       analogWrite(blau, fadeValueR);
  fadeValueW ++;   
       if (fadeValueW >=200) fadeValueW=200;
       analogWrite(weiss, fadeValueW);
  fadeValueRB ++;
       if (fadeValueRB >= 230) fadeValueRB=230;
       analogWrite(rblau, fadeValueRB);
       Serial.print(fadeValueRB);
       delay(20);}

void fade_down()
{
  fadeValueR --;
       if ( fadeValueR <=0)  fadeValueR=0;
       analogWrite(rot, fadeValueR);
       analogWrite(blau, fadeValueR);
       
  fadeValueW --;   
       if (fadeValueW >=200) fadeValueW=0;
       analogWrite(weiss, fadeValueW);
       
  fadeValueRB --;
       if (fadeValueRB >=230) fadeValueRB=0;
       analogWrite(rblau, fadeValueRB);
       Serial.print(fadeValueRB);
       delay(20);}

Danke nochmals für alle Antworten und die Hilfe.
MFg Wolfgang

Hallo Wolfgang,
in dem Teil fade_down
if (fadeValueW >=200) fadeValueW=0;
if (fadeValueRB >=230) fadeValueRB=0;
ist ein kleiner Fehler, müsste
if (fadeValueW <=1) fadeValueW=0;
if (fadeValueRB <=1) fadeValueRB=0;
sein
um Delay zu vermeiden habe ich nochmal eine kleine Änderung vorgenommen

static unsigned long millisalt;
  if (millis()-millisalt>dt) // dt in ms global deklarieren
      {fadeValueR ++;
       millisalt=millis();}
       if ( fadeValueR >=254)  fadeValueR=255;
       analogWrite(rot, fadeValueR);

noch besser geht es so:

#define rot 3
#define weiss 9
#define taster 2
#define blau 10
#define rblau 11
byte fadeValueR=0;
byte fadeValueW=0;
byte fadeValueRB=0;

void setup() {
 Serial.begin(9600);
 pinMode(taster,INPUT_PULLUP);
 pinMode(weiss, OUTPUT);
 pinMode(blau, OUTPUT);
 pinMode(rblau, OUTPUT);
 pinMode(rot, OUTPUT);
}

void loop()
{   
     static unsigned long millisalt;
     byte dt=30;//Verögerungszeit
     if (!digitalRead(taster)&&fadeValueR<255&&millis()-millisalt>dt)  {fade_up(); millisalt=millis();}
     if (digitalRead(taster)&&fadeValueR>0&&millis()-millisalt>dt)  {fade_down();millisalt=millis();}
   
}

void fade_up()
{
  fadeValueR ++;
       if ( fadeValueR >=254)  fadeValueR=255;
       analogWrite(rot, fadeValueR);
       analogWrite(blau, fadeValueR);
  fadeValueW ++;   
       if (fadeValueW >=200) fadeValueW=200;
       analogWrite(weiss, fadeValueW);
  fadeValueRB ++;
       if (fadeValueRB >= 230) fadeValueRB=230;
       analogWrite(rblau, fadeValueRB);
       Serial.print(fadeValueRB);
      
 }

void fade_down()
{
  fadeValueR --;
       if ( fadeValueR <=1)  fadeValueR=0;
       analogWrite(rot, fadeValueR);
       analogWrite(blau, fadeValueR);
       
  fadeValueW --;   
       if (fadeValueW <=1) fadeValueW=0;
       analogWrite(weiss, fadeValueW);
       
  fadeValueRB --;
       if (fadeValueRB <=1) fadeValueRB=0;
       analogWrite(rblau, fadeValueRB);
       Serial.print(fadeValueRB);
       
  }

@ardubu

Stimmt, dein

&&fadeValueR<255&

in loop hatte ich übersehen.

Wenn du aber schon eine Begrenzung in fadeup einbaust, und eine Byte-Variable "bis zum Anschlag" ausnutzt, mach es doch, der Einfachheit halber, lieber richtig:

void fade_up()
{
  if (fadeValueR < 255) fadeValueR ++; // fade_up bis max 255
  analogWrite(rot, fadeValueR);
  ...
}

Bist dann nicht mehr drauf angewiesen, dass die aufrufende Funktion ( loop() ) aufpasst, dass fadeValueR nicht überläuft. Einfacher ist meist auch Besser.

hatte ich in meinem letzten Post geändert.

hatte ich in meinem letzten Post geändert

?
seh ich nicht (in 2015-10-17, 17:34:31) ?

void fade_up()
{
fadeValueR ++;
if ( fadeValueR >=254) fadeValueR=255;
...
}

Du musst immer noch in loop aufpassen, dass du fade_up nicht aufrufst, wenn fadeValueR schon 255 ist.
Ausserdem erlaubst du jetzt in fade_up den Wert 254 nach dem Erhöhen nicht mehr, warum auch immer?

Ich denke, du willst sowas erreichen wie in meinem Vorschlag (2015-10-19, 10:26:27), oder ?