/*
Arduino | coding-help
How can I make my LED blink faster when I press the button longer?
Bruni OP — 9/17/24 at 11:07 PM
Straight forward, my question is the title.
Can anyone tell me what is wrong with this code?
After I pressed the button for 2 seconds, LED keeps on
flickering even after I unpressed the button.
I want a gradually shortening delay between each flickers.
*/
const int DEFAULT_RATE = 1000;
const int UPDATE_TIME = 1000;
const int INCREMENT = 50;
const int MIN_RATE = 200;
const int BTN_PIN = 2;
const int LED_PIN = 3;
int blinkRate = DEFAULT_RATE;
bool isPressed = false;
bool ledState = false;
unsigned long prevLedTime = 0;
unsigned long prevUpdateTime = 0;
void blinkLed(int speed) {
if (millis() - prevLedTime >= speed) {
prevLedTime = millis();
ledState = !ledState;
}
digitalWrite(LED_PIN, ledState);
}
void checkButton() {
static int oldBtnState = HIGH; // PULLUP idles HIGH
int btnState = digitalRead(BTN_PIN);
if (btnState != oldBtnState) {
oldBtnState = btnState;
if (btnState == LOW) { // pressed
//Serial.println("Pressed");
isPressed = true;
} else { // released
//Serial.println("Released");
isPressed = false;
Serial.print("Default rate: ");
Serial.print(DEFAULT_RATE);
Serial.println(" ms");
}
delay(20); // debounce
}
}
void setup() {
Serial.begin(9600);
pinMode(BTN_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
Serial.print("Starting at ");
Serial.print(blinkRate);
Serial.println(" ms blink\n");
}
void loop() {
checkButton();
if (isPressed) {
if (millis() - prevUpdateTime >= UPDATE_TIME) {
prevUpdateTime = millis();
blinkRate = blinkRate - INCREMENT;
if (blinkRate <= MIN_RATE) blinkRate = MIN_RATE;
Serial.print("Blink rate: ");
Serial.print(blinkRate);
Serial.println(" ms");
}
} else {
blinkRate = DEFAULT_RATE;
}
blinkLed(blinkRate);
}