iterieren durch zahlen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Hallo, ich stehe gerade vor ein logisches Problem wo ich mal eine kleine Hilfe benötige.

Und zwar habe ich ein LED Band WS2812 mit 300 LED's.

Darauf möchte ich jetzt fortlaufend 20 rote, dann 20 blaue, dann wieder 20 rote u.s.w. leuchten lassen.
Aber das ganze soll nach 1 Sekunde um eine Position nach hinten verschoben werden.

Beispiel:
LED Band komplett aus
1. LED rot an
1 Sekunde warten
2. LED rot an
1 Sekunde warten
3. LED rot an
u.
s.
w.
20. LED rot an
> dann soll die 1. LED blau und die 2. bis die 21. LED rot leuchten.
1 Sekunde warten
1. - 2. LED blau an
3. - 22. LED rot an
u.
s.
w.
20. LED blau an
21-40 LED rot an
1 Sekunde warten
1. LED rot, 2. - 21. LED blau und 22. - 41. LED rot

und das soll immer fortgeführt werden so das es immer fortlaufend ist.

Wenn das Ende erreicht ist, und hinten nur noch 5 rote leuchten sollen vorne wieder 15 leuchten.

Im Prinzip so (ich mache es mal mit nur 95 LED als Darstellung):

rrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrr
1 Sekunde warten
rrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrr
1 Sekunde warten
rrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrr
1 Sekunde warten
rrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrr
1 Sekunde warten
rrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrr
1 Sekunde warten
rrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrr
1 Sekunde warten
brrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrr
1 Sekunde warten
bbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrr
1 Sekunde warten
bbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrbbbbbbbbbbbbbbbbbbbbrrrrrrrrrrr

Ich hoffe ich konnte es einigermaßen gut erklären mein Problem.

Was ich bisher versucht habe was aber nur bis zum ende funktioniert und dann "stehen" bleibt.

Code: Alles auswählen

	if red < 300:
            red_test(red)
            red += 1
            if red >= 40:
                red_test(red - 40)
            if red >= 80:
                red_test(red - 80)
            if red >= 120:
                red_test(red - 120)
            if red >= 160:
                red_test(red - 160)
            if red >= 200:
                red_test(red - 200)
            if red >= 240:
                red_test(red - 240)
            if red >= 280:
                red_test(red - 280)
            
      else:
            red = 0
            
            
        if blue < 300 and red > 20:
            blue_test(blue)
            blue += 1
            
            if blue >= 40:
                blue_test(blue - 40)
            if blue >= 80:
                blue_test(blue - 80)
            if blue >= 120:
                blue_test(blue - 120)
            if blue >= 160:
                blue_test(blue - 160)
            if blue >= 200:
                blue_test(blue - 200)
            if blue >= 240:
                blue_test(blue - 240)
            if blue >= 280:
                blue_test(blue - 280)
        else:
            blue = 0
        time.sleep(1)
Weiter komme ich jetzt leider nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da geht man einfach die Indexwerte der LEDs durch und berechnet ob die LED an Index `i` rot oder blau leuchten muss. Nix mit Unmengen an ``if``/``else`` mit lauter Vergleichen mit festen Zahlen die man per Hand ausrechnen muss.

Mit 75 statt mit 95 ”Stellen”, damit es ins übliche 80-Zeichen Terminal passt:

Code: Alles auswählen

#!/usr/bin/env python3
from time import sleep

LENGTH = 75
SAME_COLOR_LENGTH = 20


def main():
    offset = 0
    while True:
        for i in range(LENGTH):
            color = "r" if (i + offset) // SAME_COLOR_LENGTH % 2 == 0 else "b"
            print(color, end="")
        print(end="\r")
        offset = (offset - 1) % (SAME_COLOR_LENGTH * 2)
        sleep(0.5)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür kann man eine Deque benutzen, damit kann man dann auch beliebige Muster durchrotieren:

Code: Alles auswählen

#!/usr/bin/env python3
from time import sleep
from collections import deque

def main():
    led_colors = deque(("r"*10 + "g" * 10) * 4)
    while True:
        print(''.join(led_colors))
        led_colors.rotate(-1)
        sleep(0.5)

if __name__ == "__main__":
    main()
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

__blackjack__ hat geschrieben: Samstag 3. Juni 2023, 10:52

Code: Alles auswählen

#!/usr/bin/env python3
from time import sleep

LENGTH = 75
SAME_COLOR_LENGTH = 20


def main():
    offset = 0
    while True:
        for i in range(LENGTH):
            color = "r" if (i + offset) // SAME_COLOR_LENGTH % 2 == 0 else "b"
            print(color, end="")
        print(end="\r")
        offset = (offset - 1) % (SAME_COLOR_LENGTH * 2)
        sleep(0.5)


if __name__ == "__main__":
    main()
OK, soweit klappt das, ich versuche mir gerade das logisch alles durchzuspielen wir das genau funktioniert.
Danke.
Antworten