Fallout Sign - With added Home Assistant.
If you have read a few of my articles, you will know I love messing around with my 3D printer, and possibly even that I make props from time to time.
Recently, I came across this tutorial for making a glowing fallout sign. I love the game fallout, and set about making this for myself. For reference, the original video can be found below.
It was all pretty straight forward until we got to the soldering. While I can solder, my eyes aren't what they used to be and the pads on the suggested leds strips are pretty small. I also needed to choose my microcontroller. So rather than use what was suggested, I popped over to the pimoroni website and purchased the following:
1x Plasma Stick 2040 W (Pico W Aboard)
1x LED Strip Input/Output Cable - 3-pin
1x Neon-like RGB LED Strip with Diffuser
The led strip was able to be coiled up inside the box, with no need to cut it down to size. Just remember to point it the right way. I drilled a hole for the cable to come out of, and I connected that to the led strip. On the other end, I wired in the Plasma stick.
Lastly, I glued down the plasma stick to rear of the box and plugged it in.
I then proceeded to program the Plamsa stick using ESPHome for home assistant. This is my current configuration for the device:
esphome:
name: fallout-01
friendly_name: fallout-01
on_boot:
priority: 600
then:
- light.turn_on: led_strip
- lambda: |-
auto call = id(led_strip).make_call();
call.set_effect("Rainbow2");
call.perform();
rp2040:
board: rpipicow
# framework:
# platform_version: https://github.com/maxgerhardt/platform-raspberrypi.git
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: !secret api_key
ota:
- platform: esphome
password: !secret ota_pass
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Fallout-01 Fallback Hotspot"
password: !secret wifi_backup
#captive_portal:
output:
- platform: gpio
pin:
number: 25
mode: output
id: LED
light:
- platform: rp2040_pio_led_strip
name: led_strip
id: led_strip
pin: GPIO15
num_leds: 95
pio: 0
rgb_order: RGB
chipset: WS2812
effects:
# Use default parameters:
- random:
name: "Random Effect"
- strobe:
name: "Strobe Effect"
- flicker:
name: "Flicker Effect"
- addressable_rainbow:
name: "Addressable Rainbow"
- addressable_color_wipe:
name: "Addressable Color Wipe"
- addressable_scan:
name: "Addressable Scan"
- addressable_twinkle:
name: "Addressable Twinkle"
# - addressable_chase:
- addressable_fireworks:
name: Fireworks
use_random_color: True
spark_probability: 15%
- addressable_flicker:
name: Flicker2
- addressable_rainbow:
name: Rainbow2
speed: 20
width: 50
- addressable_color_wipe:
name: ColorWipe
colors:
- red: 100%
green: 100%
blue: 100%
num_leds: 15
gradient: true
- red: 0%
green: 0%
blue: 0%
num_leds: 95
add_led_interval: 50ms
reverse: false
# Global variable to store current effect index
globals:
- id: effect_index
type: int
restore_value: yes
initial_value: '10'
script:
- id: cycle_effect
mode: restart
then:
- lambda: |-
static const std::vector<std::string> effects = {
"Random Effect", "Strobe Effect", "Flicker Effect", "Addressable Rainbow",
"Addressable Color Wipe", "Addressable Scan", "Addressable Twinkle",
"Fireworks", "Flicker2", "Rainbow2", "ColorWipe"
};
id(effect_index)++;
if (id(effect_index) >= effects.size()) {
id(effect_index) = 0;
}
auto effect_name = effects[id(effect_index)];
id(led_effect_selector).publish_state(effect_name);
auto call = id(led_strip).make_call();
call.set_effect(effect_name);
call.perform();
# Virtual button to trigger the script
button:
- platform: template
name: "Cycle LED Effect"
on_press:
then:
- script.execute: cycle_effect
- platform: restart
name: "Fallout Restart"
select:
- platform: template
name: "LED Effect Selector"
id: led_effect_selector
optimistic: true
options:
- "Random Effect"
- "Strobe Effect"
- "Flicker Effect"
- "Addressable Rainbow"
- "Addressable Color Wipe"
- "Addressable Scan"
- "Addressable Twinkle"
- "Fireworks"
- "Flicker2"
- "Rainbow2"
- "ColorWipe"
initial_option: "Addressable Rainbow"
on_value:
then:
- lambda: |-
auto call = id(led_strip).make_call();
call.set_effect(x);
call.perform();
Once created, uploading the firmware is as simple as plugging the plasma stick in to your laptop with the boot button pressed, then dragging and dropping the firmware on the device. Subsequent updated can be made over wifi.
Once done, verify everything is working and place the front on over the led strip. For refence, here is my display: