11. 控制 NeoPixels

NeoPixels,也称为 WS2812 LED,是串联连接的全彩 LED,可单独寻址,并且可以将其红色、绿色和蓝色分量设置在 0 到 255 之间。它们需要精确的时序来控制它们,并且有一个特殊的 neopixel 模块可以做到这一点。

要创建 NeoPixel 对象,请执行以下操作:

>>> import machine, neopixel
>>> np = neopixel.NeoPixel(machine.Pin(4), 8)

这将在 GPIO4 上配置一个具有 8 个像素的 NeoPixel 条。您可以调整“4”(引脚编号)和“8”(像素数)以适合您的设置。

要设置像素的颜色,请使用:

>>> np[0] = (255, 0, 0) # set to red, full brightness
>>> np[1] = (0, 128, 0) # set to green, half brightness
>>> np[2] = (0, 0, 64)  # set to blue, quarter brightness

对于超过 3 种颜色的 LED,例如 RGBW 像素或 RGBY 像素,NeoPixel 类采用一个bpp 参数。要为 RGBW 像素设置 NeoPixel 对象,请执行以下操作:

>>> import machine, neopixel
>>> np = neopixel.NeoPixel(machine.Pin(4), 8, bpp=4)

在 4-bpp 模式下,请记住使用 4-tuples 而不是 3-tuples 来设置颜色。例如设置前三个像素使用:

>>> np[0] = (255, 0, 0, 128) # Orange in an RGBY Setup
>>> np[1] = (0, 255, 0, 128) # Yellow-green in an RGBY Setup
>>> np[2] = (0, 0, 255, 128) # Green-blue in an RGBY Setup

然后使用该 write() 方法将颜色输出到 LED:

>>> np.write()

以下演示功能在 LED 上进行了精彩的展示:

import time

def demo(np):
    n = np.n

    # cycle
    for i in range(4 * n):
        for j in range(n):
            np[j] = (0, 0, 0)
        np[i % n] = (255, 255, 255)
        np.write()
        time.sleep_ms(25)

    # bounce
    for i in range(4 * n):
        for j in range(n):
            np[j] = (0, 0, 128)
        if (i // n) % 2 == 0:
            np[i % n] = (0, 0, 0)
        else:
            np[n - 1 - (i % n)] = (0, 0, 0)
        np.write()
        time.sleep_ms(60)

    # fade in/out
    for i in range(0, 4 * 256, 8):
        for j in range(n):
            if (i // 256) % 2 == 0:
                val = i & 0xff
            else:
                val = 255 - (i & 0xff)
            np[j] = (val, 0, 0)
        np.write()

    # clear
    for i in range(n):
        np[i] = (0, 0, 0)
    np.write()

使用以下命令执行它:

>>> demo(np)