//https://forum.arduino.cc/t/arduino-debounce-button-logic-controlling-servos/1154479
//https://europe1.discourse-cdn.com/arduino/original/4X/7/e/0/7e0ee1e51f1df32e30893550c85f0dd33244fb0e.jpeg
#define ProjectName "Small Button Manager"
// make names
enum Mode {One, Two};
// make variables
const char* modes[] {"ModeOne", "ModeTwo"};
uint8_t mode = Two;
// make structures
struct MODESELECTOR
{
uint8_t buttonPin;
uint8_t stateOld;
uint8_t mode;
uint32_t debounceMillis;
uint32_t intervalMillis;
}
modeSelector {A0, LOW, mode, 0, 20};
// make support
void heartBeat(int LedPin, uint32_t currentMillis)
{
static bool setUp = false;
if (!setUp) pinMode (LedPin, OUTPUT), setUp = !setUp;
digitalWrite(LedPin, (currentMillis / 500) % 2);
}
// make application
void setup()
{
Serial.begin(115200);
Serial.println(ProjectName);
pinMode(modeSelector.buttonPin, INPUT_PULLUP);
Serial.print("start mode selected "), Serial.println(modes[modeSelector.mode]);
}
void loop()
{
uint32_t currentMillis = millis();
heartBeat(LED_BUILTIN, currentMillis);
if (currentMillis - modeSelector.debounceMillis >= modeSelector.intervalMillis)
{
modeSelector.debounceMillis = currentMillis;
uint8_t stateNew = digitalRead(modeSelector.buttonPin) ? LOW : HIGH;
if (modeSelector.stateOld != stateNew)
{
modeSelector.stateOld = stateNew;
if (stateNew == HIGH)
{
modeSelector.mode = modeSelector.mode ? LOW : HIGH;
Serial.print("mode selected "), Serial.println(modes[modeSelector.mode]);
}
}
}
}