const int ledPin = 2;
const int buttonPin = 21;
int state = 1;
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int blinkCount = 0;
bool ledOn = false;
unsigned long lastBlinkTime = 0;
unsigned long blinkInterval = 1000;
unsigned long fastBlinkInterval = 250;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
digitalWrite(ledPin, LOW);
Serial.begin(115200);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
state++;
if (state > 3) state = 1;
resetBlinkState();
}
}
}
lastButtonState = reading;
switch (state) {
case 1:
fixedFrequencyBlink(1000);
break;
case 2:
fastBlinkSequence();
break;
case 3:
digitalWrite(ledPin, LOW);
break;
}
}
void resetBlinkState() {
blinkCount = 0;
ledOn = false;
lastBlinkTime = 0;
}
void fixedFrequencyBlink(unsigned long interval) {
if (millis() - lastBlinkTime >= interval) {
lastBlinkTime = millis();
ledOn = !ledOn;
digitalWrite(ledPin, ledOn);
}
}
void fastBlinkSequence() {
if (blinkCount < 5) {
if (millis() - lastBlinkTime >= fastBlinkInterval) {
lastBlinkTime = millis();
ledOn = !ledOn;
digitalWrite(ledPin, ledOn);
if (!ledOn) blinkCount++;
}
} else {
state = 1;
}
}