愚蠢的问题:有没有办法让颜色图案每 X 个 LED 重复一次?或者我是否必须为灯带中的每个 LED 写出图案?

dumb question: Is there a way to make a color pattern repeat every X number of LEDs? Or do I have to write out the pattern for each LED in the strip?

我有一条由 288 个可寻址 LED 组成的条带,它被分成每段 12 个 LED。我已经为一个片段编写了一堆颜色和图案代码。单一颜色很容易调整以填充所有部分,但我还没有完全弄清楚如何在不 copy/paste 的情况下制作图案并更正像素数。非常感谢任何见解,我将附上一个模式的副本作为示例。 (所有的图案都非常简单,基本上是两到三种颜色在整个片段中分解)

我刚刚尝试了一些谷歌搜索,并使用我已经知道的东西来尝试想出一种方法让它发挥作用。

import board
import neopixel
import time
pixels = neopixel.NeoPixel(board.D18, 288)

pixels[0] = (25, 255, 255)
pixels[1] = (25, 255, 255)
pixels[2] = (25, 255, 255)
pixels[3] = (25, 255, 255)
pixels[4] = (155, 155, 155)
pixels[5] = (155, 155, 155)
pixels[6] = (0, 0, 255)
pixels[7] = (0, 0, 255)
pixels[8] = (0, 0, 255)
pixels[9] = (0, 0, 255)
pixels[10] = (155, 155, 155)
pixels[11] = (155, 155, 155)

我想让这种模式在整个 288 个 LED 灯条上重复。

也许这样的东西对你有用:

pixel_config = [
    (25, 255, 255), 
    (25, 255, 255), 
    (25, 255, 255), 
    (25, 255, 255), 
    (155, 155, 155),
    (155, 155, 155),
    (0, 0, 255),
    (0, 0, 255),
    (0, 0, 255),
    (0, 0, 255),
    (155, 155, 155),
    (155, 155, 155)
]

runningIdx = 0
endingIdx = len(pixel_config)
for i in range(288):
    # Start new sequence if end is detected
    runningIdx = 0 if runningIdx == endingIdx else runningIdx

    pixels[i] = pixel_config[runningIdx]
    runningIdx += 1

基本上利用 运行 索引来跟踪要为给定像素设置的配置,并在设置最终配置以开始为下一个像素序列设置颜色时根据需要进行重置。

让我们首先设置我们在以下每个解决方案和辅助函数中使用的模式:

pattern = [
    (25, 255, 255), 
    (25, 255, 255), 
    (25, 255, 255), 
    (25, 255, 255), 
    (155, 155, 155),
    (155, 155, 155),
    (0, 0, 255),
    (0, 0, 255),
    (0, 0, 255),
    (0, 0, 255),
    (155, 155, 155),
    (155, 155, 155)
    ]

def roundup(numerator, denominator):
    return (numerator + denominator - 1) // denominator

roundup 函数基于此 answer 函数,它适用于此处,因为它应用于从长度派生的变量,这将是整数。

1) 你可以像这样很容易地把图案打包起来,它应该可以灵活地适应不同长度的图案或LED灯条:

len_strip = 288
len_pattern = len(pattern)

pixels = (pattern * roundup(len_strip,len_pattern))[:len_strip]

2) 这是一种可以遍历此模式(而不是整个数组)的方法:

pixels = [0]*288

for i in range(len(pixels)//12):
    pixels[12*i:12*i+12] = pixel_pattern

这会将它打包,这样您就可以遍历图案而不是遍历每个像素。

3) 如果你想打包它来处理不同长度的图案或 LED 阵列,你可以尝试像这样更灵活的东西:

pixels = [0]*288
strip_len = len(pixels)

pattern_len = len(pixel_pattern )

for i in range(roundup(len(pixels),pattern_len)):
    chunk_start = pattern_len*i
    chunk_end = chunk_start + pattern_len
    if chunk_end<strip_len:
        pixels[chunk_start:chunk_end] = pixel_pattern
    else:
        chunk_end = strip_len
        pixels[chunk_start:chunk_end] = pixel_pattern[0:chunk_end-chunk_start]

4) 如果你想在循环模式的同时解决每个问题,你也可以这样做:

pixels = [0]*288

for i in range(len(pixels)//12):
    pixels[12*i+0] = (25, 255, 255)
    pixels[12*i+1] = (25, 255, 255)
    pixels[12*i+2] = (25, 255, 255)
    pixels[12*i+3] = (25, 255, 255)
    pixels[12*i+4] = (155, 155, 155)
    pixels[12*i+5] = (155, 155, 155)
    pixels[12*i+6] = (0, 0, 255)
    pixels[12*i+7] = (0, 0, 255)
    pixels[12*i+8] = (0, 0, 255)
    pixels[12*i+9] = (0, 0, 255)
    pixels[12*i+10] = (155, 155, 155)
    pixels[12*i+11] = (155, 155, 155)