ambient-lighting-clock/README.md
s3lph 566a50e6b5
Some checks failed
/ platformio (push) Failing after 26s
/ openscad (push) Successful in 1m44s
fix: image url in readme
2024-03-02 19:09:11 +01:00

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.