I wanted an alarm clock which would wake me up with just light instead of an audible alarm. Lots of devices like this already exist and can be bought from many different retailers but I decided to build my own anyway.
The 12V input is connected to the buck converter to create a 5v output which is fed into the D1 Mini. I could have used a fixed regulator or fixed buck converter, but I had a spare adjustable buck available.
The 12V supply is also connected to the boost converter. This converter outputs the LED forward voltage (approx 17 volts) and limits the current to 1A. By limiting the current to just 1A, the overall heat output of the LED is much lower but the brightness is only about 1/3 of the potential maximum. The brightness produced with this amount of power is more than enough for my situation.
The LED and the cooling fan are both powered via a MOSFET each so the D1 Mini can control them both with PWM. These are N-Channel MOSFETs so they are being used for low-side switching (eg, the LED and fan always have a voltage applied, but the negative side is switched on/off to make/break the circuit).
I also have a DS18B20 temperature sensor mounted to the LED in order to determine if it is getting too hot. I have this sensor mounted to the front of the LED (just above where the light is emitted) because the airflow at the back is too high to get a good temperature value.
The assembed device is mounted inside of a plastic box with a transparent lid as shown above. This photo was taken before the DS18B20 was moved to the front so it is not visible. There is a large hole in the back of the box behind the fan; this allows good air exchange through the LED heatsink.
The software which runs on the D1 Mini connects to Node-Red on my home server via MQTT and accepts a brighness value. The code continuously monitors the temperature from the DS18B20 sensor and adjusts the fan PWM to keep it within a specific range; this cannot be overriden by Node-Red (or any other external inputs). If the temperature gets too hot, the LED is turned off completely until everything cools down again.
Node-Red is entirely in charge of when the LED is turned on and what brightness to use. This means that if the server or the local network go offline, the device does not function. This can easily be fixed but I don't consider it to be important for my specific situation.
This project has been working well for 8 months and it is able to reliably wake me up. It could be improved with some local timekeeping and logic so it isn't reliant on a server but so far the server hasn't let me down. The fan is quite noisy but since it is designed to wake me up, this could be seen as a feature.
I recently added a sonoff L1 Lite LED strip (flashed with Tasmota firmware) to the same room which can also be used as a wakeup light. For now I'm using a combination of my hardware plus the LED strip because the LED strip is bright enough to immediately wake me up even on the lowest brightness level.