Let's create something simple, that I could actually feasibly make, without delving into the long and daunting journey of full on product design. I have a rough idea of what it is that I want: a thingamabob that will simulate the sunrise sequence, to help me wake up fresh.
To put it in more concrete terms, I require:
- An omnidirectional light source,
- that can change colours,
- and has configurable wake up times,
- ideally through an app or a web interface
I know I can simply buy one of many off-the-shelf products that do this exact thing, but where would be the fun in that?
The configurability I decided to tackle by slapping a Raspberry Pi W in there, because I have many of those lying around, waiting for their moment to shine (in this case, quite literally); and because these days I'm already comfortable spinning up servers and databases on Linux and writing web apps in Django, rather than having to figure out something like ESP32 or AVR+WiFi/Bluetooth from scratch (maybe for another project?). Eventually I will need to actually come up with the app once I have the whole thing assembled, but for now I will focus on the hardware side.
To get the omnidirectionality, I debated whether to go for a flat design with a lens or a diffuser in front of it, or whether something like a geodesic dome design would look better. I decided to go with the geodesic dome design, with LEDs on each facet, because that way it can illuminate all the walls in my bedroom more or less equally, and simply because I think it looks cooler.
Colour changing can be achieved through more than one way.
- I could have discrete LEDs for each colour I want to have: deep red, orange, yellow, cyan, warm white, and cool white. This would have the advantage of having a more diverse spectrum of wavelengths, something I thought may be important when tricking the brain that a sunrise is really happening. The disadvantage of this approach is that I would need many different types LEDs, each of which would probably need a different driver.
- An alternative is to use RGB LEDs, which can emulate a lot of the colours that humans can see. Warm white can be emulated by adding a bit of red to the RGB mix, while cool white has a bit more blue mixed in. This approach means that I only have 3 separate wavelengths to play with, but if sRGB is good enough to wreck my circadian rhythm, it should be good enough to fix it as well. No one in my household has tetrachromacy, so I have no need for more than 3 wavelengths anyway. This way I can implement some party modes as well.
I could get simple RGB LEDs and drive them with some external circuitry, but I figured that would raise the component count by quite a bit. So instead I decided to use these fancy RGB LEDs with inbuilt drivers. This means that all I need to do is hook them up to +5V, and feed them serial data. You have probably heard of the WS2812-powered NeoPixels. And you have probably learnt that communicating with those is non-trivial, because of their sensitivity to timing. They have no clock line, so the timing on the data line needs to be quite tight, or they won't understand what's being told.
There are other RGB LEDs too, though, some of which use a different communication protocol. The APA102-powered DotStars have a data line AND a clock line, meaning that they are not as sensitive to timing, making them much easier to talk with, especially using a device where I don't have control over individual instruction cycles (e.g. Raspberry Pi).
I can find these LEDs in two sizes: 5050 (5 mm x 5 mm) and 2020 (2 mm x 2 mm) packages. I haven't spotted any electrical differences, so naturally I'm going with the smaller one, since it's going to be reflow soldered anyway.
I decided to create a Geodesic Dome design, where each facet will carry one or more 2x2mm APA102 RGB LEDs (DotStar), with the brain being Raspberry Pi Zero W. Details will be worked out in the next update.