Turning on/off parking sensor automatically with Raspberry Pi Pico

Hello All,

I have created a parking sensor that will be attached to the wall of my garage. It uses a Raspberry Pi Pico to control everything, a GlowBit rainbow to give visual feedback, and a PiicoDev VL53L1X distance sensor.

I am trying to write some code to make it turn off the GlowBit when it is no longer needed (once the car has parked) and turn back on when a car starts driving into the garage. I am trying to do this just by code to avoid using a micro switch to check whether the roller door is up or down. I was thinking of taking 2 distance measurements and then checking to see if they are within a couple of mm to turn the GlowBit off and a similar system to turn it back on. Any help with how it would be possible to do so with code would be greatly appreciated.

The end result of the code would just manipulate x, x = 1 when the GlowBit should be on and x = 0 when the Glowbit should be off.

Thanks in advance!

4 Likes

Hey Jaden,

Sounds awesome, also you juust missed DIYODE’s GlowBit giveaway.

Setting the whole strip to BLACK (0,0,0) would turn all of the LED’s off but the control chips (WS2812b-v5) will still use a small amount of current - I had a look and its around 1mA per LED.

Do you have some code or another way to visualize the logic of your project? I find a flowchart helpful then translating the code across.

Some guides to get started

How to use WS2812B RGB LEDs with Raspberry Pi Pico
How to Setup and Code on a Raspberry Pi Pico Using Thonny
PiicoDev Distance Sensor VL53L1X - Raspberry Pi Pico Guide

Liam.

2 Likes

Hello Liam,

Thanks for your reply. I have got the Glowbit code sorted. Here is the code if that helps.
Alternatively I could just make the Glowbit turn on and off in a certain distance range but I would rather take 2 distance readings about a minute apart and see if they have changed. Is there an easy way of doing this? As you can see from the code, all I have to do is change the value of stat, to turn on and off the Glowbit. Thanks.

import array, time
from time import sleep
import rp2
from PiicoDev_VL53L1X import PiicoDev_VL53L1X
from time import sleep
distSensor = PiicoDev_VL53L1X() 

BLACK = (0, 0, 0)
RED = (255, 0, 0)
YELLOW = (255, 150, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

COLORS = (BLACK, RED, YELLOW, GREEN, BLUE)

NUM_LEDS = 13
PIN_NUM = 22
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()

 

sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(PIN_NUM))

 

 

sm.active(1)

 

ar = array.array("I", [0 for _ in range(NUM_LEDS)])

 

def pixels_show():

    dimmer_ar = array.array("I", [0 for _ in range(NUM_LEDS)])
    for i,c in enumerate(ar):

        r = int(((c >> 8) & 0xFF) * brightness)

        g = int(((c >> 16) & 0xFF) * brightness)

        b = int((c & 0xFF) * brightness)

        dimmer_ar[i] = (g<<16) + (r<<8) + b

    sm.put(dimmer_ar, 8)

    time.sleep_ms(10)

 

def pixels_set(i, color):
    ar[i] = (color[1]<<16) + (color[0]<<8) + color[2] 

def pixels_fill(color):
    for i in range(len(ar)):
        pixels_set(i, color)

       

def convert(x, i_m, i_M, o_m, o_M):
    return max(min(o_M, (x - i_m) * (o_M - o_m) // (i_M - i_m) + o_m), o_m) 

def display():

    dist = int(str(distSensor.read()))
    nol = convert(dist, 500, 2000, 1, 13)

    for i in range(0, 13):
        if i < nol:
            pixels_set(i, BLUE)    
        else:
            pixels_set(i, BLACK)

          
    if dist <= 500:
        pixels_fill(GREEN)

    if dist <= 400:
        pixels_fill(YELLOW)
   
    if dist <= 300:
        pixels_fill(RED)           

    pixels_show()
 
    sleep(0.05)


stat = 1

while True:

    if stat:
        display()
    else:
        pixels_fill(BLACK)
        pixels_show() 
2 Likes

Hello Liam,

Sorry for starting a useless topic. :roll_eyes:
I have just realized that what I suggested about turning it on and off in a certain distance range would be just as good as the other option. Thanks for your support anyway.

2 Likes

Hey Jaden,

There is never a useless topic!! It doesn’t hurt asking for some help sometimes :smiley:
They are both excellent ideas, maybe a combination of the two would be the best, in my opinion using the change in distance will probably save power in the long run.

3 Likes

thanks for the awesome information.

4 Likes

thanks my issue has been fixed.

1 Like