Merge pull request #592 from pimoroni/hel-festive-plasma-stick

Add festive Plasma Stick examples
patch-inkyframe7
Hel Gibbons 2022-12-02 15:39:23 +00:00 zatwierdzone przez GitHub
commit b1e8ed0864
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
7 zmienionych plików z 250 dodań i 10 usunięć

Wyświetl plik

@ -7,8 +7,12 @@
- [Alternating Blinkies](#alternating-blinkies) - [Alternating Blinkies](#alternating-blinkies)
- [Fire](#fire) - [Fire](#fire)
- [Moon](#moon) - [Moon](#moon)
- [Pulse](#pulse)
- [Rainbows](#rainbows) - [Rainbows](#rainbows)
- [Snow](#snow)
- [Sparkles](#sparkles)
- [Thermometer](#thermometer) - [Thermometer](#thermometer)
- [Tree](#tree)
- [Advanced Examples](#advanced-examples) - [Advanced Examples](#advanced-examples)
- [CO2](#co2) - [CO2](#co2)
- [Encoder](#encoder) - [Encoder](#encoder)
@ -86,18 +90,42 @@ A simple 🔥 fire effect example 🤘 (warning, flashy).
Spooky moon simulator - the LEDs will get brighter as midnight approaches! Spooky moon simulator - the LEDs will get brighter as midnight approaches!
Needs to be run from Thonny to get the correct time. Needs to be run from Thonny to get the correct time.
### Pulse
[pulse.py](pulse.py)
Adjust the brightness or saturation of the LEDs using a sine wave.
### Rainbows ### Rainbows
[rainbows.py](rainbows.py) [rainbows.py](rainbows.py)
Some good old fashioned rainbows! Some good old fashioned rainbows!
### Snow
[snow.py](snow.py)
Snow in a bottle!
### Sparkles
[sparkles.py](sparkles.py)
A festive, customisable sparkly effect.
### Thermometer ### Thermometer
[thermometer_pico.py](thermometer_pico.py) [thermometer_pico.py](thermometer_pico.py)
Reads the temperature from the Pico W's internal temperature sensor and changes the LED strip an appropriate colour. Reads the temperature from the Pico W's internal temperature sensor and changes the LED strip an appropriate colour.
### Tree
[tree.py](tree.py)
A Christmas tree simulator.
## Advanced Examples ## Advanced Examples
These examples require additional hardware. These examples require additional hardware.

Wyświetl plik

@ -0,0 +1,39 @@
import plasma
from plasma import plasma_stick
from math import sin
"""
Simple pulsing effect generated using a sine wave.
"""
# Set how many LEDs you have
NUM_LEDS = 50
# we're using HSV colours in this example - find more at https://colorpicker.me/
# to convert a hue that's in degrees, divide it by 360
COLOUR = 0.5
# set up the WS2812 / NeoPixel™ LEDs
led_strip = plasma.WS2812(NUM_LEDS, 0, 0, plasma_stick.DAT, color_order=plasma.COLOR_ORDER_RGB)
# start updating the LED strip
led_strip.start()
offset = 0
while True:
# use a sine wave to set the brightness
for i in range(NUM_LEDS):
led_strip.set_hsv(i, COLOUR, 1.0, sin(offset))
offset += 0.002
# # our sine wave goes between -1.0 and 1.0 - this means the LEDs will be off half the time
# # this formula forces the brightness to be between 0.0 and 1.0
# for i in range(NUM_LEDS):
# led_strip.set_hsv(i, COLOUR, 1.0, (1 + sin(offset)) / 2)
# offset += 0.002
# # adjust the saturation instead of the brightness/value
# for i in range(NUM_LEDS):
# led_strip.set_hsv(i, COLOUR, (1 + sin(offset)) / 2, 0.8)
# offset += 0.002

Wyświetl plik

@ -0,0 +1,62 @@
import plasma
from plasma import plasma_stick
from random import uniform
"""
Snow in a bottle! Always winter, never Christmas!
Adjust SNOW_INTENSITY for more snow.
"""
# Set how many LEDs you have
NUM_LEDS = 50
# How much snow? [bigger number = more snowflakes]
SNOW_INTENSITY = 0.0002
# Change RGB colours here (RGB colour picker: https://g.co/kgs/k2Egjk )
BACKGROUND_COLOUR = [30, 50, 50] # dim blue
SNOW_COLOUR = [240, 255, 255] # bluish white
# how quickly current colour changes to target colour [1 - 255]
FADE_UP_SPEED = 255 # abrupt change for a snowflake
FADE_DOWN_SPEED = 1
def display_current():
# paint our current LED colours to the strip
for i in range(NUM_LEDS):
led_strip.set_rgb(i, current_leds[i][0], current_leds[i][1], current_leds[i][2])
def move_to_target():
# nudge our current colours closer to the target colours
for i in range(NUM_LEDS):
for c in range(3): # 3 times, for R, G & B channels
if current_leds[i][c] < target_leds[i][c]:
current_leds[i][c] = min(current_leds[i][c] + FADE_UP_SPEED, target_leds[i][c]) # increase current, up to a maximum of target
elif current_leds[i][c] > target_leds[i][c]:
current_leds[i][c] = max(current_leds[i][c] - FADE_DOWN_SPEED, target_leds[i][c]) # reduce current, down to a minimum of target
# Create a list of [r, g, b] values that will hold current LED colours, for display
current_leds = [[0] * 3 for i in range(NUM_LEDS)]
# Create a list of [r, g, b] values that will hold target LED colours, to move towards
target_leds = [[0] * 3 for i in range(NUM_LEDS)]
# set up the WS2812 / NeoPixel™ LEDs
led_strip = plasma.WS2812(NUM_LEDS, 0, 0, plasma_stick.DAT, color_order=plasma.COLOR_ORDER_RGB)
# start updating the LED strip
led_strip.start()
while True:
for i in range(NUM_LEDS):
# randomly add snow
if SNOW_INTENSITY > uniform(0, 1):
# set a target to start a snowflake
target_leds[i] = SNOW_COLOUR
# slowly reset snowflake to background
if current_leds[i] == target_leds[i]:
target_leds[i] = BACKGROUND_COLOUR
move_to_target() # nudge our current colours closer to the target colours
display_current() # display current colours to strip

Wyświetl plik

@ -0,0 +1,61 @@
import plasma
from plasma import plasma_stick
from random import uniform
"""
A festive sparkly effect. Play around with BACKGROUND_COLOUR and SPARKLE_COLOUR for different effects!
"""
# Set how many LEDs you have
NUM_LEDS = 50
# How many sparkles? [bigger number = more sparkles]
SPARKLE_INTENSITY = 0.005
# Change your colours here! RGB colour picker: https://g.co/kgs/k2Egjk
BACKGROUND_COLOUR = [50, 50, 0]
SPARKLE_COLOUR = [255, 255, 0]
# how quickly current colour changes to target colour [1 - 255]
FADE_UP_SPEED = 2
FADE_DOWN_SPEED = 2
def display_current():
# paint our current LED colours to the strip
for i in range(NUM_LEDS):
led_strip.set_rgb(i, current_leds[i][0], current_leds[i][1], current_leds[i][2])
def move_to_target():
# nudge our current colours closer to the target colours
for i in range(NUM_LEDS):
for c in range(3): # 3 times, for R, G & B channels
if current_leds[i][c] < target_leds[i][c]:
current_leds[i][c] = min(current_leds[i][c] + FADE_UP_SPEED, target_leds[i][c]) # increase current, up to a maximum of target
elif current_leds[i][c] > target_leds[i][c]:
current_leds[i][c] = max(current_leds[i][c] - FADE_DOWN_SPEED, target_leds[i][c]) # reduce current, down to a minimum of target
# Create a list of [r, g, b] values that will hold current LED colours, for display
current_leds = [[0] * 3 for i in range(NUM_LEDS)]
# Create a list of [r, g, b] values that will hold target LED colours, to move towards
target_leds = [[0] * 3 for i in range(NUM_LEDS)]
# set up the WS2812 / NeoPixel™ LEDs
led_strip = plasma.WS2812(NUM_LEDS, 0, 0, plasma_stick.DAT, color_order=plasma.COLOR_ORDER_RGB)
# start updating the LED strip
led_strip.start()
while True:
for i in range(NUM_LEDS):
# randomly add sparkles
if SPARKLE_INTENSITY > uniform(0, 1):
# set a target to start a sparkle
target_leds[i] = SPARKLE_COLOUR
# for any sparkles that have achieved max sparkliness, reset them to background
if current_leds[i] == target_leds[i]:
target_leds[i] = BACKGROUND_COLOUR
move_to_target() # nudge our current colours closer to the target colours
display_current() # display current colours to strip

Wyświetl plik

@ -0,0 +1,42 @@
import time
import plasma
from plasma import plasma_stick
from random import random, choice
"""
A Christmas tree, with fairy lights!
This will probably work better if your LEDs are in a vaguely tree shaped bottle :)
"""
# Set how many LEDs you have
NUM_LEDS = 50
# we're using HSV colours in this example - find more at https://colorpicker.me/
# to convert a hue that's in degrees, divide it by 360
TREE_COLOUR = [0.34, 1.0, 0.6]
LIGHT_RATIO = 8 # every nth pixel is a light, the rest are tree.
LIGHT_COLOURS = ((0.0, 1.0, 1.0), # red
(0.1, 1.0, 1.0), # orange
(0.6, 1.0, 1.0), # blue
(0.85, 0.4, 1.0)) # pink
LIGHT_CHANGE_CHANCE = 0.5 # change to 0.0 if you want static lights
# set up the WS2812 / NeoPixel™ LEDs
led_strip = plasma.WS2812(NUM_LEDS, 0, 0, plasma_stick.DAT, color_order=plasma.COLOR_ORDER_RGB)
# start updating the LED strip
led_strip.start()
# initial setup
for i in range(NUM_LEDS):
if i % LIGHT_RATIO == 0: # add an appropriate number of lights
led_strip.set_hsv(i, *choice(LIGHT_COLOURS)) # choice randomly chooses from a list
else: # GREEN
led_strip.set_hsv(i, *TREE_COLOUR)
# animate
while True:
for i in range(NUM_LEDS):
if (i % LIGHT_RATIO == 0) and (random() < LIGHT_CHANGE_CHANCE):
led_strip.set_hsv(i, *choice(LIGHT_COLOURS))
time.sleep(0.5)

Wyświetl plik

@ -1,7 +1,7 @@
# BME280 <!-- omit in toc --> # BME280 <!-- omit in toc -->
- [Getting Started](#getting-started) - [Getting Started](#getting-started)
- [Reading Temperature, Pressure & Humidity](#reading-temperature-pressure--humidity) - [Reading Temperature, Pressure and Humidity](#reading-temperature-pressure-and-humidity)
- [Configuring The Sensor](#configuring-the-sensor) - [Configuring The Sensor](#configuring-the-sensor)
- [Filter Settings](#filter-settings) - [Filter Settings](#filter-settings)
- [Oversampling Settings](#oversampling-settings) - [Oversampling Settings](#oversampling-settings)
@ -24,7 +24,7 @@ i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN)
bme = BreakoutBME280(i2c) bme = BreakoutBME280(i2c)
``` ```
## Reading Temperature, Pressure & Humidity ## Reading Temperature, Pressure and Humidity
The `read` method will return a tuple containing Temperature (degrees C), Pressure (Pa) and Humidity (RH %) values: The `read` method will return a tuple containing Temperature (degrees C), Pressure (Pa) and Humidity (RH %) values:
@ -37,7 +37,7 @@ temperature, pressure, humidity = bme.read()
The `configure` method allows you to set up the oversampling, filtering and operation mode. The `configure` method allows you to set up the oversampling, filtering and operation mode.
```python ```python
bmp.configure(filter, standby_time, os_pressure, os_humidity, os_temp, mode) bme.configure(filter, standby_time, os_pressure, os_humidity, os_temp, mode)
``` ```
The `breakout_bme280` module includes constants for these: The `breakout_bme280` module includes constants for these:

Wyświetl plik

@ -13,11 +13,11 @@ Pico Graphics replaces the individual drivers for displays- if you're been using
- [I2C](#i2c) - [I2C](#i2c)
- [Function Reference](#function-reference) - [Function Reference](#function-reference)
- [General](#general) - [General](#general)
- [Creating & Setting Pens](#creating--setting-pens) - [Creating and Setting Pens](#creating-and-setting-pens)
- [RGB888, RGB565, RGB332, P8 and P4 modes](#rgb888-rgb565-rgb332-p8-and-p4-modes) - [RGB888, RGB565, RGB332, P8 and P4 modes](#rgb888-rgb565-rgb332-p8-and-p4-modes)
- [Monochrome Modes](#monochrome-modes) - [Monochrome Modes](#monochrome-modes)
- [Inky Frame](#inky-frame) - [Inky Frame](#inky-frame)
- [Controlling The Backlight](#controlling-the-backlight) - [Controlling the Backlight](#controlling-the-backlight)
- [Clipping](#clipping) - [Clipping](#clipping)
- [Clear](#clear) - [Clear](#clear)
- [Update](#update) - [Update](#update)
@ -136,7 +136,7 @@ display = PicoGraphics(display=DISPLAY_I2C_OLED_128X128, bus=i2cbus)
### General ### General
#### Creating & Setting Pens #### Creating and Setting Pens
##### RGB888, RGB565, RGB332, P8 and P4 modes ##### RGB888, RGB565, RGB332, P8 and P4 modes
@ -198,7 +198,7 @@ These are:
* `ORANGE` = 6 * `ORANGE` = 6
* `TAUPE` = 7 * `TAUPE` = 7
#### Controlling The Backlight #### Controlling the Backlight
You can set the display backlight brightness between `0.0` and `1.0`: You can set the display backlight brightness between `0.0` and `1.0`:
@ -228,7 +228,7 @@ Clear the display to the current pen colour:
display.clear() display.clear()
``` ```
This is equivilent to: This is equivalent to:
```python ```python
w, h = display.get_bounds() w, h = display.get_bounds()
@ -302,7 +302,6 @@ For example:
display.set_font("bitmap8") display.set_font("bitmap8")
display.text("Hello World", 0, 0, scale=2) display.text("Hello World", 0, 0, scale=2)
``` ```
Draws "Hello World" in a 16px tall, 2x scaled version of the `bitmap8` font. Draws "Hello World" in a 16px tall, 2x scaled version of the `bitmap8` font.
Sometimes you might want to measure a text string for centering or alignment on screen, you can do this with: Sometimes you might want to measure a text string for centering or alignment on screen, you can do this with:
@ -319,6 +318,15 @@ Write a single character:
display.character(char, x, y, scale) display.character(char, x, y, scale)
``` ```
Specify `char` using a [decimal ASCII code](https://www.ascii-code.com/). Note not all characters are supported.
For example:
```python
display.set_font("bitmap8")
display.character(38, 0, 0, scale=2)
```
Draws an ampersand in a 16px tall, 2x scaled version of the 'bitmap8' font.
### Basic Shapes ### Basic Shapes
#### Line #### Line
@ -329,7 +337,7 @@ To draw a line:
display.line(x1, y1, x2, y2) display.line(x1, y1, x2, y2)
``` ```
The X1/Y1 and X2/Y2 coordinates describe the start and end of the line repsectively. The X1/Y1 and X2/Y2 coordinates describe the start and end of the line respectively.
#### Circle #### Circle