const unsigned int buttonMaxClickTime = 500; const unsigned int buttonMaxClickTime_2 = 350; // actual max time a button may be pressed to get detected as short press/click const unsigned int buttonDebounceTime = 50; const unsigned int buttonRepeatTime = 50; const unsigned int buttonHoldTime = 50; const unsigned int buttonRepeatTime_menuButton = 1000; // Use this function to configure the internal Bounce object to suit you. See the documentation at: https://github.com/thomasfredericks/Bounce2/wiki // This function can be left out if the defaults are acceptable - just don't call configureButton void configurePushButton(Bounce &bouncedButton) { // Set the debounce interval to 15ms - default is 10ms bouncedButton.interval(15); } void setupInputsButtons() { //pinMode(PIN_PIRSENSOR, INPUT); buttonPlus.configureButton(configurePushButton); //buttonPlus.onPress(onButtonPressed); // When the button is first pressed, call the function onButtonPressed (further down the page) buttonPlus.onHoldRepeat(buttonHoldTime, buttonRepeatTime, onButtonHeld); // Once the button has been held for 1 second (1000ms) call onButtonHeld. Call it again every 350ms until it is let go buttonPlus.onRelease(buttonDebounceTime, buttonMaxClickTime, onButtonReleased); // When the button is held >50ms and released after <500ms, call onButtonReleased buttonMinus.configureButton(configurePushButton); //buttonMinus.onPress(onButtonPressed); // When the button is first pressed, call the function onButtonPressed (further down the page) buttonMinus.onHoldRepeat(buttonHoldTime, buttonRepeatTime, onButtonHeld); // Once the button has been held for 1 second (1000ms) call onButtonHeld. Call it again every 350ms until it is let go buttonMinus.onRelease(buttonDebounceTime, buttonMaxClickTime, onButtonReleased); // When the button is held >50ms and released after <500ms, call onButtonReleased buttonMode.configureButton(configurePushButton); //buttonMode.onPress(onButtonPressed); // When the button is first pressed, call the function onButtonPressed (further down the page) //buttonMode.onHold(1000, onButtonHeldNoRepeat); // Once the button has been held for 1 second (1000ms) call onButtonHeld buttonMode.onHoldRepeat(buttonHoldTime, buttonRepeatTime_menuButton, onButtonHeld); // Once the button has been held for 1 second (1000ms) call onButtonHeld buttonMode.onRelease(buttonDebounceTime, buttonMaxClickTime, onButtonReleased); // When the button is held >50ms and released after <500ms, call onButtonReleased pirSensor.configureButton(configurePushButton); //pirSensor.onPress(onButtonPressed); // When the button is first pressed, call the function onButtonPressed (further down the page) pirSensor.onHold(150, onButtonHeldNoRepeat); // Once the button has been held for 1 second (1000ms) call onButtonHeld pirSensor.onRelease(150, onButtonReleased); // When the button is held >50ms and released after <500ms, call onButtonReleased } // btn is a reference to the button that fired the event. That means you can use the same event handler for many buttons //void onButtonPressed(Button& btn) { // //} // duration reports back how long it has been since the button was originally pressed. // repeatCount tells us how many times this function has been called by this button. //void onButtonPressed(Button& btn) { // if (buttonMode.isPressed()) { // // } //} void onButtonHeld(Button &btn, uint16_t duration, uint16_t repeatCount) { if (buttonPlus.isPressed()) { plusButtonAction(); } if (buttonMinus.isPressed()) { minusButtonAction(); } if (buttonMode.isPressed()) { if (repeatCount <= 2) modeButtonHoldAction(); else if (repeatCount == 4) modeButtonRebootPendingAction(); else if (repeatCount > 4) modeButtonRebootAction(); } } void onButtonHeldNoRepeat(Button &btn, uint16_t duration) { //if (buttonMode.isPressed()) { // modeButtonHoldAction(); //} if (pirSensor.isPressed()) { pirSensorOnAction(); } } // duration reports back the total time that the button was held down void onButtonReleased(Button &btn, uint16_t duration) { if (btn.is(buttonPlus) && duration < buttonMaxClickTime_2) { plusButtonAction(); } else if (btn.is(buttonMinus) && duration < buttonMaxClickTime_2) { minusButtonAction(); } else if (btn.is(buttonMode) && duration < buttonMaxClickTime_2) { modeButtonAction(); } else if (btn.is(pirSensor)) { pirSensorOffAction(); } } void plusButtonAction() { //Serial.println("Btn +"); sendLog("DEV: Btn +", LOGLEVEL_INFO); if (!displayActive) { enableDisplay(); } else { extendDisplayTimeout(); if (heatingMode == 1 && preset != 0) setPresetTo(0); else setTempStepUp(); } } void minusButtonAction() { //Serial.println("Btn -"); sendLog("DEV: Btn -", LOGLEVEL_INFO); if (heatingMode == 1 && preset != 0) setPresetTo(0); if (!displayActive) { enableDisplay(); } else { extendDisplayTimeout(); if (heatingMode == 1 && preset != 0) setPresetTo(0); else setTempStepDown(); } } void modeButtonAction() { //Serial.println("Btn mode"); sendLog("DEV: Btn MODE", LOGLEVEL_INFO); if (!displayActive) { enableDisplay(); //displayShowLine2OverlayMessage(currentPresetName); } else { extendDisplayTimeout(); if (pendingRestart) { doRestart = true; updateDisplay(); } else { if (heatingMode > 0) { if (pendingPresetToggle) { togglePreset(); } else { pendingPresetToggle = true; displayShowLine2OverlayMessage(currentPresetName); } } } } } void modeButtonHoldAction() { //Serial.println("Btn mode held - toggle on/off"); sendLog("DEV: Btn MODE HOLD", LOGLEVEL_INFO); extendDisplayTimeout(); if (pendingRestart) { doRestart = true; updateDisplay(); } else { toggleOnOff(); } } void modeButtonRebootPendingAction() { extendDisplayTimeout(); pendingRestart = true; pendingRestart_lastMillis = millis(); updateDisplay(); } void modeButtonRebootAction() { extendDisplayTimeout(); doRestart = true; updateDisplay(); } void pirSensorOnAction() { PIRSensorOn = true; //Serial.println("PIR sensor ON"); //sendLog("SENS: PIR=ON", LOGLEVEL_INFO); publishCurrentPIRValue(); if (confBas.PIR_enablesDisplay) { if (confBas.PIR_enablesDisplay_preset0only && preset == 0) enableDisplay(); else if (!confBas.PIR_enablesDisplay_preset0only) enableDisplay(); } } void pirSensorOffAction() { PIRSensorOn = false; //Serial.println("PIR sensor OFF"); //sendLog("SENS: PIR=OFF", LOGLEVEL_INFO); publishCurrentPIRValue(); }