Перейти к содержанию
Материалы раздела

Neopixel

Этот модуль содержит функции для работы со светодиодами, подключенными к однопроводной шине, такими как светодиод WS2812B. Каждый светодиод в шине известен как пиксель.

Максимальное число пикселей ограничено объёмом памяти платы. При 1 КБ доступной памяти модуль может управлять 128 пикселями.

Поддерживаемые типы светодиодов

КонстантаОписание
neopixel.WS2812BWS2812B (наиболее распространенный)
neopixel.WS2812WS2812
neopixel.WS2811WS2811

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)