LED Strip ansteuern mit Taster und Fade Effekt

Hallo Arduino Community,

ich habe mir eine Schreibtischlampe aus einem LED Strip gebastelt und nutze einen Arduino Nano als steuerungs Controller, weil ich das Steuerteil verloren habe. Die Schaltung habe ich schon soweit, dass ich den LED Strip mit einer kleinen Fernbedienung steuern kann. Nun wollte ich noch einen Taster zum An bzw. Aus schalten anbringen und einen Fade Effekt einfügen. Dies ist mein erstes richtiges Projekt und ich habe mir dies alles aus YouTube-Videos und Googlen zusammen gesucht. An sich habe ich keine Erfahrungen mit der Programmierung von Arduinos. An sich funktioniert der Sketsch und mit der Fernbedienung bin ich soweit glücklich. Das Problem mit dem Taster ist, dass er nur manchmal funktioniert und nicht bei jedem mal reagiert. Es kann sein das er 5-10 mal funktioniert und wieder 5 mal nicht und dann wieder. Ich habe den Taster schon über den Seriellen Monitor und mit einem Multimeter ausgelesen und gemessen, aber keinen Fehler gefunden. Das Signal wird sauber übertragen und in die Variable geschrieben. Vielleicht könnt ihr ja aus dem Sketch auslesen, was das Problem für den Nano ist. Zusätzlich komme ich mit meinem Fade Effekt, weiter unten, nicht weiter. Er faded zum nur 1x und stoppt dann. Zweites faded er nur durch ein paar Farben. Das 3. Problem ist, dass ich keine weiteren Eingaben/Ansteuerungen machen kann wenn der Fade Effekt läuft.

vielleicht könnt ihr mir ja ein paar Tipps geben, was ich noch anpassen muss.

Arduino Sketch:

#include <IRremote.h>

int before=0;
int brightr;
int brightb;
int brightg;
int blau=6;
int rot=10;
int gruen=9;//connect your LED to pin 9 
int steps; //dimmer steps, vary those to increase/decrease the steps between full brightness and turned off
int RECV_PIN=4; //data out of IR receiver connects to pin 4
int taster=5;
int tasterstatus=LOW;
int tastergedrueckt=0;
int statusblau;
int statusrot;
int statusgruen;
unsigned long tasterzeit=0;
unsigned long entprellzeit=50;
#define delayTime 20

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup(){
 irrecv.enableIRIn(); // start the receiver
 //before=0; //LED is turned off
 brightr=255; //brightness value is at maximum (255)
 brightb=255;
 brightg=255;
 pinMode(blau,OUTPUT);
 pinMode(rot,OUTPUT);
 pinMode(gruen,OUTPUT);
 pinMode(taster,INPUT);
 steps=5;
 
}

void loop() {

 tasterstatus = digitalRead(taster);
 statusrot = analogRead(rot);
 statusblau = analogRead(blau);
 statusgruen = analogRead(gruen);


 if (tasterstatus == HIGH)
 {
   tasterzeit = millis();
   tastergedrueckt = 1;
 }

 if ((millis() - tasterzeit > entprellzeit) && tastergedrueckt == 1)
 {
  if (statusrot == 0 && statusblau == 0 && statusgruen == 0)
  {    
   analogWrite(rot,255);
   analogWrite(blau,170);
   analogWrite(gruen,220);
   tastergedrueckt=0;
 
 }

if (statusrot > 0 || statusblau > 0 || statusgruen > 0)
 {
   analogWrite(rot,0);
   analogWrite(blau,0);
   analogWrite(gruen,0);
   tastergedrueckt=0;

 }
 }
 
 
 if (irrecv.decode(&results)) {

 if (results.value==0xF7C03F){ //Code to turn the LED ON 
     digitalWrite(rot,HIGH);
     digitalWrite(blau,HIGH);
     digitalWrite(gruen,HIGH);
     before=1;
     }

 if (results.value==0xF740BF){ //Code to turn the LED OFF 
     digitalWrite(rot,LOW);
     digitalWrite(blau,LOW);
     digitalWrite(gruen,LOW);
     before=0;
     }

if (results.value==0xF720DF){ //ROT 
     digitalWrite(rot,HIGH);
     digitalWrite(blau,LOW);
     digitalWrite(gruen,LOW);
     before=1;
     }

if (results.value==0xF7A05F){ //GRUEN 
     digitalWrite(rot,LOW);
     digitalWrite(blau,LOW);
     digitalWrite(gruen,HIGH);
     before=1;
     }

if (results.value==0xF7609F){ //BLAU 
     digitalWrite(rot,LOW);
     digitalWrite(blau,HIGH);
     digitalWrite(gruen,LOW);
     before=1;
     }

if (results.value==0xF7E01F){ //WEISS 
     analogWrite(rot,255);
     analogWrite(blau,170);
     analogWrite(gruen,220);
     before=1;
     }

if (results.value==0xF710EF){ //Orangerot
     analogWrite(rot,255);
     analogWrite(blau,0);
     analogWrite(gruen,50);
     before=1;
     }      

if (results.value==0xF7906F){ //Gruen 2 
     analogWrite(rot,0);
     analogWrite(blau,0);
     analogWrite(gruen,100);
     before=1;
     }      
 
if (results.value==0xF750AF){ //Drunkelblau 
     analogWrite(rot,0);
     analogWrite(blau,139);
     analogWrite(gruen,00);
     before=1;
     }      
 
if (results.value==0xF730CF){ //orange 
     analogWrite(rot,255);
     analogWrite(blau,0);
     analogWrite(gruen,140);
     before=1;
     }      
 
if (results.value==0xF7B04F){ //Drunkelgruen 
     analogWrite(rot,50);
     analogWrite(blau,50);
     analogWrite(gruen,205);
     before=1;
     }      
 
if (results.value==0xF7708F){ //blauviolett 
     analogWrite(rot,85);
     analogWrite(blau,139);
     analogWrite(gruen,26);
     before=1;
     }      
 
if (results.value==0xF708F7){ //Ocker 
     analogWrite(rot,255);
     analogWrite(blau,0);
     analogWrite(gruen,165);
     before=1;
     }      
 
if (results.value==0xF78877){ //gelb gruen
     analogWrite(rot,127);
     analogWrite(blau,212);
     analogWrite(gruen,255);
     before=1;
     }      
 
if (results.value==0xF748B7){ //Lila
     analogWrite(rot,104);
     analogWrite(blau,139);
     analogWrite(gruen,34);
     before=1;
     }      
 
if (results.value==0xF728D7){ //gelb 
     analogWrite(rot,255);
     analogWrite(blau,0);
     analogWrite(gruen,220);
     before=1;
     }      
 
if (results.value==0xF7A857){ //türkies
     analogWrite(rot,64);
     analogWrite(blau,208);
     analogWrite(gruen,224);
     before=1;
     }      
 
if (results.value==0xF76897){ //Violett 
     analogWrite(rot,160);
     analogWrite(blau,240);
     analogWrite(gruen,32);
     before=1;
     }      
 

 
 if (results.value==0xF7807F && before==1){ //Code to decrease the brightness
   if(brightr-255/steps<0,brightb-255/steps<0,brightg-255/steps<0){ 
     analogWrite(rot,brightr);
     analogWrite(blau,brightb);
     analogWrite(gruen,brightg);
   }
   else{
   brightr=brightr-255/steps;
   brightb=brightb-255/steps;
   brightg=brightg-255/steps;
   analogWrite(rot,brightr);
   analogWrite(blau,brightb);
   analogWrite(gruen,brightg);
 }}
 if (results.value==0xF700FF && before==1){ //Code to increase the brightness
   if(brightr+255/steps>255,brightb+255/steps>255,brightg+255/steps>255){
     analogWrite(rot,brightr);
     analogWrite(blau,brightb);
     analogWrite(gruen,brightg);
   }
   else{    
  brightr=brightr+255/steps;
   brightb=brightb+255/steps;
   brightg=brightg+255/steps;
   analogWrite(rot,brightr);
   analogWrite(blau,brightb);
   analogWrite(gruen,brightg);
 }}

if (results.value==0xF7C837){ //Fade 
     int redVal = 255;
 int blueVal = 0;
 int greenVal = 0;
 for( int i = 0 ; i < 255 ; i += 1 ){
   greenVal += 1;
   redVal -= 1;
   analogWrite( gruen, 255 - greenVal );
   analogWrite( rot, 255 - redVal );

   delay( delayTime );
 }

 redVal = 0;
 blueVal = 0;
 greenVal = 255;
 for( int i = 0 ; i < 255 ; i += 1 ){
   blueVal += 1;
   greenVal -= 1;
   analogWrite( blau, 255 - blueVal );
   analogWrite( gruen, 255 - greenVal );

   delay( delayTime );
 }

 redVal = 0;
 blueVal = 255;
 greenVal = 0;
 for( int i = 0 ; i < 255 ; i += 1 ){
   redVal += 1;
   blueVal -= 1;
   analogWrite( rot, 255 - redVal );
   analogWrite( blau, 255 - blueVal );

   delay( delayTime );
 }
     }      
 
 irrecv.resume();
}}

ich würde das delay(delayTime) in den For-Schleifen als Störenfried betrachten.
Das sind 20 ms * 255 Durchläufe = 5100 ms = 5,1 Sekunden blockieren des Programms pro Schleife. Davon hast Du mehrere hintereinander.
Er kommt ja erst aus der Schleife raus, wenn sie fertig ist.
Das solltest Du auch auf millis() umschreiben.

Gruß Tommy

Also danke Tommy :slight_smile: ich hab das gar nicht gesehen... das kommt davon, wenn man Strg-C und Strg-V macht... aber ich habe keine Idee wie ich der for-Schleife sagen kann dass sie warten soll. Das Delay ist ja recht einfach, aber wo soll ich die Millis-Funktion in die For-schleife einfügen?

Du hast doch schon eine große Schleife (loop). Da brauchst Du kein for.

Als Anregung zum Beispiel:
Merke Dir die millis, wenn Du den Wert um 1 erhöht hast (Den Wert narürlich auch) und wenn die 20 millis rum sind, dann wieder: Ist 255 erreicht - Ja: nix tun, nein Wert erhöhen, millis merken.

Gruß Tommy