Neopixel
Этот модуль содержит функции для работы со светодиодами, подключенными к однопроводной шине, такими как светодиод WS2812B. Каждый светодиод в шине известен как пиксель.
Максимальное число пикселей ограничено объёмом памяти платы. При 1 КБ доступной памяти модуль может управлять 128 пикселями.
Поддерживаемые типы светодиодов
| Константа | Описание |
|---|---|
| neopixel.WS2812B | WS2812B (наиболее распространенный) |
| neopixel.WS2812 | WS2812 |
| neopixel.WS2811 | WS2811 |
instance = neopixel.attach(type, gpio, pixels)
Подключить NEOPIXEL к GPIO. Яркость устанавливается на уровне 20%.
Аргументы:
- type (тип): тип светодиода, который вы подключили к шине (neopixel.WS2812B, neopixel.WS2812 или neopixel.WS2811).
- gpio: GPIO для управления шиной. Используйте любое из значений pio.GPIOx, определенных в модуле pio, для этого.
- pixels (пиксели): количество пикселей (светодиодов), подключенных к шине.
Возвращает: экземпляр шины NEOPIXEL или исключение. Этот экземпляр необходимо сохранить в переменной для дальнейших операций с ним.
-- Attch a NEOPIXEL bus formed by 6 WS2812B leds, connected to GPIO14
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 6)
instance:setBrightness(brightness)
Установить яркость для последующих операций setPixel/fill. Не влияет на уже установленные пиксели.
Аргументы:
- brightness (яркость): значение яркости, число между 0 и 1.
Возвращает: ничего или исключение.
instance:fade(brightness, upd_opt)
Установить яркость всей ленты. Применяется ко всем уже установленным пикселям.
Аргументы:
- brightness (яркость): значение яркости, число между 0 и 1.
- upd_opt: true - отобразить сразу.
Возвращает: ничего или исключение.
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 6)
neo:fill(0, 6, 255, 0, 0) -- красный
neo:update()
tmr.delayms(500)
neo:fade(0.5, true) -- затемнить до 50%
tmr.delayms(500)
neo:fade(0.1, true) -- затемнить до 10%
instance:setPixel(pixel, red, green, blue, upd_opt)
Установить цвет пикселя, выраженный в его r/g/b компонентах.
Аргументы:
- pixel: номер пикселя (от 0 до pixels-1).
- red (красный): компонент красного цвета, от 0 до 255.
- green (зеленый): компонент зеленого цвета, от 0 до 255.
- blue (синий): компонент синего цвета, от 0 до 255.
- upd_opt: true - отобразить сразу.
Возвращает: ничего или исключение.
-- Setup a NEOPIXEL bus formed by 6 WS2812B leds, connected to GPIO14
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 6)
-- Set color for pixel 0 (pure red)
neo:setPixel(0, 255, 0, 0)
-- Set color for pixel 1 (pure green)
neo:setPixel(1, 0, 255, 0)
-- Set color for pixel 2 (pure white)
neo:setPixel(2, 255, 255, 255)
neo:update()
instance:fill(begin, end, r, g, b, upd_opt)
Заполнить сектор ленты заданным цветом.
Аргументы:
- begin: номер начального пикселя (включительно).
- end: номер конечного пикселя (не включительно).
- red (красный): компонент красного цвета, от 0 до 255.
- green (зеленый): компонент зеленого цвета, от 0 до 255.
- blue (синий): компонент синего цвета, от 0 до 255.
- upd_opt: true - отобразить сразу.
Возвращает: ничего или исключение.
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 10)
neo:fill(0, 5, 255, 0, 0) -- первые 5 пикселей красные
neo:fill(5, 10, 0, 0, 255) -- последние 5 пикселей синие
neo:update()
instance:shift(dir, upd_opt)
Сдвинуть ленту на один пиксель (циклический сдвиг).
Аргументы:
- dir: направление сдвига. true - вправо, false - влево.
- upd_opt: true - отобразить сразу.
Возвращает: ничего или исключение.
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 6)
neo:setPixel(0, 255, 0, 0, true) -- красный на позиции 0
while true do
neo:shift(true, true) -- сдвиг вправо
tmr.delayms(100)
end
instance:gradient(begin, end, upd_opt)
Создать градиент между двумя пикселями. Цвета начального и конечного пикселей должны быть установлены заранее.
Аргументы:
- begin: номер начального пикселя (включительно).
- end: номер конечного пикселя (включительно).
- upd_opt: true - отобразить сразу.
Возвращает: ничего или исключение.
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 10)
neo:setPixel(0, 255, 0, 0) -- красный на начале
neo:setPixel(9, 0, 0, 255) -- синий на конце
neo:gradient(0, 9, true) -- плавный переход от красного к синему
r, g, b = neopixel.hsvToRgb(h, s, v)
Преобразование цветов из HSV в компоненты RGB.
Аргументы:
- h: Hue (Оттенок) 0-1 (0=красный, 0.33=зеленый, 0.66=синий, 1=красный)
- s: Saturation (Насыщенность) 0-1
- v: Value (Яркость) 0-1
Возвращает:
- red (красный): компонент красного цвета, от 0 до 255.
- green (зеленый): компонент зеленого цвета, от 0 до 255.
- blue (синий): компонент синего цвета, от 0 до 255.
-- Радуга на 10 пикселях
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 10)
for i = 0, 9 do
r, g, b = neopixel.hsvToRgb(i / 10, 1, 1)
neo:setPixel(i, r, g, b)
end
neo:update()
instance:update()
Обновить светодиоды, подключенные к шине.
Аргументы: нет.
Возвращает: ничего или исключение.
-- Setup a NEOPIXEL bus formed by 6 WS2812B leds, connected to GPIO14
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 6)
-- Set color for pixel 0 (pure red)
neo:setPixel(0, 255, 0, 0)
-- Set color for pixel 1 (pure green)
neo:setPixel(1, 0, 255, 0)
-- Set color for pixel 2 (pure white)
neo:setPixel(2, 255, 255, 255)
-- Update the bus
neo:update()
Пример: бегущий огонек
В этом примере пиксель перемещается справа налево и слева направо в шине на 6 пикселей.
thread.start(function()
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, 6)
pixel = 0
direction = 0
while true do
neo:setPixel(pixel, 0, 255, 0)
neo:update()
tmr.delayms(100)
neo:setPixel(pixel, 0, 0, 0)
if (direction == 0) then
if (pixel == 5) then
direction = 1
pixel = 4
else
pixel = pixel + 1
end
else
if (pixel == 0) then
direction = 0
pixel = 1
else
pixel = pixel - 1
end
end
end
end)
Пример: радужная волна
thread.start(function()
local pixels = 30
neo = neopixel.attach(neopixel.WS2812B, pio.GPIO14, pixels)
neo:setBrightness(0.3)
local offset = 0
while true do
for i = 0, pixels - 1 do
local h = ((i + offset) % pixels) / pixels
local r, g, b = neopixel.hsvToRgb(h, 1, 1)
neo:setPixel(i, r, g, b)
end
neo:update()
offset = offset + 1
tmr.delayms(50)
end
end)