const int buttonPin = 4;
const int ledPin = 9;
int currentBrightness = 128;
int savedBrightness = 128;
unsigned long pressStartTime = 0;
bool isLongPress = false;
bool isFading = false;
int fadeTarget = 0;
unsigned long fadePreviousMillis = 0;
const int fadeInterval = 10;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
analogWrite(ledPin, currentBrightness);
}
void loop() {
unsigned long currentMillis = millis();
if (digitalRead(buttonPin) == LOW) {
if (pressStartTime == 0) {
pressStartTime = currentMillis;
}
if (currentMillis - pressStartTime > 1000 && !isLongPress) {
isLongPress = true;
startFade(0);
}
} else {
if (pressStartTime != 0) {
if (!isLongPress) {
savedBrightness = random(10, 255);
analogWrite(ledPin, savedBrightness);
currentBrightness = savedBrightness;
}
pressStartTime = 0;
isLongPress = false;
}
}
if (isFading) {
updateFade(currentMillis);
}
}
void startFade(int target) {
fadeTarget = target;
isFading = true;
fadePreviousMillis = millis();
}
void updateFade(unsigned long currentMillis) {
if (currentMillis - fadePreviousMillis >= fadeInterval) {
fadePreviousMillis = currentMillis;
if (currentBrightness < fadeTarget) {
currentBrightness++;
analogWrite(ledPin, currentBrightness);
} else if (currentBrightness > fadeTarget) {
currentBrightness--;
analogWrite(ledPin, currentBrightness);
}
if (currentBrightness == fadeTarget) {
isFading = false;
if (fadeTarget == 0) {
delay(300);
startFade(savedBrightness);
}
}
}
}