LED NeoPixel Motion Sensor Stair Lighting

98,924

274

162

Introduction: LED NeoPixel Motion Sensor Stair Lighting

Hello Everyone!

This is my first Instructable so please bare with me. Any comments and suggestions will be greatly appreciated! I wanted to share my project in the hopes it can simplify your research, planning, design and execution. Like with any project, it's always a good idea to research anything and everything about the subject matter in order to grasp the different technologies available and challenges you might face. There are many solutions to each idea, and some work better or worse depending on your skill and knowledge level. I hope I can share in this instructable something that's helpful to you, and wish you luck on your build!

If you are reading this, you are probably planning on adding some "flair" to your staircase. I was in your shoes and it may be overwhelming with the different options people use to add lights to stairs. My design uses an Arduino micro-controller, motion sensors, which serve as the brains of the build, WS2812B LED strips to light up the stairs and a 5V 60A switching power supply to provide the juice for the system.

There are different types of micro-controllers that can be used, Raspberry Pi or Arduino to name the two most common. I decided to go with Arduino since it already has the Neopixel library, which makes coding significantly easier. Coding level/experience should be considered in this step. Arduino is very easy to pick up since it is just a modified version of C and there is a huge community available to assist you with any coding questions or issues you may run into. There is a lot of support from the Adafruit community as well. Throughout this instructable I will post links to websites that may be helpful during this build. There are many different lighting options that can be used, for example, an LED light strip, LED lights, Neopixels (which is just fancy for WS2812B LEDS) and many others. I decided to go with WS2812B LED strips because I wanted the flexibility of controlling each individual pixel. This makes the design more versatile in the long run. I planned on making various sequences for different holidays and using WS2812B I can make any LED any color I want, which I thought is pretty cool! So the first step is to decide which type of lighting solution to use and exactly what you want your stair lights to do!

The power supply was sized according to a few simple calculations required by the load of the LED pixels. It is always a good idea to slightly oversize your components and use the worst case scenario in your calculations, to ensure that you don't starve or over stress components - which could lead to failures and premature wear of your electronic components. In addition, incorrect component sizing can lead to excessive heat, which can melt wires and cause a fire. Don't be afraid to ask questions before implementation if you are unsure of anything at all. Improper design can result in injury and/or waste of resources. In the end, a DIY solution is ultimately a way to have cool and unique things without having to pay a fortune for it, but it's got to be done right and safely.

*CAUTION: There is always a risk of personal injury and equipment damage when handling and dealing with electronics. You are expected to follow all usage instructions for tools and equipment required for this build. I am not responsible or liable for any injury or damage as a result of following this instructable. Please proceed at your own risk. Never work with live wires. Always remember to disconnect power from the source when connecting/soldering wires. (Remember: just because a power supply is turned off that it can still malfunction and run current through the wires, which can kill you!) Good Luck!

This sums up the overall idea of the project and covers some of the major components used in this build. I will try my best to outline the design and build process step by step and with as much detail possible. However, I'm sure I might miss something - and that's what the comments section is for. If you find this instructable useful, please share, rate and/or comment. I will greatly appreciate the support and will do my best to answer questions you may have, if I have the answer. If not, others on this website, more knowledgeable than me, are welcome to assist as well.

This is a video of ,my build in action!

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Materials

Below are a few expectations and goals I set going into this project, which also factored into my parts selection:

  1. Low budget
  2. Impressive yet functional final product
  3. Power efficient
  4. Minimal modification to stairs (to protect structural integrity of the staircase)

Below is a list of the major parts used in this project. They are fairly inexpensive and, with a simple google search and some shopping around, you can find them without investing a fortune. If you're a frequent DIYer you may have some of these components laying around.

  1. 1x Arduino Uno (e-bay)
  2. 2x PIR motion sensors (e-bay)
  3. 10M of WS2812B LED Light strip (length depends on how you want to space it out. Every staircase is different!) (e-bay)
  4. 5V 60A Switching power supply (e-bay)
  5. 100ft of 18AWG data wire (green) (e-bay)
  6. 100ft of 18AWG power wire (red, black) (e-bay)
  7. Extension cable or a standard power cord for a computer (old parts)
  8. Soldering iron + solder wire, etc. (previously bought)
  9. Shrink wrap (e-bay)
  10. Mounting tape (big box store)
  11. Clear silicone (big box store)

I may be missing a few materials but it's things like jumper wires for testing, electrical tape, etc.

Hint: E-bay has a great selection of electronic parts and most of the parts for this build were ordered from e-bay. Some argue that e-bay sells junk stuff and china stuff is garbage. But the truth of it is, it depends on what you are looking for. All this stuff is made in China anyway and shipped to the US and marked up like crazy. So if you have the time to wait for shipping (usually 2-3 weeks), I would highly suggest going that route to save you a decent amount of money!

Step 2: Design and Testing

I started designing my build by determining the number of pixels I wanted and how I wanted it to look. I had some standard LED RGB strips laying around so I experimented with those and determined I wanted 35 pixels on each step. Testing showed me the amount of light dispersion I liked. The number of pixels will be different for each setup. The width of my stairs is a little shy of the standard 3'.

Once I determined the number of pixels, I ordered the light strips. This was by far the most expensive part of the entire build. WS2812B is a fairly new technology; if you wish, you can go with the cheaper alternative of one-color LED strip or an RGB strip. However, with a simple RGB strip, the entire strip will be of the same color. Also, if you use a different strip, your code will need to be modified and will not work with my code. In addition to the color options, using a WS2812B LED strip had the benefit of having only 1 output on the arduino.

Originally, I planned to use the regular strips, which would have required me to use 16 outputs on the arduino (1 for each step) since I wanted the lights to light up step by step up or down depending on which motion sensor was tripped. However, on the arduino UNO, there are only 6 PWM outputs and the arduino MEGA has only 14 PWM outputs. So this was one of the major limiting factors of why I chose the WS2812B LED strips instead of the traditional RGB light strip. The other limiting factor was if I wanted to utilize all 3 colors on each of the 16 strips, that would mean 16*3 = 48 channels/outputs would be needed. Keep this in mind while designing your build. There are other controllers available which support this many channels, but in the end, it would cost more than just going with the WS2812B LED strip.

Learning NeoPixel

You should have done all the research about WS2812B LEDs if you intend to use them. But while you wait for your parts to ship, it's a good idea to touch up on using these LED strips. I will use NeoPixel interchangeably with WS2812B LEDs since they are the same thing.

Since I've never used WS2812B LEDs before, I needed to get familiar with the NeoPixel library. You will need to download the library for Adafruit and import it into the Arduino coding software. Below are two useful links to get you started with using NeoPixels. (I will assume you are somewhat familiar with Arduino and know how to import libraries and make sketches. If not, please reference other instructables or youtube videos on this process).

NeoPixel Library

Learn about NeoPixel Library

The above links contain very thorough description of how to use, code and power NeoPixels. They also include a test sequences, which I initially used to test the strand of LED to ensure there are no bad pixels. This is highly recommended so you can exchange the product if there are some bad pixels. Or you can simply cut them out and re-solder to required length.

There are also numerous projects people have done with NeoPixels in the past which are interesting to reference.

Attached program, named "test2," is a test program that just runs through same different loops. I used it to learn the different capabilities of the LED strip and familiarize myself with some of the coding. I believe this program was downloaded from the Adafruit website. I do not take credit for the code.

Once I was familiar with how NeoPixels worked, I found an instructable that was very helpful and similar to a build I was planning. I will link his instructable because I think it is also a good reference to use while you plan your build. The author goes a bit more in-depth, and I would like to thank him for taking the time to post it. I found it very helpful, and was able to adapt his code.

I assume you have some knowledge of arduinos and wiring so to keep this shorter, I skip some of the obvious details. Also, as I mentioned before, each build is unique so it's not as straightforward as just copying this instructable. It also depends on what type of parts you use, so I expect you do some research into what components you are using.

Instructable Link. His name is Simon Jowett.

Small Scale Testing

Okay, let's get to small scale bench testing. Once I received the light strips, I cut them into 35 pixel lengths. Another benefit of WS2812B LED light strips is that they can be cut every pixel and still function properly instead of every 3 LEDs with the traditional LED strips. I used one of the 35 pixel lengths to test some different kinds of effects and scaled down the entire design to utilize only 35 pixels. So in theory, I had 6 stairs with 5 pixels on each step.

So I wanted the individual strips of light on each step to light up in the order tin which he motion detector is tripped. Review the schematic attached in this step to see the set-up of the overall build. I'm using two PIR sensors that detect if the person is walking up or down the stairs. An LDR is a Light-Dependent Resistor, also known as a photoresistor. This resistor changes values based on how much light is exposed over the resistor. Currently, the sensor is not attached, but I plan on adding it soon to save on operation cost. Currently, the setup is working 24/7. (Side-note: I've made some basic calculations and while it works 24/7 it costs around $11 annually). You can learn more about how to add an LDR to the arduino using other instructables or follow this example. In short, you connect the LDR to an analog port on the arduino so you can use "analogRead()" command in your code to see the value of the resistor.

I'll briefly explain why I chose the loop back method when connecting the lights instead of just daisy chaining them. (you might understand better when you see the code further in this report and I will also elaborate on this topic) Daisy chaining the LEDs will result in a ZIG-ZAG LED matrix.

So if I want to run a basic for loop to power up all the LEDs from start to finish, the code will look something like this:

for(uint16_t n = 0; n < strip.numPixels(); n++)

{

strip.setPixelColor(n , strip.Color(255,255,255));

}

So this code basically sets the color of each LED starting at LED 0 to the color full brightness white (255,255,255) and it continues doing this while increasing the counter until it reaches the last LED (n < strip.numPixels() ).

Note, to apply this code in the daisy chain situation, the LED strip will first light up from right to left, then at then next step left to right and so on until it reaches the last LED. So if you can picture this in your head, it will not light up the LEDs starting from the same side on each step. The LEDs light up in a Zig-Zag motion. This is why I highly recommend using a little extra wire to wire up the strips according to my diagram. This will simplify coding significantly!

Step 3: The Code

I used and modified the code written by Simon Jowett.

There are some functions in the code that are not used, but I left them in case I would like to use them later. When I have more time, I will be adding to this code to run different light sequences for different holidays. Ultimately, I would like to write an app so I could change the sequence from my phone without having to upload new code every time I want to run a different sequence. This is why it is important to think of the flexibility in the design phase so you can be prepared for whatever you want to do without having to rebuild and change your LED strips.

If you have any questions about the code, feel free to leave a comment below and I will do my best to answer since I didn't do the best job at commenting it.

Step 4: The Build

The build will be unique with every staircase. I had to remove the drywall covering the underside of the stairs to route the wires. I drilled a small hole on either side of the staircase on each stair. This allowed me to route the power and data cables so they are hidden. While wiring, be sure to test each stair and your progress to limit the amount of debugging/troubleshooting if a problem is identified after completion. I used heat shrink on all the strips to give it a clean and professional look. Reference the previous step for the wiring diagram to see how I wired each strip. There are a total of 15 strips and each strip has 35 LEDs.

Suggestions:

  1. Plan out your build before you start to drill anything!!! This includes wiring/mounting, etc.
  2. Test each strip as you go.
  3. Practice soldering.
  4. You may pre-solder wires on each strip. (I just cut and soldered wires as I went up the stairs.)
  5. Secure wires so they are not pinched or cut when installing the drywall. (regardless of the stairs, clean wiring will be helpful in debugging later on).

As mentioned, each build will be different so it's up to you how you want to proceed. I included pictures of my build in this step.

Watch the build video below:

Step 5: Final Solution

Once I mounted all the strips, I tested the lights to make sure they all work. I will attach molding in front of the LED strips to completely hide them. I decided to wait on this step to make sure everything is functioning before I attach the molding.

Make sure you fully test the final project before covering everything in case there are problems and you need to troubleshoot the circuit and or connections.

Below is a video of the almost fully completed and function LED lighting. Notice the "breathe" standby mode and then the light turning on when the bottom sensor was tripped.

Step 6: Lessons Learned and Future Improvements

  1. Mounting tape is not the best mounting solution for the LED strips. Over time, some strips began to sag. I will be re-securing the strips with liquid nail or other heavy duty epoxy/glue.
  2. I need to add extra power injection into the circuit. Current power solution does not allow me to use full brightness. Although, I am quite happy with the current setting because at full brightness it's hard on the eyes. However, I do not want to be limited later on if I want to write code using full brightness for the holidays.
  3. Need to find better mounting solution for the PIR sensors because the range is too wide.
  4. I would like to add wifi so I can upload code without having to connect a USB. Eventually, I would like to add website functionality so I could select different codes (Christmas colors, fourth of July, etc.)

These are just the major improvements that come to mind, I may add more later.

I would greatly appreciate if you can leave a comment on how well/poorly this instructable is written and what would have been more helpful to know. Any feedback will be helpful in writing further instructables. Also, if you've done a similar build and would like to share it, I would enjoy reading about it! I will be starting a new instructable on a 32 channel christmas light controller I built from scratch for the holidays.

I hope you enjoyed reading this instructable! Good luck on your LED stair lighting. You'll see, once you do it at home, you will never want to use a staircase without LED lights!

Useful links and resources:

Arduino adafruit NeoPixel Overview (Read the "Best Practices" and "Powering NeoPixels" tab)

Jowett "how to bling up a boring staircase" instructable

PIR Sensors How To

Make It Glow! Contest

Participated in the
Make It Glow! Contest

3 People Made This Project!

Recommendations

  • Backyard Contest

    Backyard Contest
  • Silly Hats Speed Challenge

    Silly Hats Speed Challenge
  • Finish It Already Speed Challenge

    Finish It Already Speed Challenge

162 Discussions

1
zoyzat
zoyzat

Question 6 weeks ago

Hi, I have a staircase that has varying widths of the steps from 90 cm to 140 cm. is it possible to build each step as a segment in the code? could you help me with it?

0
ionut.musat.ionut
ionut.musat.ionut

Answer 1 day ago

Hello,
It is possible. First you should work with arrays.

#define LED_COUNT ... your total led number
int startl[] = {1, 40, 79, 118, 157, 202, 247, 286, 325, 364, 409, 454, 493}; //first led of each stair
int sizepix[] = {38, 38, 38, 38, 44, 44, 38, 38, 38, 44, 44, 38, 38}; // total led number of each stair

...

// Fade light each step strip
void colourWipeUp(uint32_t c, uint16_t wait) {
for (uint16_t j = 13; j >= 1; j--) { // Repeat 13 times..
//Serial.println(j);
for (uint16_t i = startl[j - 1] + sizepix[j - 1] ; i >= startl[j - 1] ; i--) {
strip.setPixelColor(i - 1, c);
//Serial.println(i - 1);
}
strip.show();
delay(wait);
}
//When you count down , never use 0 at low value. So i count from 13 to 1. Where 13 is my total stairs number.
}

// Fade light each step strip
void colourWipeDown(uint32_t c, uint16_t wait) {
for (uint16_t j = 0; j <= 12; j++) { // Repeat 13 times..
for (uint16_t i = startl[j]; i <= startl[j] + sizepix[j]; i++) {
strip.setPixelColor(i - 1, c);
//Serial.println(i - 1);
}
strip.show();
delay(wait);
}
}

0
cessquill
cessquill

Answer 8 days ago

Hi - I'm currently starting this as a lockdown project. Whilst I wait for parts, I've tweaked the code to accept any number of different-sized steps. Essentially, at the top of the script you enter an array for the number of LEDs on each step. On setup, the Arduino calculates the first and last LEDs of each step (handy for breathing) and when a PIR is triggered loops through the array either forwards or backwards and turns on all LEDs on each step in turn.

I've only mocked it up on a webpage in JavaScript so far based on the code above as a proof of concept, but once the LEDs arrive I'll rewrite for my trusty Arduino. If it works, I'll put it on here. Unless you've found a solution, obviously.

0
cessquill
cessquill

7 days ago

Really interesting, thank you. I'll be doing this as a lockdown project. However, six of my steps are different sizes, so I'll likely be adapting the code to handle an array of individual steps.

I don't know whether these functions were available when originally building this, but going through the libraries, there are potentially some more efficient ways of doing things...

- When lighting a step, if you have the starting LED and number of LEDs on that step (which is in the code), you can use the fill function ( strip.fill(color, first, count); ). That way, you don't have to go through a for loop to set each LED individually - the fill function will do that for you.
- If all of your stairs are the same size you could potentially add the NeoMatrix library (https://learn.adafruit.com/adafruit-neopixel-uberguide/neomatrix-library) (also requires GFX library). This has several advantages: you now refer to LEDs as X,Y. If you think of your staircase as a grid - X is the LED position on a step (0-34 in this guide), and Y is the step number. Secondly, you can wire your lights in a zig-zag fashion if you want (meaning every alternate strip faces the opposite direction and you don't have to route the data cable back across the step each time - the library knows this on setup and flips it for you automatically (you can power the LED strip from either end but the data must follow the direction of travel). Finally, the GFX library allows you to draw shapes. In this build, you could light a step by drawing a line across a row (something like "0,12,34,12,color" would draw a line from LED 0 to LED 34 on row 12 - lighting step 12). For the breathing animation, you could draw a vertical line up each side (eg "0,0,0,12, color" and "34,0,34,12, color" would draw lines up row 0 and row 34 from step 0 to step 12). You don't need to loop through or hard-code specific LED numbers.

On the downside, it is a little more complicated to use the matrix and gfx libraries, but you could do much more with it (fancy animations). One could argue that it's overkill, but if it makes it easier to write for, play ball!. Finally, if you're low on RAM this could make it worse.

The more I read about the NeoMatrix library, the more I'm considering making each step LED strip the same size and using it. Whilst the regular code is perfectly fine, it'll be much cleaner with the extra library.

0
caseythehun
caseythehun

16 days ago

Regarding the circuit diagram of the LDR modification, is there an actual 230ohm resistor added or is the resistance of the LDR 230omhs? I've been having trouble finding 230ohm through hole resistors. Maybe you combined resistors to get the 230ohm value? Thanks!

p.s.: Does this circuit run on TinkerCAD?

0
angelo093502417
angelo093502417

Question 5 weeks ago

Its really necessary to add the 500 and 230 ohm and ldr?what time of ldr if I have to put?

0
ks210
ks210

Question 2 months ago on Step 5

Hello, great project of yours.
I tried to readjust your staircase light but unfortunately it doesn't work My LEDs are permanently on and show no reaction otherwise.
The test sketch, however, works flawlessly. what can i have done wrong?
I would find it a shame if I could not finish my stairs.
Could you help me ?

0
snikogos
snikogos

Answer 2 months ago

Hey KS, try inverting the state of the PIR sensor. You can either do this in the code or by swapping the +/- on the PIR sensor. Hope that helps.
If that doesnt work, I'd recommend opening serial prompt to get information on the state of the sensors and what's triggering it to stay on. Good luck!

0
zaggash
zaggash

2 months ago

Just a FYI.
Here is my POC implementation of the project with FastLED and two stairs.
Maybe it may help someone in the process.

For the moment it is configured to work for a POC with a 36 leds strip.
Each stairs take half of the strip.
3 steps per stair with 6 led each.

Each stairs have 2 switches for the POC to replace with PIR

No LDR in the code yet.

https://github.com/zaggash/Fastled_StairsLight

0
PNG Dave
PNG Dave

Question 3 months ago

First of all I would like to say thank you for posting this build and how to do step by step for people like me that really has or had knowledge of Arduinos. thanks you for this.
I completed my build and it looks amazing I changed it up a bit as I have 15 stairs , the top stair 71 led , 2nd stair 70 led and the rest has 61,
1] the blue led lights off to the side that are fading in and out works good but the last 4 stairs sometimes turn green , where do I fix this in the code.
2] I have spent many hours trying to get the ldr to work but I am not having any luck, have the ground of the ldr going to the A0 and then split off to a 500 ohm going to the ground on the Arduino. the positive side of ldr is going to 5v of the Arduino I have read all you do is change the value of the ldr in code from 0 to ? I tried 400 to 1000 but still nothing works.
am I missing something in code that needs to be added, and if so how and where do I put in, as I have been trying to put ldr code into the sketch but not letting me
I am almost completed this project and when I do will send in pics
once again thanks for posting this build..

1
snikogos
snikogos

Answer 2 months ago

1. make sure you check that there is no bringing in your connection. try to replace the section of the strip. maybe something with the pixel.
2. every LDR is a little different. you would need to calibrate it. I suggest added a serial write command to monitor the analog value to the ldr and calibrate the limits that way.
Serial.begin (9600); // only requred for debugging
int sensorValue = analogRead(A0)
Serial.println(sensorValue)

Let me know if that helps you fix the issue. I currently don't have the LDR setup because i want the lights to always trigger.

0
PNG Dave
PNG Dave

Reply 2 months ago

Hi Snikogos, thank you for coming back to me , very much appreciated . I have attached a vid this time , Thank you for the answers , I believe for number one it was a sloppy connection or crimped , had it going good with putting pressure with my hand, will deal with it tomorrow , as I have to empty the whole under the stairs out again lol, that's ok though.
For the LDR will try that and see if I get anywhere with it, and will get back to you on that. also if you see the vid , I know I have more led than on your project , that is why there is aprox 10 led that do not light on the left side , they do just a little slow, where in the code to change, for you add or minus on each stair, as I am thinking my first stair is 71 then 70 then the rest are 61 , think that is why it is off abit.
Thanks for helping me out on this
it is hard to believe that no one in my city knows anything about these fairly new led strips or Arduinos,

0
snikogos
snikogos

Reply 2 months ago

Very nice!

0
drsincere83.
drsincere83.

Question 4 months ago on Step 6

Hello how are you I’m mike I want build this project the only thing I have a problem is I don’t have access in the bottom stairs I only have access to one of the side which I will be cutting the Sheetrock so I can wire the stairs but this is the problem I can’t wire them in zig zag way I can only wire them from one side can you help to see what code I need to write ? My email is drsincere69@yahoo.com

0
snikogos
snikogos

Answer 2 months ago

this shouldn't make a difference if you're lighting the entire strip at each step. you wont see the difference.

1
snikogos
snikogos

Reply 2 months ago

Nice work!

you were great in explaining the project today I took the material and in the next few days I will try to implement it l believe that l will follow you in your projects

0
snikogos
snikogos

Reply 2 months ago

Thank you!

0
heidar.shekarrizian
heidar.shekarrizian

Question 3 months ago on Step 1

Hi
I want to first Thank you for all the effort and sharing knowledge. Deeply appreciate it. Secondly I have question about the code. I have 15 stairs which every one has different amount of led, from 54 to the longest has 75. total count of led would be 879. When I change your code or the other examples I found, none of them accept more than 620! my strips are WS2813. What can I do? Thanks in advance for your urgent help.