Raspberry Pi Pico應用-環狀LED燈以及七彩旋轉光環

我們今天要試著讓環狀LED燈發出紅藍綠(RGB)循環閃爍以及建立七彩旋轉光環(NeoPixel)。

需要的材料如下:

WS2812 RGB 12-LEDs 環狀燈條 x1

Pi Pico主板 x 1

排線數條


我們先看到下圖中,環狀燈條的背面,有三根接腳,D1是訊號線,可以接到Pico主板的第1腳(GP0),5V是電源線接到Pico的第40腳(VBUS),GND是地線接到第38腳(GND)。


接著開始用Thonny寫程式,所採用的程式參考來自以下網站:

https://electrocredible.com/neopixel-micropython-raspberry-pi-pico-ws2812b/

首先讓環狀LED燈發出紅藍綠(RGB)循環閃爍。

程式內容中將 ws_pin設定為 0,表示連接環狀LED燈的訊號線道 GP0 腳位。 led_num是WS2812環中LED的數量,我們設定為12,。

BRIGHTNESS的指令用來控制 NeoPixel 環的亮度,我們設定為 0.2,表示 LED的亮度等級為20%亮度,若要達到最大亮度,請將此變數設為 1。

loop 函數依序顯示三種顏色,首先將 color 設為 (255, 0, 0),代表紅色。然後呼叫set_brightness來調整顏色的亮度。neoRing.fill(color) 是用調整後的顏色填滿LED環。之後,它使用 neoRing.write() 以新顏色更新LED環。顯示綠色和藍色是重複相同的過程。最後建立無限循環,重複呼叫loop函數,不斷循環顯示顏色。

(255,0,0)是紅色顏色的描述,綠色是(0,255,0),RGB燈環理論上可以顯示千百種不同顏色的燈光,大家可以在網路上找相關資訊再嘗試。

執行程式後就可以看到LED燈環輪流發出紅綠藍三個顏色的燈光。


可以複製的程式

import neopixel

from machine import Pin

import time


ws_pin = 0

led_num = 12

BRIGHTNESS = 0.2  # Adjust the brightness (0.0 - 1.0)

 

neoRing = neopixel.NeoPixel(Pin(ws_pin), led_num)

 

def set_brightness(color):

    r, g, b = color

    r = int(r * BRIGHTNESS)

    g = int(g * BRIGHTNESS)

    b = int(b * BRIGHTNESS)

    return (r, g, b)

 

def loop():

    # Display red

    color = (255, 0, 0)  # Red color

    color = set_brightness(color)

    neoRing.fill(color)

    neoRing.write()

    time.sleep(1)

 

    # Display green

    color = (0, 255, 0)  # Green color

    color = set_brightness(color)

    neoRing.fill(color)

    neoRing.write()

    time.sleep(1)

 

    # Display blue

    color = (0, 0, 255)  # Blue color

    color = set_brightness(color)

    neoRing.fill(color)

    neoRing.write()

    time.sleep(1)

 

while True:

    loop()


接著我們用另一個程式來建立七彩旋轉光環(NeoPixel),可以讓LED燈環出現彩虹動畫效果,不斷循環不同的顏色。
接腳和前面兩行的程式都不變,我們把brightness = 0.5,較高的亮度可以讓閃爍的效果比較明顯。
接續的程式是用廻圈計算每一個LED和時間發出的顏色,如果前面所說RGB 色彩代碼表達為 (R,G,B),其中 R、G 和 B 為紅光、綠光以及藍光強度的十進位值,範圍介於 0 至 255。程式中(pos * 3, 255 - pos * 3, 0)這個函數是混和紅光和綠光來發出紅黃色的燈光,每次計算每顆LED燈的顏色代碼都會改變,重複迴圈運算就看到如同七彩霓虹燈的燈環閃爍效果。
time.sleep_ms(200)是燈光閃爍的間隔時間,目前設定為200毫秒,如果改為100可以看到閃爍的更明顯。





可以複製的程式

import neopixel  # Import the neopixel module for controlling the WS2812 LEDs

from machine import Pin  # Import the Pin module for GPIO control

import time  # Import the time module for delays

 

ws_pin = 0  # GPIO pin connected to the data line of the WS2812 ring

led_num = 12  # Number of LEDs in the WS2812 ring

 

position = 0  # Variable to keep track of the current position in the rainbow animation

brightness = 0.5  # Adjust the initial brightness (0.0 to 1.0)

 

neoRing = neopixel.NeoPixel(Pin(ws_pin), led_num)  # Create an instance of the NeoPixel class to control the WS2812 ring

 

def wheel(pos):

    # Function to generate a color based on a position in the rainbow

    if pos < 85:

        return (pos * 3, 255 - pos * 3, 0)  # Generate a red-yellow color

    elif pos < 170:

        pos -= 85

        return (255 - pos * 3, 0, pos * 3)  # Generate a yellow-green color

    else:

        pos -= 170

        return (0, pos * 3, 255 - pos * 3)  # Generate a green-blue color

 

def loop():

    global position, brightness  # Use global variables for position and brightness

 

    for i in range(led_num):

        # Iterate through each LED in the ring

        hue = int(i * (255 / led_num) + position) % 256  # Calculate the hue value based on the LED position and current position

        color = wheel(hue)  # Get the color based on the calculated hue

        color = tuple(int(val * brightness) for val in color)  # Adjust the color brightness

        neoRing[(i + position) % led_num] = color  # Set the color of the corresponding LED

 

    neoRing.write()  # Update the WS2812 ring with the new colors

    position = (position + 1) % led_num  # Increment the position for the next iteration

    time.sleep_ms(200)  # Delay for a short period to control the animation speed

 

while True:

    loop()  # Run the loop function continuously to display the rainbow animation





留言