I’ve had RGB light strings running around the house integrated into Home Assistant and stand alone for a few years, but they all ran my own code. That’s good and bad. The good is I can add whatever effects and control I like, the bad is I’m not very good at creating effects so I just use what’s out there. The other bad is how the lights start up and some bugs in my code that are hard to track down. Enter WLED…
Dee, a friend of mine was wanting to do his own holiday lights and told me about WLED, an open source ESP8266 based RGB or RGBW package, that is easy to setup, easy to use, and easy to control effects via an http API. The only down side was initially I didn’t know how to API worked and was kind of stuck with using only the web interface to setup schedules, etc.
However, once I dug into the http API, I could see how I could more easily control the lighting and scheduling from my own methods. In my case, this is via a PHP page that gets called at sunset, but it could easily be a Python script or anything else that can be run to make calls to the API.
The WLED interface is actually quite good allowing color, effects, effect cycling, and favorite setups to be saved. In PC Mode like above, one can get to the core controls, in normal mode one can get to all the menus, including WiFi, LED, syncs, user settings, time, etc.
Once the various locations were installed including the front door, portal window, under the eave run, and a couple inside strands or strings, I moved to getting things setup to allow custom effects, colors, etc for holidays, or just a low key spot light effect for all other times.
I have Home Assistant make a call to my PHP code at sunset every night. This allows lights to come on at the appropriate time each day. Again, this code is in PHP, but Python could be used just as easily. A lot of this could also be done in Home Assistant I’m sure, BUT I liked my freedom to code in PHP or other languages.
First I need to explain the postWLED function. I initially was using the normal PHP get_file_contents() function but having huge delays making the WLED calls. No clue why, but decided to use the curl function instead which solved the problem. Not sure why yet but this works so I’m sticking to it. The function just sets up and calls curl to do the http request. In Python the “requests” library should work fine.
// postWLED uses curl to post to WLED - the get_file_contents() function hangs trying to hit the URL but this fails quickly if a device isn't online
$url = $myValue;
$client = curl_init($url);
$response = curl_exec($client);
echo "<BR><a href=$myValue target=_blank>$myValue</a>";
In the main code, first I pull the month and day so I can check for any applicable holidays. Next I reset all the strands to preset 16 (&PL=16) and turn of any preset cycle settings (&CY=0). This is the default setting for each string or strand.
// Handle WLED settings for holidays as desired
$curMonth = date('m');
$curDay = date('d');
$HolidayMode = false;
// Reset everything to default 16 values
echo "<br>Setting NON Holiday Mode";
Next are the date comparisons to see what effects or colors we’d like to display. Currently this is done via simple day checks. Next we make the calls to the end points to handle the settings as desired. Below this would come on the 13th and 14th of February each year. One could also use the .local domain option to make the calls such as http://front_holiday_lights.local/win instead if you set the nDNS up under the WiFi settings page. I started out using IPs but could change it when desired. The IP assignments are .75 as the portal but it slaves off the front door of .76, .77 is TV back lighting, .78 is main front eaves, and .79 are the living room string.
// Valentines day
if (($curMonth == 2) AND (($curDay == 13) OR ($curDay == 14)))
$HolidayMode = true;
$myText = "New Years WLED Settings Applied";
For Christmas lights, the time period is obviously longer, and the approach slightly different. With the 16 favorite save options, I use #16 as the default, but have dedicated #12-#15 for Christmas effects that then get cycled through by turning on the preset cycle option (&CY=1). Below is the Christmas light time period. Note the front door (.76) has a shorter cycle. It also has a different effect cycle in the 12-15 favorites. The TV goes to a standard red one side, green the other side to avoid annoying effects behind the TV, and the inside and outside run a 12-15 cycle that are unique to their own settings. Below the Christmas lights run from 11/25 through 12/27.
// Christmas lights starting around Thanksgiving
if (($curMonth == 11) AND ($curDay > 25) OR (($curMonth ==12) AND ($curDay < 27)))
echo "<br>Setting Christmas Mode!";
$HolidayMode = true;
The $HolidayMode variable isn’t used yet, but can be used after the date checks to do some other functions if the lights are in holiday mode, such as turn off the porch light to allow better holiday light viewing.
I have a similar setup running on the front door and the “portal” window on the front of the house, but have wanted a permanent “holiday light” install for some time. Recently my friend Dee has been wanting to do the same, so I was once again interested in carrying this project through, in time for Christmas 2020 hopefully. These aren’t “put them up and take them down” lights, as I want to be able to use them year round like others do and light up the house for special dates such as Independence Day, Valentines, Veterans day, etc. Additionally as Dee pointed out, they can be lit up on low white or amber brightness every so many LEDs for a normal outside lighting feature.
The setup is rather simple. WS8312B LED strings driven by a D1 Mini with WLED running on it. I really like to use my own code, and I do have my own code running on our Christmas tree and our grand daughters little house, but WLED is more robust, recovers better, and can stand alone without my Home Assistant home automation system if needed. Dee had found WLED and told me about it and once I tried it I was convinced it was the easiest and best way to go.
WLED is installed and all the parts are now in hand. I estimated I needed at least 20.62 meters of strips for this. Unfortunately the strips come in 5 meter lengths so I’m about .62 meters short that I’ll have to either buy another strip, or find some left overs I have from other projects. Time will tell on that one.
Not the prettiest of plans but it helped to visualize the various breaks I have to make and extensions needed to get across the front of the house. There are larger dormers for each window and the front door that have to be bypassed to get a better across the front look. I am hoping this doesn’t break up the effects too much but that’s how it is.
Originally I had looked at using the bulb type of RGB lights, but they just had that “Christmas lights up year round” feel to them so I moved to the strips. These will be mounted up under the eaves, facing towards the house for more of an under glow appearance. Hopefully it will look like I want it to. The down side is these are hard to find in any affordable 12v versions, so I reverted back to 5v versions. With 5 volts there is more likelihood of voltage drops across the length, so there may have to be more power injection points. I’m going to try to do just the ends, if that doesn’t work and there are obvious brightness issues in the middle, I’ll insert another power point in the middle.
Included with the LED strips are a handful of mounts to use to hang the strips, but they are too few and will not work in the location I want to put them so I designed and 3D printed some to make the mounting hopefully easier and better. I also plan on putting the power packs under the eaves instead of trying to run long power runs so I needed to be able to mount them. I will have to water proof them but they should seal up with some effort. The strip mounts are on the left, the power pack mount on the right in the picture above.
These are already setup and tested so the next steps are designed a 3D printable housing for the D1 Mini to go under the eaves and get out and start mounting the strips with some help. Updates with install pictures and results eventually… hopefully before Christmas!
I picked up the super common, super cheap Harbor Freight sand blasting cabinet to replace the really small one I had recently. I had already found a lot of videos on how to improve the product with some making lots of sense and some completely off the wall and costing more than the original product.
Primarily I knew I wanted to 1) Added a metering valve suction feed instead of the pipe that I always had problems with in the small one, 2) Move my small shop vac dust collector setup over to help keep it clear inside, and 3) add some type of dust separator to avoid filling up filters or bags too quickly.
After looking at the options for metering valves online, they seemed really simple. However, searches on ThingiVerse and around the net really didn’t result in any 3D printable solutions that I liked. So I fired up TinkerCAD and played with some options.
My first clunky design likely would have worked BUT I wanted it to look a bit better and have a better tapered feed to the output so I started from scratch, found a pipe and threaded cap that seemed to fit the bill and added the features I thought were needed to make a valve work.
The final design looks better and likely will work better in the long run. No telling, the plastic may get ate up from the aggregate flowing through it all the time but the cool thing is I’ll just print another one when/if that occurs.
The shop vac exhaust was the next step and just required a couple of 90 degree adapters to mount to the exhaust port and then to the dust separator. This seems to be working fine so far but obviously time will tell.
(Pronounced Nan OM
eter – Like speedometer of course)
kludged together a breadboard, or dead bug wired something to simply
test an SR04, measure a resistance, or test a servo or stepper
driver, I finally decided I’d do something a little more permanent.
What trigger this was seeing VolsR’s
little Nano based “semi” multi-meter solution on
His circuit info
wasn’t completely accurate and he has since developed a more
advanced printed circuit board version, but there was enough to get
me started on putting a little multi function meter / tester
together. I followed his basic concept and used his code as the core
as it worked well, and then added a few more functions I needed or
wanted. I even used his basic layout of his original board as it just
At this point the little box can:
Measure DC voltage (with reverse voltage diode protection)
Read an analog input and show the value, as well as the min, max and average values
Measure the resistance of a resistor
Measure the voltage drop of a diode or LED (and test the LED there too)
Act as a beeping / LED continuity tester
Generate a PWM output
Test a servo
Test a ping / SR04 sensor
Drive a stepper motor driver\
Monitor the external battery supply voltage on the Vin pin
Allow adjustments to the data dump timer (more later)
Do an I2C bus scan and show attached device addresses.
device is outputting data for the current mode to the serial port
(USB or TTL) that can be used to log sensor data over time. It can
also be minimally controlled over the serial port with mode toggle or
selection, PWM width change, servo pulse changes, and logging time
period changes. The data is dumped in a CSV format with the mode
name, millis(), data1, data2, data3, data4 format. Using the millis()
value one could time chart the data if desired. You could also use a
wireless serial bridge such as a 2.4G or Bluetooth version and log
that data back remotely as well I guess.
The I2C bus is
exposed next to the display but at this point the Nano is at 99% of
memory used on my compiler (30624 or 30720 bytes), so there is not
much room for growth. Your compiler mileage may vary. I’m
compiling under Arduino 1.8.7 on Ubuntu 18.04 with the Adafruit 1.0.0
SoftServo library and the 1.1.3 Stepper library. You can comment the
“useFonts” #ifdef to remove the font usage and use the normal
text scaling instead. It does save quite a bit of space.
libraries, along with the fonts, eat up a lot of memory on the
device. The images do not make any difference so removing them
doesn’t help a lot. One could remove the fonts and have more
programming space if desired I think. Only 69% of the dynamic memory
is being used so I do not believe there will be any stability issues.
Obviously the code could be optimized but I’m pretty done with it
at this point. In reality only the A3 and A6 pins are left to be used
so there isn’t much left to work with there either. My code is not
pretty nor optimized but it works so I’ll leave it at that.
Current pin uses are:
(P) = PWM Pin
// 0 – Rx – On header pin lower right – Used to receive commands from serial console, etc // 1 – Tx – On header pin lower right – Dumps CSV data to here // 2 – Left Button // 3(P)- Middle Button (on interrupt) // 4 – Right Button // 5(P)- Software Servo Pin // 6(P)- PWM output on three pin header // 7 – Ping Trigger // 8 – Ping Echo // 9(P)- Stepper IN1 // 10(P)- Stepper IN3 // 11(P)- Stepper IN2 // 12 – Stepper IN4 // 13 – Used for speaker output and LED display // A0 – Main Analog Input // A1 – External Battery Power Supply Voltage 100k/10k divider // A2 – Input for Diode and Resistor testing // A3 – SPARE // A4 – I2C bus // A5 – I2C bus // A6 – SPARE // A7 – Voltage Meter input – on 100k/10k divider
I used Adafruit’s
SoftServo library as the normal servo library kills some PWM pins and
I wasn’t sure if they would be needed. It works well for this use
and I’ve used it on other robots as well. The AdaFruit OLED library
is used for the SSD1306 device which is the 128 x 32 pixel version.
VolsR’s updated version uses the larger 128×64 version but
personally I would rather have the board space than more display
space for this project.
To add the images I
“temporarily borrowed” some icon art from online (I’ll give
them back when I’m done) and converted them to the HEX format
needed using the handy image2cpp online at at
Works great and good enough results for me.
I haven’t drawn a
full schematic up but each test point is pretty simply. Using the
above pin outs one should be able to replicate it. The voltage
dividers on the volt meter and external battery are simple 100K / 10K
voltage dividers. The buttons simply go from the pins to ground and
we use the internal pull up resistors on the Nano. I did not use any
pull up resistors on the I2C display and it works fine. The tiny
speaker connects directly to pin13 and to ground. It does show a
positive terminal so I connected it like that. The dropping resistor
for the diode / led is a 2.2K in mine, just tweak the code as needed.
With only three
input buttons there are limits BUT in reality you can get six (6)
options out of them at least. The middle button is hooked to an
interrupt that toggles the “mode” for the box. The left (down)
and right (up) buttons selection options within the modes if there
are any, i.e. in PWM they change the pulse widths, etc.
Simultaneously pressing the Up and Down toggle the “Pot Mode”
allowing a pot to be connected to the analog input to control the
PWM, Servo and data dump timer modes. Just makes it easier to test
things. Pressing the down and select toggles the beeping sounds on
and off, including the continuity mode. In analog reading mode the
down button resets the averages.
The Down Sides
There are obviously
some down sides to the little box. For one the voltage measurements
aren’t the most accurate. I’m not sure if it’s the voltage drop
on little 1N914 diode I’m using for reverse protection or something
else. I do have an adjustment in the code to offset the diode and
it’s accurate at lower voltages but off at higher voltages. I know
voltage drop can vary by voltage but wasn’t aware it was that much.
So far the little
NanOMeter has been pretty handy. I’ve built a couple probe wires
out of header jumper wires to more easily use the volt meter and
continuity tester piece. Also built a header adapter for the analog
input and resister/diode/continuity connectors from male headers that
can be inserted to flip the gender of the connectors without surgery.
I also added an additional header that provides power and ground
directly from the battery (7.4v old Canon camera battery) that I can
use to power bigger voltage / current requirements without leaning on
the Nano’s regulator too much. Great for driving stepper motor
controllers and could be used to drive H bridge motor drivers as
So if you need a
simple voltmeter/analog tester/ohm meter/diode drop/continuity
tester/PWM tester/Sevro tester/SR04 tester/stepper tester/data
logger/I2C bus scanner, this could be useful.
The NanOMeter now
has a prominent place on my bench and is quite handy when I need to
check an address on an I2C device, validate a resistor value, test an
analog based sensor etc.
After a long time of cleaning part, buying parts, prepping parts, and testing parts the 1966 Galaxie 500 is back on the ground with an update 3.55 9″ posi unit and a clean and undercoated bottom. More details in the link.
On 08/11/2019 I watched the famous (infamous?) Frenck (http://www.youtube.com/frenck) live stream his work on a SDS011 Particulate Matter Sensor. I had already noticed the sensor in the ESPHome support list but Frenck was taking a different approach. He was live streaming getting the device working for the Luftdaten.info project of tracking air quality. Read More Here
Pretty much sums up my life and I have no apologies about it. I’ve enjoyed many different hobbies, have become good enough at most, and hope to keep on keeping on for some more years or decades before I’m done.
Here you’ll find information from 1/24 scale plastic models to full scale cars being built. From old bicycles to old bicycles with 1 kilo watt of electric power. From simple electronics to a smart home that has been “Online since 1999” – long before many were thinking of ‘connected’ homes.
I have built many little robots, big RC mowers, have a couple Trail 70’s being restored or rebuilt. I have a smart home that knows when I’m here, can listen in different apps and handle things when where are not here.
I have way too many 3D printers that have all been built, designed, or modified by myself, and even some old time stop motion animated “brickfilms” for you to enjoy.
Poke around – you’ll find many different directions, unfinished projects, and a mess of other ideas floating around here.