/*
Knop 2 Knop 1 Knop 0 LED
0 0 0 allemaal uit
0 0 1 eerste led aan, alle anderen uit
0 1 0 tweede led aan, alle anderen uit
0 1 1 derde led aan, alle anderen uit
1 0 0 vierde led aan, alle anderen uit
1 0 1 vijfde led aan, alle anderen uit
1 1 0 zesde led aan, alle anderen uit
1 1 1 zevende led aan, alle anderen uit
*/
byte dataPin = 2;
byte clockPin = 3;
byte latchPin = 4;
int outputEnablePin = 6;
byte button1 = 10;
byte button2 = 11;
byte button3 = 12;
int data = 0;
int previousData = -1; // detect button state changes
unsigned long previousMillis = 0;
unsigned long previousMillis_fade = 0;
const int interval = 10; // small delay to stabilize button reads
const int interval_fade = 20; // fade speed
int pwm = 0;
bool fadeUp = false; // true = fade in, false = fade out
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(outputEnablePin, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
Serial.begin(115200);
}
void loop() {
unsigned long currentMillis = millis();
// Read button states periodically
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
data = 1 * !digitalRead(button1);
data += 2 * !digitalRead(button2);
data += 4 * !digitalRead(button3);
int leds_working = 1 << data;
// Detect button change
if (data != previousData) {
previousData = data;
if (data != 0) {
fadeUp = true;
pwm = 0;
// Turn on the selected LED(s)
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, leds_working);
digitalWrite(latchPin, HIGH);
} else {
// All buttons released → fade out
fadeUp = false;
}
}
}
// Handle fading timing separately
if (currentMillis - previousMillis_fade >= interval_fade) {
previousMillis_fade = currentMillis;
if (fadeUp && pwm < 255) pwm++;
else if (!fadeUp && pwm > 0) pwm--;
analogWrite(outputEnablePin, 255 - pwm);
// When fully faded out, clear all LEDs
if (pwm == 0 && !fadeUp) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 0);
digitalWrite(latchPin, HIGH);
}
}
}