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
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);}}
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.
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;}}
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.
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);
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.
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 ?