RGB LED controller for simulating the full day light cycle run on an RPI
I wanted to create an artificial source of "daylight" for the purpose of subconsciously being aware of what time it is as I toil away at my computer all day. So I picked up an RGB LED strip to stick behind my computer monitors and threw together this project to achieve that.
It works by calculating the position of the sun throughout the day and changing the color and intensity of the RGB lights to try and mimic the light you would see coming from behind a curtain over a window.
It is intended to be run on a Raspberry Pi as an inexpensive controller. The concept is simple enough to run something simpler like an Arduino but I just felt like doing it on a Pi and it was easy to use existing python modules for the sun position calculations. This also leaves the door open for potential future features to add remote control if you use a WiFi equipped model.
The program doesn't install and is just used directly with ./rgb-daylight.py
. It has
the following dependancies
- astral:
sudo pip3 install astral
- pi-blaster: Clone git repo and standard autoconf install
You may need to manually run pi-blaster
after installing it the first time
or just reboot
Once everything is installed you can just download these files and run them:
git clone https://github.com/AkBKukU/rgb-daylight
cd rgb-daylight
./rgb-daylight
After that you can quit it with ctrl+c
and then go through the Setup steps
to configure it for your use.
If you have your pi auto login and want the program to run on boot, add the following
lines to the /home/pi/.bashrc
file:
cd rgb-daylight
./rgb-daylight
If you prefer to create a service instead, move rgb-daylight.service
to /lib/systemd/system
and run the following:
sudo systemctl daemon-reload
sudo systemctl enable rgb-daylight.service
sudo systemctl start rgb-daylight.service
By default, the unit file assumines you cloned the repo to /home/pi/
, if necessary, change the location in the unit file to the path you've cloned the repo to.
You're going to need to build a driver interface of some kind to connect the RPI
to the LEDs. If you are using a typical "5050" +12V,G,R,B LED strip like I
designed this with you can take a look at this
example schematic on what parts to use and how to
connect them. The pins that are used on the RPI aren't significant, any GPIO
will work. You just need to update the pinout in rgb-daylight.py
to match how you put
it together.
After the first time you run rgb-daylight.py
a settings.json
file will be
created with several things in it that you will need to change to match your
build, location, and preferences.
These are the GPIO pin numbers that the LEDs are controlled with. The default values match the schematic but if you made changes you will need to update those to match your build. The allowed pins are limited by pi-blaster so you should look at the documentation for that for info on which ones you can use.
This is the overall brightness of the lights as controlled by the PWM. It takes decimal values between 0 and 1 (exa, 0.75).
RGB lights are rarely "white" when all three elements are on fully on. This will allow you to adjust individual intensities for the RGB channels to attempt to correct this.
The position
settings are perphaps the most important for this project because
they are used to match the light to your local(or any other) specific daylight
conditions. They are used by astral to
do the sun position calculations.
This needs to be set to the timezone you need to match. The possible values for
this are determined by the pytz
module. The easiest way to find the acceptable
values is to run python3
in a console and run the following commands to have
pytz
print out the options:
from pytz import all_timezones
for timezone in all_timezones:
print(timezone)
(You may need to press enter one more time after the print command before it runs)
A small note about daylight savings time. I am not 100% sure how this will handle DST. I am in Arizona where we do not participate in DST and have not needed to counter-program it. I suspect that it will "Just Work" because I think astral internally only uses UTC and only calculates relative values. So the actual local time doesn't matter. But if there is an problem feel free to open an issue and I'll attempt to fix it.
This is the exact location you want to calculate the sun position from. I would recommend looking up the location of a nearby airport and using the values for that. It will provide a known refrence you can compare your results to.
You don't need to change this. This only effects the printed valus in the terminal for debugging purposes. You can set this to whatever your hours offset from UTC is.
These are the colors used for the different times of the day. The default colors are intended to be more realistically subtle but you can change them to anything. The values are like the others, a decimal number from 0-1. The values are for the Red, Green, and Blue LEDs in that order for each period.
So as an example, if you want a neon magenta sunset, just change the sunset
values to [1,0,0.5]
and start the program.