CircuitPython

Для работы с WS2812b используем библиотеку neopixel, которая имеется в стандартном наборе библиотек от Adafruit (ссылка в конце урока). Всё, что нам нужно сделать для её установки — это скопировать файл neopixel.mpy в папку lib на накопителе CIRCUITPY.

Более подробно о работе с библиотеками CircuitPython мы писали в одном из ранних наших уроков: Библиотеки для CircuitPython

Программа: радуга

В первой программе попробуем зажечь линейку семью цветами радуги а оставшийся 8-й светодиод пусть горит белым. Начнём с подключения всех необходимых библиотек. Помним, что в python это делается с помощью команды import.

Кроме neopixel нам будет нужна еще одна библиотека:

  • board — хранит названия всех контактов платы контроллера и их синонимы.

Создаём объект NeoPixel, в конструктор которого передаем четыре аргумента:

  • pixel_pin — контакт, к которому подключена сигнальная линия первого адресного светодиода;
  • num_pixels — количество светодиодов в сборке;
  • brightness — яркость, в диапазоне от 0 до 1;
  • auto_write — режим автоматического обновления после каждого присваивания цвета пикселю.
import board
import neopixel

pixel_pin = board.D4
num_pixels = 8

rainbow = (
    (128,0,0),(128,64,0),(128,128,0),(0,128,0),
    (0,128,128),(0,0,128),(128,0,128),(128,128,128)
)

pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.3, auto_write=False)

for i,c in enumerate(rainbow):
    pixels[i] = c

pixels.show()

Сохраняем программу и наблюдаем статичную радугу.

Программа: анимация

А теперь вместо статичной радуги сделаем переливающуюся.

Импортируем еще две библиотеки:

  • time — предоставляет функцию sleep для организации паузы;
  • from rainbowio import colorwheel — математическая функция распределения радуги (см. пример для Arduino IDE).

Исходный код:

import time
import board
from rainbowio import colorwheel
import neopixel

pixel_pin = board.D4
num_pixels = 8

pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.3, auto_write=False)

while True:
    for j in range(0,255,8):
        for i in range(8):
            pixels[i] = colorwheel(((i * 256 // num_pixels) + j) & 255)
        pixels.show()
        time.sleep(0.1)


Изменено: