LED Wall Clock with Mechanical Hands

A wall clock combining colorful LEDs with a traditional mechanical hands.
3
17
0
235
updated September 15, 2024

Description

PDF

This wall clock merges modern technology with classic design. It uses individual colored LEDs (WS2812) to display the time in a vibrant and eye-catching manner, while also featuring a standard mechanical movement for traditional hands.

An ESP8266 microcontroller running ESPHome firmware controls the LEDs, allowing for easy setup and integration with smart home systems. The LEDs are configured to light up only when motion is detected in the room and the ambient light level is below a certain threshold, measured using a BH1750 light sensor. This ensures the clock is illuminated only when needed, conserving energy and enhancing its functionality.

After printing, I recommend first inserting all the LEDs into their respective holes and soldering them directly while they are mounted on the clock. For power and ground, you can use a single continuous wire, but for the data lines, it's necessary to split the wire between individual LEDs to ensure proper communication.

The model was printed with a 0.25 mm layer height, and it's necessary to change filament color for the clock parts to achieve the desired appearance.

If you need to modify any part of the model, you can do so here: Onshape CAD Model.

ESPHome Configuration for the LEDs:

light:
  - platform: neopixelbus
    id: led
    variant: ws2812x
    pin: D2
    num_leds: 72
    name: "Clock"
    on_turn_on:
      - light.turn_on:
          id: led
          effect: "Clock"
    effects:
      - addressable_lambda:
          name: "Clock"
          update_interval: 1s
          lambda: |-
            auto now = id(homeassistant_time).now();
            it.range(0, 72) = Color::BLACK;
            auto second = (now.second-1)%60;
            if (second == -1) {
              second = 59;
            }
            
            auto minute = (now.minute-1)%60;
            if (minute == -1) {
              minute = 59;
            }
            
            auto hour = 59+((now.hour)%12);
            if (now.hour == 0 || now.hour == 12 || now.hour == 24) {
              hour = 71;
            }
            
            auto pointColor = Color(255,255,255);
            it[62] = pointColor;
            it[65] = pointColor;
            it[68] = pointColor;
            it[71] = pointColor;
            
            it[second] = Color(0,0,255);
            it[minute] = Color(0,255,0);
            it[hour] = Color(255,0,0);

Tags



Model origin

The author marked this model as their own original creation.

License