Atiny85 LED Lander

This is a minimalist 8-LED circuit sculpture built around an ATtiny85 and a 74HC595 shift register, powered by a CR2032 coin cell. It began as a small handheld box design, but I later added lander-style legs to give it a more sculptural presence. Pressing the button cycles through a variety of blinking modes and scrolling LED patterns.
The frame is hand soldered out of 20 AWG brass rods, while the LEDs are vintage round flat-top types sourced from the Ax-Man surplus store in Minneapolis.
At the heart of the display, the 74HC595—an 8-bit shift register—receives data serially and outputs it as eight parallel signals to drive the LEDs.
Schematic

The capacitors are 0.1 µF, and the value of the current-limiting resistors depends on the LEDs you use—typically ranging from 100 Ω to 220 Ω.
Firmware
For programming the ATtiny85, I used Pololu's AVR programmer. You can also use an Arduino UNO to act as a programmer instead.
Note: The current button implementation is not ideal—it’s checked at the top of the loop. A more reliable approach would be to use an interrupt-driven button handler.
/*
Firmware for 8-LED Circuit Sculpture
------------------------------------
This code runs on an ATtiny85 and controls eight LEDs through a 74HC595 shift register.
A push button cycles through various blinking and scrolling LED patterns.
Each pattern is defined as a series of bit sequences, which are shifted out
to the 74HC595 to illuminate the LEDs in sequence.
Hardware:
- ATtiny85 microcontroller
- 74HC595 8-bit shift register
- 8 vintage flat-top LEDs
- CR2032 coin cell power
- 20 AWG brass frame with push button
Author: Mohit Bhoite
*/
int latchPin = 1;
int clockPin = 2;
int dataPin = 0;
int outputEnablePin = 0;
int button = 4;
byte data = 0xff;
byte button_count = 0;
byte BCDnumber = 0;
int delay_time = 60;
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(button,INPUT_PULLUP);
}
void loop()
{
if(digitalRead(button)==0)
{
button_count++;
if(button_count >8) button_count = 0;
clearLEDs();
delay(20);
}
switch(button_count)
{
case 0:
pattern_0();
break;
case 1:
pattern_1();
break;
case 2:
pattern_2();
break;
case 3:
pattern_3();
break;
case 4:
pattern_4();
break;
case 5:
pattern_5();
break;
case 6:
pattern_6();
break;
case 7:
pattern_7();
break;
case 8:
pattern_8();
break;
}
}
void pattern_0(void)
{
BCDnumber++;
if(BCDnumber>255) BCDnumber = 0;
updateShiftRegister(BCDnumber);
delay(200);
}
void pattern_1(void)
{
updateShiftRegister(0x00);
delay(200);
updateShiftRegister(0xff);
delay(200);
}
void pattern_2(void)
{
updateShiftRegister(0x0f);
delay(200);
updateShiftRegister(0xf0);
delay(200);
}
void pattern_3(void)
{
updateShiftRegister(0b01010101);
delay(200);
updateShiftRegister(0b10101010);
delay(200);
}
void pattern_4(void)
{
for (int i = 0; i < 8; i++)
{
data = 0;
bitSet(data,i);
updateShiftRegister(data);
delay(delay_time);
}
}
void pattern_5(void)
{
for (int i = 7; i > -1; i--)
{
data = 0;
bitSet(data,i);
updateShiftRegister(data);
delay(delay_time);
}
}
void pattern_6(void)
{
for (int i = 0; i < 8; i++)
{
data = 0;
bitSet(data,i);
updateShiftRegister(data);
delay(delay_time);
}
for (int i = 7; i > -1; i--)
{
data = 0;
bitSet(data,i);
updateShiftRegister(data);
delay(delay_time);
}
}
void pattern_7(void)
{
updateShiftRegister(0b10000001);
delay(delay_time);
updateShiftRegister(0b01000010);
delay(delay_time);
updateShiftRegister(0b00100100);
delay(delay_time);
updateShiftRegister(0b00011000);
delay(delay_time);
updateShiftRegister(0b00100100);
delay(delay_time);
updateShiftRegister(0b01000010);
delay(delay_time);
}
void pattern_8(void)
{
updateShiftRegister(0b00011000);
delay(80);
updateShiftRegister(0b00100100);
delay(80);
updateShiftRegister(0b01000010);
delay(80);
updateShiftRegister(0b10000001);
delay(80);
updateShiftRegister(0b00000000);
delay(240);
}
void clearLEDs(void)
{
updateShiftRegister(0x00);
}
void updateShiftRegister(byte dataout)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, dataout);
digitalWrite(latchPin, HIGH);
}