User Tools

Site Tools


12_neopixel_led_strip

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
12_neopixel_led_strip [2026/08/01 18:21] walkeradmin12_neopixel_led_strip [2026/08/02 13:48] (current) – [Knight Rider Lights] walkeradmin
Line 337: Line 337:
 \\  \\ 
 The NeoPixel in Wokwi isn't perfect, but it illustrates that the project will function as expected. The NeoPixel in Wokwi isn't perfect, but it illustrates that the project will function as expected.
 +\\ 
 +\\ 
 +----
 +==== NeoPixel LED Chase Sequence ====
 +
 +This next code scrolls down the line of NeoPixels. The most important line of code in this example is this:
 +
 +  * for i in range(NUM_LEDS):
 +
 +What this does is creates a range of numbers from the value of the NUM_LEDS (12 in our example) and this looks like this:
 +
 +  * 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
 +
 +So this for loop starts at '0' and does the following:
 +<code:python | download>
 +for i in range(NUM_LEDS):    # get the num range (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
 +        clear()              # call the clear function to turn off all leds
 +        np[i] = color        # set the color of first LED
 +        np.write()           # write the LED status
 +        time.sleep(delay)    # wait for delay time.
 +        
 +        # now the loop will do the same but for LED2, 3, 4 etc.
 +        # we clear the LEDs each time so that only 1 LED is ever illuminated.
 +</code>
 +We call this chase function 3 times:
 +
 +<code:python | download>
 +    # Chase effect
 +    chase((255, 0, 0), 0.08)
 +    chase((0, 255, 0), 0.08)
 +    chase((0, 0, 255), 0.08)
 +</code>
 +
 +First we set LEDs to Red, then second time it's Green then lastly we set Blue.
 +
 +Here is the full code:
 +<code:python | download>
 +# WS2812 / NeoPixel Example
 +# Raspberry Pi Pico + MicroPython
 +#
 +# Controls a strip of 12 LEDs connected to GP0.
 +
 +from machine import Pin
 +import neopixel
 +import time
 +
 +# -------------------------------
 +# Configuration
 +# -------------------------------
 +
 +LED_PIN = 8          # GPIO connected to DIN
 +NUM_LEDS = 12        # Number of LEDs, 0-11 is used, not 1-12
 +
 +# Create the NeoPixel object
 +np = neopixel.NeoPixel(Pin(LED_PIN), NUM_LEDS)
 +
 +# -------------------------------
 +# Helper Functions
 +# -------------------------------
 +
 +def clear():
 +    """Turn all LEDs off."""
 +    for i in range(NUM_LEDS):
 +        np[i] = (0, 0, 0)
 +    np.write()
 +
 +def chase(color, delay=1):
 +    """Move one LED along the strip."""
 +    clear()
 +
 +    for i in range(NUM_LEDS):
 +        clear()
 +        np[i] = color
 +        np.write()
 +        time.sleep(delay)
 +
 +# -------------------------------
 +# Main Program
 +# -------------------------------
 +
 +while True:
 +
 +    # Chase effect
 +    chase((255, 0, 0), 0.08)
 +    chase((0, 255, 0), 0.08)
 +    chase((0, 0, 255), 0.08)
 +</code>
 +
 +Here is a short video showing the sequence.
 +\\ 
 +\\ 
 +{{ :neopixel-chase-led-example-001.mp4?640 |}}
 +\\ 
 +It's a nice effect to see the LEDs chasing like this.
 +\\ 
 +\\ 
 +----
 +==== Knight Rider Lights ====
 +
 +Who remembers these?
 +\\ 
 +\\ 
 +{{ :knight-rider-001.mp4?640 |}}
 +\\ 
 +Well I do :) and we can replicate this effect with our Pico and NeoPixel LEDs. The code for this is almost identical to the previous project where we have the running LEDs.
 +\\ 
 +\\ 
 +The major change is the addition of this part:
 +<code:python | download>
 +    # Backward direction
 +    for i in range(NUM_LEDS - 2, 0, -1):
 +        clear()
 +        np[i] = color
 +        np.write()
 +        time.sleep(delay)
 +</code>
 +
 +In our previous project, the LEDs ran forward, then cycled colour, in this project we are not cycling the colour and the additional code runs the LEDs in reverse.
 +\\ 
 +\\ 
 +Here is the full code, explanation for how this works is at the end of this wiki page.
 +
 +<code:python | download>
 +# WS2812 / NeoPixel Example
 +# Raspberry Pi Pico + MicroPython
 +#
 +# Controls a strip of 12 LEDs connected to GP8.
 +
 +from machine import Pin
 +import neopixel
 +import time
 +
 +# -------------------------------
 +# Configuration
 +# -------------------------------
 +
 +LED_PIN = 8          # GPIO connected to DIN
 +NUM_LEDS = 12        # Number of LEDs, 0-11 is used, not 1-12
 +
 +# Create the NeoPixel object
 +np = neopixel.NeoPixel(Pin(LED_PIN), NUM_LEDS)
 +
 +# -------------------------------
 +# Helper Functions
 +# -------------------------------
 +
 +def clear():
 +    """Turn all LEDs off."""
 +    for i in range(NUM_LEDS):
 +        np[i] = (0, 0, 0)
 +    np.write()
 +
 +def chase_bounce(color, delay=0.1):
 +    """Move one LED up and down the strip."""
 +    # Forward direction
 +    for i in range(NUM_LEDS):
 +        clear()
 +        np[i] = color
 +        np.write()
 +        time.sleep(delay)
 +
 +    # Backward direction
 +    for i in range(NUM_LEDS - 2, 0, -1):
 +        clear()
 +        np[i] = color
 +        np.write()
 +        time.sleep(delay)
 +
 +# -------------------------------
 +# Main Program
 +# -------------------------------
 +
 +while True:
 +
 +    # Chase effect
 +    chase_bounce((255, 0, 0), 0.08)
 +</code>
 +
 +So, what does this extra code do? and how?
 +\\ 
 +\\
 +Here is an explanation of the reverse code block in general.
 +
 +<code:python | download>
 +# Backward direction (move the lit LED from right to left)
 +# range(NUM_LEDS - 2, 0, -1) generates:
 +# For 12 LEDs → 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
 +# - Start at LED 10 (second-to-last)
 +# - Stop at LED 1 (LED 0 is skipped to avoid repeating the end LED)
 +# - Step backwards by -1 each time
 +for i in range(NUM_LEDS - 2, 0, -1):
 +
 +    clear()              # Turn all LEDs off before lighting the next one
 +
 +    np[i] = color        # Light the current LED at position i
 +
 +    np.write()           # Send the updated LED data to the strip
 +
 +    time.sleep(delay)    # Pause so the movement is visible
 +</code>
 +
 +And this is what the line that makes the count to backwards actually does.
 +
 +<code:python | download>
 +range(NUM_LEDS - 2, 0, -1)
 +#Breakdown for NUM_LEDS = 12:
 +
 +Start: NUM_LEDS - 2 → 10
 +#(LED 11 was already lit in the forward chase)
 +
 +Stop: 0 
 +#(but Python stops before 0, so last value is 1)
 +
 +Step: -1
 +#(count backwards)
 +</code>
 +
 +For the reverse sequence, we don't need to worry about the first (0) or last (11) LEDs as these are already set by the forward sequence.
 +\\ 
 +\\ 
 +That's it! Oh, and don't worry, I won't be fitting these to my car :)
 +\\ 
 +\\ 
 ---- ----
12_neopixel_led_strip.1785608484.txt.gz · Last modified: by walkeradmin