python手工制作_【Micropython】发光二极管手工制作炫彩跑马灯

import gc

import pyb

class WS2812:

    """

    Driver for WS2812 RGB LEDs. May be used for controlling single LED or chain

    of LEDs.

    Example of use:

        chain = WS2812(spi_bus=1, led_count=4)

        data = [

            (255, 0, 0),    # red

            (0, 255, 0),    # green

            (0, 0, 255),    # blue

            (85, 85, 85),   # white

        ]

        chain.show(data)

    Version: 1.0

    """

    buf_bytes = (0x11, 0x13, 0x31, 0x33)

    def __init__(self, spi_bus=1, led_count=1, intensity=1):

        """

        Params:

        * spi_bus = SPI bus ID (1 or 2)

        * led_count = count of LEDs

        * intensity = light intensity (float up to 1)

        """

        self.led_count = led_count

        self.intensity = intensity

        # prepare SPI data buffer (4 bytes for each color)

        self.buf_length = self.led_count * 3 * 4

        self.buf = bytearray(self.buf_length)

        # SPI init

        self.spi = pyb.SPI(spi_bus, pyb.SPI.MASTER, baudrate=3200000, polarity=0, phase=1)

        # turn LEDs off

        self.show([])

    def show(self, data):

        """

        Show RGB data on LEDs. Expected data = [(R, G, B), ...] where R, G and B

        are intensities of colors in range from 0 to 255. One RGB tuple for each

        LED. Count of tuples may be less than count of connected LEDs.

        """

        self.fill_buf(data)

        self.send_buf()

    def send_buf(self):

        """

        Send buffer over SPI.

        """

        self.spi.send(self.buf)

        gc.collect()

    def update_buf(self, data, start=0):

        """

        Fill a part of the buffer with RGB data.

        Order of colors in buffer is changed from RGB to GRB because WS2812 LED

        has GRB order of colors. Each color is represented by 4 bytes in buffer

        (1 byte for each 2 bits).

        Returns the index of the first unfilled LED

        Note: If you find this function ugly, it's because speed optimisations

        beated purity of code.

        """

        buf = self.buf

        buf_bytes = self.buf_bytes

        intensity = self.intensity

        mask = 0x03

        index = start * 12

        for red, green, blue in data:

            red = int(red * intensity)

            green = int(green * intensity)

            blue = int(blue * intensity)

            buf[index] = buf_bytes[green >> 6 & mask]

            buf[index+1] = buf_bytes[green >> 4 & mask]

            buf[index+2] = buf_bytes[green >> 2 & mask]

            buf[index+3] = buf_bytes[green & mask]

            buf[index+4] = buf_bytes[red >> 6 & mask]

            buf[index+5] = buf_bytes[red >> 4 & mask]

            buf[index+6] = buf_bytes[red >> 2 & mask]

            buf[index+7] = buf_bytes[red & mask]

            buf[index+8] = buf_bytes[blue >> 6 & mask]

            buf[index+9] = buf_bytes[blue >> 4 & mask]

            buf[index+10] = buf_bytes[blue >> 2 & mask]

            buf[index+11] = buf_bytes[blue & mask]

            index += 12

        return index // 12

    def fill_buf(self, data):

        """

        Fill buffer with RGB data.

        All LEDs after the data are turned off.

        """

        end = self.update_buf(data)

        # turn off the rest of the LEDs

        buf = self.buf

        off = self.buf_bytes[0]

        for index in range(end * 12, self.buf_length):

            buf[index] = off

            index += 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值