From 537db91acc4b9c641c7c82ea831e12216961e638 Mon Sep 17 00:00:00 2001 From: jimmy Date: Fri, 21 Apr 2023 11:27:17 +1200 Subject: [PATCH] Update heart.py --- heart.py | 13 ++++++++ ws2812b.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 heart.py create mode 100644 ws2812b.py diff --git a/heart.py b/heart.py new file mode 100644 index 0000000..71a8af8 --- /dev/null +++ b/heart.py @@ -0,0 +1,13 @@ +from ws2812b import WS2812B +import time + +ws = WS2812B(256, 28, 0.2) + +array = [[ws.RED, ws.BLACK, ws.BLACK, ws.BLACK], + [ws.BLACK, ws.BLACK, ws.BLACK, ws.BLACK], + [ws.BLACK, ws.BLACK, ws.BLACK, ws.BLACK], + [ws.BLACK, ws.BLACK, ws.BLACK, ws.BLACK]] + +for i in range(4): + ws.pixels_set(i, array[i][0]) +ws.pixels_show() \ No newline at end of file diff --git a/ws2812b.py b/ws2812b.py new file mode 100644 index 0000000..2cfb56e --- /dev/null +++ b/ws2812b.py @@ -0,0 +1,96 @@ +# Example using PIO to drive a set of WS2812 LEDs. + +import array, time +from machine import Pin +import rp2 +from random import randint +from time import sleep + +# Configure the number of WS2812 LEDs. +NUM_LEDS = 256 +PIN_NUM = 0 +brightness = 0.2 + +@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24) +def ws2812(): + T1 = 2 + T2 = 5 + T3 = 3 + wrap_target() + label("bitloop") + out(x, 1) .side(0) [T3 - 1] + jmp(not_x, "do_zero") .side(1) [T1 - 1] + jmp("bitloop") .side(1) [T2 - 1] + label("do_zero") + nop() .side(0) [T2 - 1] + wrap() + +class WS2812B: + def __init__(self, num_leds, pin_num, brightness): + # Create the StateMachine with the ws2812 program, outputting on pin + self.sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(pin_num)) + + # Start the StateMachine, it will wait for data on its FIFO. + self.sm.active(1) + + # Display a pattern on the LEDs via an array of LED RGB values. + self.ar = array.array("I", [0 for _ in range(num_leds)]) + self.num_leds = num_leds + self.brightness = brightness + + ########################################################################## + def pixels_show(self): + dimmer_ar = array.array("I", [0 for _ in range(self.num_leds)]) + for i,c in enumerate(self.ar): + r = int(((c >> 8) & 0xFF) * self.brightness) + g = int(((c >> 16) & 0xFF) * self.brightness) + b = int((c & 0xFF) * self.brightness) + dimmer_ar[i] = (g<<16) + (r<<8) + b + self.sm.put(dimmer_ar, 8) + time.sleep_ms(10) + + def pixels_set(self, i, color): + self.ar[i] = (color[1]<<16) + (color[0]<<8) + color[2] + + def pixels_fill(self, color): + for i in range(len(self.ar)): + self.pixels_set(i, color) + + def color_chase(self, color, wait): + for i in range(self.num_leds): + self.pixels_set(i, color) + time.sleep(wait) + self.pixels_show() + time.sleep(0.2) + + def wheel(self, pos): + # Input a value 0 to 255 to get a color value. + # The colours are a transition r - g - b - back to r. + if pos < 0 or pos > 255: + return (0, 0, 0) + if pos < 85: + return (255 - pos * 3, pos * 3, 0) + if pos < 170: + pos -= 85 + return (0, 255 - pos * 3, pos * 3) + pos -= 170 + return (pos * 3, 0, 255 - pos * 3) + + + def rainbow_cycle(self, wait): + for j in range(255): + for i in range(self.num_leds): + rc_index = (i * 256 // self.num_leds) + j + self.pixels_set(i, self.wheel(rc_index & 255)) + self.pixels_show() + time.sleep(wait) + + BLACK = (0, 0, 0) + RED = (255, 0, 0) + YELLOW = (255, 150, 0) + GREEN = (0, 255, 0) + CYAN = (0, 255, 255) + BLUE = (0, 0, 255) + PURPLE = (180, 0, 255) + WHITE = (255, 255, 255) + COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE) \ No newline at end of file