for-schleife für led-kreis durchlaufen

Gast #4958127
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
Gast #4958256
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren