110 lines
4.8 KiB
Markdown
110 lines
4.8 KiB
Markdown
# Ambient Lighting Clock
|
|
|
|
3D model and ESP8266 code for a clock that projects colorful rays of light against the wall:
|
|
|
|
* **Hours**: Wide red
|
|
* **Minutes**: Blueish green
|
|
* **Seconds**: Blue
|
|
|
|
![Photo of the clock with a custom clockface lasercut from a piece of plywood](photo.jpg)
|
|
|
|
## Enclosure
|
|
|
|
The directory `case` contains the [OpenSCAD](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual) project and rendered [STL file](case/clock.stl) of the clock's enclosure for 3D printing.
|
|
|
|
The enclosure is designed to be 3D-printed, and fits an 60x WS2812 LEDs strip with 144 LEDs per meter, such as [this one (AliExpress link)](https://de.aliexpress.com/item/32682015405.html)
|
|
|
|
The enclosure also contains mounting holes to which a front plate can be attached (such as in the photo above).
|
|
To create your own clockface with a laser cutter, use the file [clockface.svg](case/clockface.svg) for cutting, and add your own digits and other decoration as an engraving layer.
|
|
|
|
## ESP8266
|
|
|
|
At the heart of the clock sits an ESP8266, which connects to a WiFi network and fetches the current time of day via NTP.
|
|
|
|
To build the code and program the ESP, you need to install the [PlatformIO](https://platformio.org/) framework.
|
|
|
|
The WS2812 data line needs to be connected to the ESP's GPIO5 pin. **Note**: Most breakout boards define their own pin numbers. For example, with a NodeMCU, GPIO5 corresponds to pin D1.
|
|
|
|
```shell-session
|
|
$ git clone https://git.kabelsalat.ch/s3lph/ambient-lighting-clock.git
|
|
$ cd ambient-lighting-clock/esp
|
|
$ vim src/main.cpp # Insert the WiFi SSID and PSK
|
|
$ pio run # To download dependencies and build without programming the ESP
|
|
Processing main (platform: espressif8266; board: nodemcu; framework: arduino)
|
|
--------------------------------------------------------------------------------------------------------------------------------------
|
|
Verbose mode can be enabled via `-v, --verbose` option
|
|
CONFIGURATION: https://docs.platformio.org/page/boards/espressif8266/nodemcu.html
|
|
PLATFORM: Espressif 8266 (2023.4.0) > NodeMCU 0.9 (ESP-12 Module)
|
|
HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash
|
|
PACKAGES:
|
|
- framework-arduinoespressif8266 @ 2.7.4+9
|
|
- tool-esptoolpy @ 1.40501.0 (4.5.1)
|
|
- toolchain-xtensa @ 2.40802.200502 (4.8.2)
|
|
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
|
|
LDF Modes: Finder ~ chain, Compatibility ~ soft
|
|
Found 31 compatible libraries
|
|
Scanning dependencies...
|
|
Dependency Graph
|
|
|-- Adafruit NeoPixel @ 1.11.0
|
|
|-- NTP @ 1.6.0
|
|
|-- ESP8266WiFi @ 1.0
|
|
Building in release mode
|
|
Retrieving maximum program size .pio/build/main/firmware.elf
|
|
Checking size .pio/build/main/firmware.elf
|
|
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
|
|
RAM: [==== ] 35.4% (used 28984 bytes from 81920 bytes)
|
|
Flash: [=== ] 26.8% (used 279396 bytes from 1044464 bytes)
|
|
==================================================== [SUCCESS] Took 1.58 seconds ====================================================
|
|
$ pio run -t upload # To build the code and program it to the ESP8266
|
|
Configuring upload protocol...
|
|
AVAILABLE: espota, esptool
|
|
CURRENT: upload_protocol = esptool
|
|
Looking for upload port...
|
|
Auto-detected: /dev/ttyUSB0
|
|
Uploading .pio/build/main/firmware.bin
|
|
esptool.py v4.6-dev
|
|
Serial port /dev/ttyUSB0
|
|
Connecting....
|
|
Chip is ESP8266EX
|
|
Features: WiFi
|
|
Crystal is 26MHz
|
|
MAC: 2c:3a:e8:01:23:45
|
|
Uploading stub...
|
|
Running stub...
|
|
Stub running...
|
|
Configuring flash size...
|
|
Flash will be erased from 0x00000000 to 0x00045fff...
|
|
Compressed 283552 bytes to 208462...
|
|
Writing at 0x00000000... (7 %)
|
|
Writing at 0x00005b34... (15 %)
|
|
Writing at 0x0000b2c4... (23 %)
|
|
Writing at 0x00010670... (30 %)
|
|
Writing at 0x00015f2e... (38 %)
|
|
Writing at 0x0001b0d0... (46 %)
|
|
Writing at 0x000200a6... (53 %)
|
|
Writing at 0x0002523e... (61 %)
|
|
Writing at 0x0002a761... (69 %)
|
|
Writing at 0x0002fcd8... (76 %)
|
|
Writing at 0x00035551... (84 %)
|
|
Writing at 0x0003ac1f... (92 %)
|
|
Writing at 0x00041169... (100 %)
|
|
Wrote 283552 bytes (208462 compressed) at 0x00000000 in 18.3 seconds (effective 124.1 kbit/s)...
|
|
Hash of data verified.
|
|
|
|
Leaving...
|
|
Hard resetting via RTS pin...
|
|
=================================================== [SUCCESS] Took 23.76 seconds ====================================================
|
|
```
|
|
|
|
## Automatic Brightness Adjustment
|
|
|
|
You can attach a voltage divider with a photo resistor as pull-down and a regular resistor as pull-up to the ESP's8266 ADC.
|
|
If you choose to do this, please check the ADC voltage level of your ESP8266 board: While the ADC itself works in the range 0.0V...1.0V, a lot of breakout boards scale that up to 0.0V...3.3V.
|
|
|
|
Example with a NodeMCU board:
|
|
|
|
![brightness.png](brightness.png)
|
|
|
|
You can use the values `ADC_MAX`, `ADC_MIN`, `BRIGHT_MIN` and `BRIGHT_MAX` at the top of the file `esp/src/main.cpp` to fine-tune the sensitivity and thresholds of the auto adjustment.
|
|
|
|
If you do not use this feature, and observe some flickering, please short the ADC to GND.
|