Forum: Mikrocontroller und Digitale Elektronik Arduino LEDs flackern


von Kalli (Gast)


Lesenswert?

Hallo zusammen,

ich habe hier einen Beispielcode geschrieben um mehr über PWM heraus zu 
finden. Ich habe versucht insgesamt 7 LEDs nacheinander anzusteuern, 
wovon 5 nur mit analogWrite angesteuert werden. Diese 5 LEDs sollen erst 
von dunkel nach hell und danach von hell nach dunkel gehen. Als nächstes 
soll das dann bei der nächsten LED passieren. Mein Problem ist 
allerdings das die LEDS beim ausgehen schon sehr extrem flackern.

Vielen Dank im voraus für eure Hilfe



unsigned int i;
unsigned int y;
int barriertime=6000;
unsigned int value =barriertime/6;
int value2=value *2;
int value3=value *3;
int value4=value *4;
int value5=value *5;
int comparestate;
unsigned int brightness5;
unsigned int brightness4;
unsigned int brightness3;
unsigned int brightness2;
unsigned int brightness1;

#define ledopen 13   //Ausgabe Pin white LED
#define ledrun1 5  //Ausgabe Pin green LED
#define ledrun2 3  //Ausgabe Pin green LED
#define ledrun3 11  //Ausgabe Pin yellow LED
#define ledrun4 10  //Ausgabe Pin blue LED
#define ledrun5 9  //Ausgabe Pin yellow LED
#define ledclose 8   //Ausgabe Pin red LED

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Programm läuft...");

pinMode(ledopen,OUTPUT);    // Ausgabe LED festlegen
   pinMode(ledrun1,OUTPUT);    // Ausgabe LED festlegen
   pinMode(ledrun2,OUTPUT);    // Ausgabe LED festlegen
   pinMode(ledrun3,OUTPUT);    // Ausgabe LED festlegen
   pinMode(ledrun4,OUTPUT);    // Ausgabe LED festlegen
   pinMode(ledrun5,OUTPUT);    // Ausgabe LED festlegen
   pinMode(ledclose,OUTPUT);    // Ausgabe LED festlegen
}

void loop() {
for(i=0;i<=(barriertime+100);i++)
{
  delay(1);
    if (i==0)
  {
      comparestate=0;
  }

  if ((i>0)&& i<value)
  {
      comparestate=7;
  }
  if (i == value)
  {
      comparestate=1;
      y=value;

  }
  if (i>value)
  {
    comparestate=8;

  }

  if(i == value2)
  {
      comparestate=2;
      y=value;
  }

  if (i>value2)
  {
    comparestate=9;

  }
  if( i == value3)
  {
      comparestate=3;
      y=value;
  }

  if (i>value3)
  {
    comparestate=10;

  }

  if(i == value4)
  {
      comparestate=4;
      y=value;
  }

  if (i>value4)
  {
    comparestate=11;

  }

  if(i == value5)
  {
      comparestate=5;
      y=value;
  }

  if (i>value5)
  {
    comparestate=12;

  }

  if(i >= barriertime)
  {
      comparestate=6;
  }

  //Serial.println(brightness5);

  switch (comparestate)
  {
    case 0:
    {
        digitalWrite(ledclose,HIGH);

        analogWrite(ledrun5,0);
         digitalWrite(ledopen,LOW);
    }
    break;
    case 7:
    {
      digitalWrite(ledclose,0);
      brightness5=i/(float)value*255;
      // Serial.println(brightness5);
      analogWrite(ledrun5,brightness5);

    }
    break;
    case 1:
    {

        analogWrite(ledrun5,255);


        analogWrite(ledrun4,0);
    }
    break;
    case 8:
    {
      brightness5=y/(float)value*255;
      if ((brightness5 !=0) && (brightness5 <257))
      {
      analogWrite(ledrun5,brightness5);
      }
      y--;

      brightness4= (i-value)/(float)value*255;

      analogWrite(ledrun4,brightness4);

     // Serial.println(y);
    }
    case 2:
    {

        analogWrite(ledrun4,255);
        analogWrite(ledrun3,0);
        analogWrite(ledrun5,0);
    }
    break;
    case 9:
    {
              brightness4=y/(float)value*255;
      if (brightness4 !=0)
      {
      analogWrite(ledrun4,brightness4);
      }
      y--;
      //Serial.println(brightness4);
     //Serial.println(y);
      brightness3= (i-value)/(float)value*255;

      analogWrite(ledrun3,brightness3);
    }
    break;
    case 3:
    {
        analogWrite(ledrun3,255);
        analogWrite(ledrun4,0);
        analogWrite(ledrun2,0);
    }
    break;
    case 10:
    {
      brightness3=y/(float)value*255;
      if (brightness3 !=0)
      {
      analogWrite(ledrun3,brightness3);
      }
      y--;


      brightness2= (i-value)/(float)value*255;

      analogWrite(ledrun2,brightness2);
    }
    case 4:
    {
        analogWrite(ledrun2,255);
        analogWrite(ledrun1,0);
        analogWrite(ledrun3,0);
    }
    break;
    case 11:
    {
      brightness2=y/(float)value*255;
      if (brightness2 !=0)
      {
      analogWrite(ledrun2,brightness2);
      }
      y--;

      brightness1= (i-value)/(float)value*255;

      analogWrite(ledrun1,brightness1);
    }
    case 5:
    {
        analogWrite(ledrun1,255);
        analogWrite(ledrun2,0);
        digitalWrite(ledopen,LOW);
    }
    break;
    case 12:
    {
      brightness1=y/(float)value*255;
      if (brightness5 !=0)
      {
      analogWrite(ledrun1,brightness1);
      }
      y--;


    }
    case 6:
    {
        digitalWrite(ledopen,HIGH);
        analogWrite(ledrun1,0);
    }
    break;

    default:

    break;
  }
}
}

von Codelesa (Gast)


Lesenswert?

Kalli schrieb:
> Vielen Dank im voraus für eure Hilfe

Toll!

Du bedankst dich für Hilfe, sagst aber nicht was wir dir helfen
sollen. Nach dem Motto: hier ist mein Problem, schlagt euch
einfach mal damit herum.

Dann solltest du noch

"Wichtige Regeln - erst lesen, dann posten!" berücksichtigen,
d.h. lesen, verstehen und umsetzen.

von Motzer (Gast)


Lesenswert?

Dir kann keiner helfen.
Der hingeschmierte undokumentierte Code
begreifst du sicher nicht einmal selbst

Beschreib mal in Worten wie dein Programm funktionieren soll.
Mal von mir aus Bilder so wie du dir Vorstellst wie es funktionieren 
soll.

von dummi (Gast)


Lesenswert?

PWM bedeutet "Flackern", nur eben ganz schnell. Dein "delay(1)" bremst 
das "schnell" unnötig. Fang mal etwas kleiner an, mit einer LED und ohne 
das Delay.. Deinen Code zu lesen macht keinen Spaß.

von Kalli (Gast)


Lesenswert?

Tut mir leid ich bin Anfänger in Sachen Arduino und Foren.

Mein Programm kann man als Test für einen Schrankenlauf sehen. Eine 
Zählvariable i soll den Lauf erst mal Simulieren. Innerhalb der 
for-Schleife sollen dann die verschiedenen Cases angenommen werden bei 
Hochlauf der Variable i. Diese cases werden durch die If-Abfragen 
eingestellt. In den Cases werden die LEDs angesteuert. ledclose und 
ledopen sind die Endstände der "Schranke", ledrun 5 bis ledrun1 sind die 
Schrankenlauf leds und sollen halt langsam heller werden und danach 
wieder abdunkeln. Danach soll die nächste led angehen. Dieser Vorgang 
led noch aus, wird heller, ganz hell, dunkler werden und wieder ausgehen 
läuft jeweils in einen Case ab.

Und mein Problem ist jetzt:
Das Programm an sich läuft eigentlich. Das einzige was mich stört ist 
das alle LEDs außer die eine LED die an PIN 10 angeschlossen ist beim 
abdunkeln extrem flackern. Bei der LED an PIN 10 läuft das ausgehen sehr 
sauber ohne flackern. Dieser Vorgang des dunkel werdens der ledrun4 
passiert in case 9.
(jede LED ist mit einen Vorwiderstand beschaltet)

nochmal sorry für den unstrukturierten Quellcode. Es ist nur ein 
Testlauf. Ich habe es natürlich vorher nur an einer LED probiert und es 
hat sauber geklappt sogar an anderen Pins.

von Kalli (Gast)


Lesenswert?

Ok shit hab glaub ich schon mein Fehler gefunden. Ich hab bei ein paar 
cases break am Ende vergessen. Doofer Fehler. Trotzdem Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.