Forum: Mikrocontroller und Digitale Elektronik for-schleife für led-kreis durchlaufen


von Lars (Gast)


Lesenswert?

Hallo,
ich bin gerade dabei einen Ring aus LEDs zu programmiere (60LEDs).
Das ganze soll einfach 'schöne' muster darstellen.
Es funktioniert auch schon ganz gut, wobei ich bisher immer nur mit 
einer for-Schleife von 0 bis 59 jede LED angesteuert habe.
1
for(i=0; i<MaxPixel; i++){
2
  ledArray[i].r=255;ledArray[i].g=255;ledArray[i].b=255;
3
  stripe.sendArray((uint8_t *)ledArray);
4
  _delay_ms(250);
5
}
Für ein neues Bild möchte ich eine Art Sternschnuppe darstellen. D.h. 
die erste LED leuchtet voll und ein paar dahinter immer schwächer 
werdend.
Jetzt komme ich zu einem Problem mit der for-schleife. Wenn z.B. die 
erste LED der 'Kopf'ist kann ich ja nicht direkt 5LEDs dahinter 
ansprechen

dann sähe es ja wie folgt aus (bsp. nur mit einer led als schweif
1
for(i=0; i<MaxPixel; i++){
2
  ledArray[i-1].r=100;ledArray[i-1].g=100;ledArray[i-1].b=100;
3
  ledArray[i].r=255;ledArray[i].g=255;ledArray[i].b=255;
4
  stripe.sendArray((uint8_t *)ledArray);
5
  _delay_ms(250);
6
}

mit ledArray[i-1] stürzt natürlich alles ab. Wie kann man es am besten 
machen, dass ledArray[-1] = ledArray[59] interpretiert wird?
folgend
ledArray[-2] = ledArray[58]...

man könnte in der schleife natürlich noch ein paar (oder ein paar mehr) 
if-bedingungen eintragen. Dann wird natürlich alles sehr unübersichtlich 
und wollte es daher vermeiden.

Lars

von Joachim B. (jar)


Lesenswert?

if((i-1) >= 0) ledArray[i-1].r=100;

usw.

oder
if(!((i-1) < 0))  ledArray[i-1].r=100;

von fop (Gast)


Lesenswert?

1
ledArray[(i+MaxPixel-1)%MaxPixel].r=100;

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joachim B. schrieb:
> usw.

 Tja.
 Mich würde usw. interessieren.
 Auch die else Abzweigung.

von Lars (Gast)


Lesenswert?

Joachim B. schrieb:
> if((i-1) >= 0) ledArray[i-1].r=100;

das hätte ja dann diese if-else schlacht, was ich vermeiden wollte.

fop schrieb:
> ledArray[(i+MaxPixel-1)%MaxPixel].r=100;

Das ist geschickt. Das müsste funktionieren. Ich danke dir

von Lars (Gast)


Lesenswert?

Lars schrieb:
> fop schrieb:
>> ledArray[(i+MaxPixel-1)%MaxPixel].r=100;
>
> Das ist geschickt. Das müsste funktionieren. Ich danke dir

Wobei das ganze nur mit werten < 10 funktioniert.
Da müsste ich dann doch wieder ein if/else einbauen

von c-hater (Gast)


Lesenswert?

Lars schrieb:

> fop schrieb:
>> ledArray[(i+MaxPixel-1)%MaxPixel].r=100;
>
> Das ist geschickt. Das müsste funktionieren. Ich danke dir

Das funktioniert. Jedenfalls die korrekte Fassung der Grundidee. Tipp: 
die "-1" steht an der falschen Stelle...

Aber: Das ist (zumindest auf einem AVR8) um vieles langsamer als eine 
Verzweigung. Ganz grob geschätzt: um den Faktor 1000.

> Wobei das ganze nur mit werten < 10 funktioniert.

Wie kommst du denn darauf? Das stimmt weder für die falsche Fassung noch 
für die korrekte.

Tss, Mathe ist nicht dein Ding, stimmts?

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.