Small experiment catalogue
Raspberry pie science experiment
001 turn on the first LED
002 light up the LED lamp group
003_ Switch control LED light
004_ Obtain temperature and humidity
005_ Running lamp (ws2812b))
preface
For unknown reasons, in a burst of smoke, my raspberry pie 4B motherboard and interface board were reimbursed. Only today did I receive a new board purchased from Jingdong at a high price (it's really expensive to do hardware development!) New year's first burning, I hope this year can be prosperous!
To make a long story short, get back to the point: this experiment still imports the required library files from github.
https://github.com/rpi-ws281x/rpi-ws281x-python
Tip: the following is the main content of this article. The following cases can be used for reference
1, Experimental element
WS2812 component board with 8 RGB light beads
One GPIO expansion board or one bread board
2, ws2812b principle
Here is the description of 2812 principle cited. The output of 3.3v can be used in the actual connection
The general wiring diagram is as follows:
VCC: 3.3v is connected from the 3.3v power supply GPIO of raspberry pie
GND: connected to the common ground interface of raspberry pie
Control pin: connected to IO12 (here it needs to be connected to PWM pin, because we need to adjust the frequency later)
Each lamp bead is connected in series. From DI to DO, a filter capacitor (100MF) is required between VCC and GND
For ws2812b, you can download the ready-made library from github. There is no need to restart the underlying application. We can call it directly.
3, Code part:
1) Import and install the library of ws2812
sudo pip install rpi_ws281x
2) Set public part
Some parts of the Chinese standard need to be modified according to the actual needs, and others can be modified or not
# LED strip configuration: LED_COUNT = 8 # Set the number of lamp beads. I only have 8 lamp beads LED_PIN = 12 #Set the connection position of the control pin (mine is 12 pin. Note that PWM needs to be used here. If it is 10 pin, SPI control needs to be used) LED_FREQ_HZ = 800000 # Set the frequency of PWM (that is, the frequency of lamp beads, 800KHZ) LED_DMA = 10 # DMA channel to use for generating signal (try 10) LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest LED_INVERT = False # True to invert the signal (when using NPN transistor level shift) LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
3) Define a function to light
Color: color value in RGB format.
strip: lamp group after initialization
def colorWipe(strip, color, wait_ms=50): """Wipe color across display a pixel at a time.""" for i in range(strip.numPixels()): strip.setPixelColor(i, color) strip.show() time.sleep(wait_ms / 1000.0)
4) Defines a gradient function
def rainbow(strip, wait_ms=20, iterations=1): """Draw rainbow that fades across all pixels at once.""" for j in range(256 * iterations): for i in range(strip.numPixels()): strip.setPixelColor(i, wheel((i + j) & 255)) strip.show() time.sleep(wait_ms / 1000.0) def rainbowCycle(strip, wait_ms=20, iterations=5): """Draw rainbow that uniformly distributes itself across all pixels.""" for j in range(256 * iterations): for i in range(strip.numPixels()): strip.setPixelColor(i, wheel(((i * 256 // strip.numPixels()) + j) & 255)) strip.show() time.sleep(wait_ms / 1000.0)
5) Define a function for the lantern
def theaterChaseRainbow(strip, wait_ms=50): """Rainbow movie theater light style chaser animation.""" for j in range(256): for q in range(3): for i in range(0, strip.numPixels(), 3): strip.setPixelColor(i + q, wheel((i + j) % 255)) strip.show() time.sleep(wait_ms / 1000.0) for i in range(0, strip.numPixels(), 3): strip.setPixelColor(i + q, 0)
Complete test cases:
# NeoPixel library strandtest example # Author: Tony DiCola (tony@tonydicola.com) # # Direct port of the Arduino NeoPixel library strandtest example. Showcases # various animations on a strip of NeoPixels. import time from rpi_ws281x import Color, PixelStrip, ws # LED strip configuration: LED_COUNT = 40 # Number of LED pixels. LED_PIN = 18 # GPIO pin connected to the pixels (must support PWM!). LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz) LED_DMA = 10 # DMA channel to use for generating signal (try 10) LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest LED_INVERT = False # True to invert the signal (when using NPN transistor level shift) LED_CHANNEL = 0 LED_STRIP = ws.SK6812_STRIP_RGBW # LED_STRIP = ws.SK6812W_STRIP # Define functions which animate LEDs in various ways. def colorWipe(strip, color, wait_ms=50): """Wipe color across display a pixel at a time.""" for i in range(strip.numPixels()): strip.setPixelColor(i, color) strip.show() time.sleep(wait_ms / 1000.0) def theaterChase(strip, color, wait_ms=50, iterations=10): """Movie theater light style chaser animation.""" for j in range(iterations): for q in range(3): for i in range(0, strip.numPixels(), 3): strip.setPixelColor(i + q, color) strip.show() time.sleep(wait_ms / 1000.0) for i in range(0, strip.numPixels(), 3): strip.setPixelColor(i + q, 0) def wheel(pos): """Generate rainbow colors across 0-255 positions.""" if pos < 85: return Color(pos * 3, 255 - pos * 3, 0) elif pos < 170: pos -= 85 return Color(255 - pos * 3, 0, pos * 3) else: pos -= 170 return Color(0, pos * 3, 255 - pos * 3) def rainbow(strip, wait_ms=20, iterations=1): """Draw rainbow that fades across all pixels at once.""" for j in range(256 * iterations): for i in range(strip.numPixels()): strip.setPixelColor(i, wheel((i + j) & 255)) strip.show() time.sleep(wait_ms / 1000.0) def rainbowCycle(strip, wait_ms=20, iterations=5): """Draw rainbow that uniformly distributes itself across all pixels.""" for j in range(256 * iterations): for i in range(strip.numPixels()): strip.setPixelColor(i, wheel(((i * 256 // strip.numPixels()) + j) & 255)) strip.show() time.sleep(wait_ms / 1000.0) def theaterChaseRainbow(strip, wait_ms=50): """Rainbow movie theater light style chaser animation.""" for j in range(256): for q in range(3): for i in range(0, strip.numPixels(), 3): strip.setPixelColor(i + q, wheel((i + j) % 255)) strip.show() time.sleep(wait_ms / 1000.0) for i in range(0, strip.numPixels(), 3): strip.setPixelColor(i + q, 0) # Main program logic follows: if __name__ == '__main__': # Create NeoPixel object with appropriate configuration. strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_STRIP) # Intialize the library (must be called once before other functions). strip.begin() print('Press Ctrl-C to quit.') while True: # Color wipe animations. colorWipe(strip, Color(255, 0, 0)) # Red wipe colorWipe(strip, Color(0, 255, 0)) # Blue wipe colorWipe(strip, Color(0, 0, 255)) # Green wipe colorWipe(strip, Color(0, 0, 0, 255)) # White wipe colorWipe(strip, Color(255, 255, 255)) # Composite White wipe colorWipe(strip, Color(255, 255, 255, 255)) # Composite White + White LED wipe # Theater chase animations. theaterChase(strip, Color(127, 0, 0)) # Red theater chase theaterChase(strip, Color(0, 127, 0)) # Green theater chase theaterChase(strip, Color(0, 0, 127)) # Blue theater chase theaterChase(strip, Color(0, 0, 0, 127)) # White theater chase theaterChase(strip, Color(127, 127, 127, 0)) # Composite White theater chase theaterChase(strip, Color(127, 127, 127, 127)) # Composite White + White theater chase # Rainbow animations. rainbow(strip) rainbowCycle(strip) theaterChaseRainbow(strip)
effect:
! [in