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)
