Wrote this for a single button speed selector, might work for you, connect a pushbutton from GND to pin 4,each press increments counter, if no press for 1500 mS, counter value is accepted.
uint32_t tStart, timeStart, tEnd;// = 2000UL;
int speeds [] = {500, 1000, 1500, 2000, 2500};
int speed;
const byte dbTime = 15, btn = 4, ledPin = 13;
bool btnState = false, bState = true, oldBstate = true,
timing = false, speedSet = false;
byte cntr;
void setup()
{
//Serial.begin(115200);
pinMode(btn, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
// debounce-----------------------------
if (digitalRead(btn) != btnState) // they are different!
{
btnState ^= 1; // make them equal
timeStart = millis(); // restart timer
}
if (millis() - timeStart > dbTime) // if not changed for dbTime,
bState = btnState; // btnState is valid, use it
// end debounce-------------------------
if(!timing && !bState && oldBstate)
{
tStart = millis();
tEnd = 1500UL;
cntr = 0;
timing = true;
speedSet = true;
}
if(timing && !bState && oldBstate)
{
if(++cntr > 5)
cntr = 1;
tStart = millis();
Serial.println(speeds[cntr - 1]);
oldBstate = bState;
}
if(millis() - tStart > tEnd)
{
timing = false;
if(speedSet)
{
speed = speeds[cntr - 1];
if(!bState)
speed = 0;
Serial.print("Delay set to ");
Serial.println(speed);
Serial.println("Press button to change");
speedSet = false;
}
}
digitalWrite(ledPin,timing);
oldBstate = bState;
}
Bonus ![]()
uint32_t tStart, timeStart, tEnd = 1500;
const byte dbTime = 25, btn = 4, ledPin = 13;
bool btnState = false, bState = true, oldBstate = true,
timing = false;
byte cntr;
void setup()
{
Serial.begin(115200);
pinMode(btn, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
// debounce-----------------------------
if (digitalRead(btn) != btnState) // they are different!
{
btnState ^= 1; // make them equal
timeStart = millis(); // restart timer
}
if (millis() - timeStart > dbTime) // if not changed for dbTime,
bState = btnState; // btnState is valid, use it
// end debounce-------------------------
if(!timing && !bState && oldBstate)
{
tStart = millis();
timing = true;
}
if(timing && !bState && oldBstate)
{
cntr++;
tStart = millis();
oldBstate = bState;
}
if(millis() - tStart > tEnd)
{
timing = false;
while(cntr > 0)
{
digitalWrite(ledPin,HIGH);
delay(500);
digitalWrite(ledPin,LOW);
delay(500);
cntr --;
}
}
oldBstate = bState;
}