Skip to content

Instantly share code, notes, and snippets.

@lylavoie
Last active March 30, 2024 21:28
Show Gist options
  • Save lylavoie/c6add1fa89b83a32d10ee3461ced1df6 to your computer and use it in GitHub Desktop.
Save lylavoie/c6add1fa89b83a32d10ee3461ced1df6 to your computer and use it in GitHub Desktop.
ESPHome Nixie Clock

ESPHome Nixie Clock

Board Layout

image

ESPHome YAML

The yaml below provides the basic functionality for the Nixie Clock, along with the basic peripherals: RGB Leds, Nixie Vb voltage sensor, and Dallas temp sensor.

esphome:
  name: nixie-clock
  friendly_name: Nixie Clock
  on_boot:
    priority: -100
    then:
      - number.set:
          id: mcp4018_num
          value: 170
      - number.set:
          id: nixie_1
          value: 0
      - number.set:
          id: nixie_2
          value: 0
      - number.set:
          id: nixie_3
          value: 0
      - number.set:
          id: nixie_4
          value: 0
      - number.set:
          id: nixie_5
          value: 0
      - number.set:
          id: nixie_6
          value: 0
      - lambda: | 
          auto call = id(rgb_leds).turn_on();
          call.set_rgb(0.5, 0.25, 1.0);
          call.set_brightness(0.5);
          call.perform();
      - switch.turn_on: hv_enable

external_components:
  - source: github://lylavoie/esphome@MCP401x
    components: [ mcp401x ]
  - source: github://lylavoie/esphome@HV5522
    components: [ hv5522 ]

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:
  level: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: xxxx
  reboot_timeout: 0s

ota:
  password: xxxx

wifi:
  ssid: xxxxxxxx
  password: xxxxxxxx

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Nixie-Clock"
    password: "Nixie-Clock"

captive_portal:

web_server:
  port: 80
  log: False
  auth:
    username: xxxx
    password: xxxx

status_led:
  pin:
    number: GPIO12

time:
  - platform: sntp
    id: sntp_time
    timezone: America/New_York
    on_time_sync:
      then:
        lambda: |
          auto time = id(sntp_time).now();
          auto call1 = id(nixie_1).make_call();
          call1.set_value(time.second % 10);
          call1.perform();
          auto call2 = id(nixie_2).make_call();
          call2.set_value(time.second / 10);
          call2.perform();
          auto call3 = id(nixie_3).make_call();
          call3.set_value(time.minute % 10);
          call3.perform();
          auto call4 = id(nixie_4).make_call();
          call4.set_value(time.minute / 10);
          call4.perform();
          auto call5 = id(nixie_5).make_call();
          call5.set_value(time.hour % 10);
          call5.perform();
          auto call6 = id(nixie_6).make_call();
          call6.set_value(time.hour / 10);
          call6.perform();
    on_time:
      # Seconds
      - cron: "* * * * * *"
        then:
          lambda: |
            auto time = id(sntp_time).now();
            auto call1 = id(nixie_1).make_call();
            call1.set_value(time.second % 10);
            call1.perform();
            auto call2 = id(nixie_2).make_call();
            call2.set_value(time.second / 10);
            call2.perform();

      # Minutes
      - cron: "0 * * * * *"
        then:
          lambda: |
            auto time = id(sntp_time).now();
            auto call3 = id(nixie_3).make_call();
            call3.set_value(time.minute % 10);
            call3.perform();
            auto call4 = id(nixie_4).make_call();
            call4.set_value(time.minute / 10);
            call4.perform();

      # Hours
      - cron: "0 0 * * * *"
        then:
          lambda: |
            auto time = id(sntp_time).now();
            auto call5 = id(nixie_5).make_call();
            call5.set_value(time.hour % 10);
            call5.perform();
            auto call6 = id(nixie_6).make_call();
            call6.set_value(time.hour / 10);
            call6.perform();

    
light:
  - platform: neopixelbus
    name: RGB-LEDs
    id: rgb_leds
    pin: GPIO13
    num_leds: 6
    variant: WS2812
    type: RGB

  - platform: monochromatic
    name: "Nixie Brightness"
    output: nixie_bl
    restore_mode: RESTORE_AND_ON

i2c:
  - id: bus_a
    sda: GPIO16
    scl: GPIO4
    scan: True

output:
  - platform: mcp401x
    id: myPot
    address: 0x2F
    min_power: 0
    max_power: 1

  - platform: ledc
    pin: 
      number: GPIO32
      inverted: true
    id: nixie_bl

dallas:
  - pin: GPIO14

sensor:
  - platform: adc
    id: nixie_voltage
    name: Nixie Voltage
    pin: GPIO35
    attenuation: 11dB
    update_interval: 1s
    filters:
      - sliding_window_moving_average:
          window_size: 15
          send_every: 15
      - calibrate_linear:
         method: least_squares
         datapoints:
          - 1.43	-> 147.8
          - 1.47753 -> 153.3
          - 1.5116 -> 158.5
          - 1.55487 -> 165.3
          - 1.60327 -> 172.5
          - 1.63367 -> 177.9
          - 1.6646 -> 182.9
          - 1.6942 -> 187.8
          - 1.72827 -> 194.8
          - 1.749 -> 200.2
          - 1.782 -> 206.2
          - 1.81293 -> 212.5

  - platform: dallas
    index: 0
    name: "Temperature"


spi:
  id: spi_bus0
  clk_pin: GPIO18
  mosi_pin: GPIO33

hv5522:
  id: myHV5522
  latch_pin: GPIO17
  spi_id: spi_bus0
  data_rate: 200kHz
  count: 2

switch:
  - platform: gpio
    pin: GPIO23
    name: HV Enable
    restore_mode: ALWAYS_OFF
    inverted: true
    id: hv_enable

  - platform: gpio
    id: sep_1a
    name: Seperator 1A
    restore_mode: ALWAYS_ON
    pin:
      hv5522: myHV5522
      number: 30

  - platform: gpio
    id: sep_1b
    name: Seperator 1B
    restore_mode: ALWAYS_ON
    pin:
      hv5522: myHV5522
      number: 31

  - platform: gpio
    id: sep_2a
    name: Seperator 2A
    restore_mode: ALWAYS_ON
    pin:
      hv5522: myHV5522
      number: 62

  - platform: gpio
    id: sep_2b
    name: Seperator 2B
    restore_mode: ALWAYS_ON
    pin:
      hv5522: myHV5522
      number: 63

number:
  - platform: template
    name: Nixie Voltage
    id: mcp4018_num
    min_value: 140
    max_value: 200
    optimistic: true
    step: 0.1
    set_action:
      - lambda: |
          float newPotValue=x*-0.00489589+1.62733;
          ESP_LOGV("number", "Setting digipot to %f", newPotValue);
          id(myPot).set_level(newPotValue);

  - platform: hv5522
    name: Nixie-1
    id: nixie_1
    count_back: True
    count_back_speed: 50
    hv5522: myHV5522
    pins: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  - platform: hv5522
    name: Nixie-2
    id: nixie_2
    count_back: True
    count_back_speed: 50
    hv5522: myHV5522
    pins: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

  - platform: hv5522
    name: Nixie-3
    id: nixie_3
    count_back: True
    count_back_speed: 50
    hv5522: myHV5522
    pins: [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

  - platform: hv5522
    name: Nixie-4
    id: nixie_4
    count_back: True
    count_back_speed: 50
    hv5522: myHV5522
    pins: [32, 33, 34, 35, 36, 37, 38, 39, 40, 41]

  - platform: hv5522
    name: Nixie-5
    id: nixie_5
    count_back: True
    count_back_speed: 50
    hv5522: myHV5522
    pins: [42, 43, 44, 45, 46, 47, 48, 49, 50, 51]

  - platform: hv5522
    name: Nixie-6
    id: nixie_6
    count_back: True
    count_back_speed: 50
    hv5522: myHV5522
    pins: [52, 53, 54, 55, 56, 57, 58, 59, 60, 61]```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment