MicroPython:Платы/ESP8266/Руководство по MicroPython для ESP8266/Управление светодиодами APA102
Управление светодиодами APA102[1]
Светодиоды APA102 (также известные как светодиоды DotStar) – это полноцветные RGB-светодиоды, доступ к каждому из которых можно получить индивидуально. Обычно изготавливаются в виде полосы. Они отличаются от светодиодов NeoPixel тем, что им для управления требуется два контакта – для тактовой частоты и передачи данных. Кроме того, они поддерживают гораздо более высокую скорость передачи данных и частоту ШИМ, благодаря чему лучше подходят для создания визуальных эффектов, построенных на инерции зрения.
Чтобы создать объект APA102, выполните следующее:
>>> import machine, apa102
>>> strip = apa102.APA102(machine.Pin(5), machine.Pin(4), 60)
Это создаст объект для 60-пиксельной APA102-полосы, у которой контакт для тактового сигнала подключен к GPIO5, а контакт для передачи данных – к GPIO4. Вы можете подредактировать значения «5» и «4», чтобы они соответствовали вашей ситуации.
Данные об RGB-цвете и яркости отправляются APA102 в определенном порядке. Обычно это (Красный, Зеленый, Синий, Яркость). Если вы используете более новую версию APA102C, то на ней зеленый и синий цвета поменялись местами, поэтому порядок будет (Красный, Синий, Зеленый, Яркость). У версии APA102 более квадратные линзы, а у APA102C – более круглые. Если у вас версия APA102C, но вы предпочитаете задавать цветовые данные в формате RGB, а не RBG, то вы можете поменять этот порядок при помощи:
>>> strip.ORDER = (0, 2, 1, 3)
Чтобы задать цвета пикселей, используйте:
>>> strip[0] = (255, 255, 255, 31) # белый, полная яркость
>>> strip[1] = (255, 0, 0, 31) # красный, полная яркость
>>> strip[2] = (0, 255, 0, 15) # зеленый, половина яркости
>>> strip[3] = (0, 0, 255, 7) # синий, четверть яркости
Используйте метод write(), чтобы передать эти цветовые данные светодиодам:
>>> strip.write()
Демонстрация:
import time
import machine, apa102
# 1-метровая полоса с 60 светодиодами:
strip = apa102.APA102(machine.Pin(5), machine.Pin(4), 60)
brightness = 1 # 0 is off, 1 is dim, 31 is max
# вспомогательная функция, которая конвертирует
# постоянно меняющуюся переменную «offset» (0-255)
# в значение, которым можно задать цвет светодиода:
def wheel(offset, brightness):
# переход от красного к зеленому, потом к синему
# и обратно к красному:
offset = 255 - offset
if offset < 85:
return (255 - offset * 3, 0, offset * 3, brightness)
if offset < 170:
offset -= 85
return (0, offset * 3, 255 - offset * 3, brightness)
offset -= 170
return (offset * 3, 255 - offset * 3, 0, brightness)
# демо 1, RGB RGB RGB:
red = 0xff0000
green = red >> 8
blue = red >> 16
for i in range(strip.n):
colour = red >> (i % 3) * 8
strip[i] = ((colour & red) >> 16, (colour & green) >> 8, (colour & blue), brightness)
strip.write()
# демо 2, показать все цвета радуги:
for i in range(strip.n):
strip[i] = wheel((i * 256 // strip.n) % 255, brightness)
strip.write()
# демо 3, все пиксели поочередно загораются цветами радуги,
# попутно пиксели словно «движутся» по полосе:
for r in range(5):
for n in range(256):
for i in range(strip.n):
strip[i] = wheel(((i * 256 // strip.n) + n) & 255, brightness)
strip.write()
time.sleep_ms(25)
# демо 4, цвет один, яркости разные:
for b in range(31,-1,-1):
strip[0] = (255, 153, 0, b)
strip.write()
time.sleep_ms(250)
# финал, выключить все светодиоды:
strip.fill((0, 0, 0, 0))
strip.write()