123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- bool buttonCurrentState[3] = {HIGH, HIGH, HIGH};
- bool buttonLastState[3] = {HIGH, HIGH, HIGH};
- unsigned long buttonDownMillis[3] = {0, 0, 0};
- unsigned long buttonCurrentHoldTime[3] = {0, 0, 0};
- bool buttonFired[3] = {false, false, false};
- bool buttonHoldFired[3] = {false, false, false};
- unsigned long lastButtonPress[3] = {0, 0, 0};
- void buttonAction(byte btn) {
- lastSwitchSource[btn] = 0;
- relaisToggle(btn);
- switch (btn) {
- case 0:
- if (strlen(mqtt_topic_out_1) > 0) mqttclient.publish(mqtt_topic_out_1, mqtt_payload_out_1, mqtt_btnRetain);
- break;
- case 1:
- if (strlen(mqtt_topic_out_2) > 0) mqttclient.publish(mqtt_topic_out_2, mqtt_payload_out_2, mqtt_btnRetain);
- break;
- case 2:
- if (strlen(mqtt_topic_out_3) > 0) mqttclient.publish(mqtt_topic_out_3, mqtt_payload_out_3, mqtt_btnRetain);
- break;
- }
- if (led_enabled[btn]) {
- // blink LED when hold action is triggered
- bool ledState = digitalRead(leds_pins[btn]);
- digitalWrite(leds_pins[btn], !ledState);
- delay(250);
- digitalWrite(leds_pins[btn], ledState);
- }
- }
- void buttonHoldAction(byte btn) {
- if (hldToRel[btn] > 0) {
- relaisToggle( hldToRel[ btn - 1 ] );
- }
- switch (btn) {
- case 0:
- if (strlen(mqtt_topic_out_hold_1) > 0) mqttclient.publish(mqtt_topic_out_hold_1, mqtt_payload_out_hold_1, mqtt_btnRetain);
- break;
- case 1:
- if (strlen(mqtt_topic_out_hold_2) > 0) mqttclient.publish(mqtt_topic_out_hold_2, mqtt_payload_out_hold_2, mqtt_btnRetain);
- break;
- case 2:
- if (strlen(mqtt_topic_out_hold_3) > 0) mqttclient.publish(mqtt_topic_out_hold_3, mqtt_payload_out_hold_3, mqtt_btnRetain);
- break;
- }
- if (led_enabled[btn]) {
- // blink LED when hold action is triggered
- bool ledState = digitalRead(leds_pins[btn]);
- digitalWrite(leds_pins[btn], !ledState);
- delay(250);
- digitalWrite(leds_pins[btn], ledState);
- }
- }
- void checkButtonStates() {
- for (int i = 0; i < BUTTONS_COUNT; i++) {
- if (button_enabled[i]) checkButtonState(i);
- }
- }
- void checkButtonState(byte btn) {
- buttonCurrentHoldTime[btn] = millis() - buttonDownMillis[btn];
- buttonCurrentState[btn] = digitalRead(buttons_pins[btn]);
- if (buttonCurrentState[btn] == LOW && buttonLastState[btn] == HIGH) { // button was unpressed and is millis() pressed
- buttonDownMillis[btn] = millis();
- buttonLastState[btn] = buttonCurrentState[btn];
- }
- else if (buttonCurrentState[btn] == LOW && buttonLastState[btn] == LOW) { // button is held
- if ( buttonCurrentHoldTime[btn] > debounceTime ) {
- buttonLastState[btn] = buttonCurrentState[btn];
- if ( buttonCurrentHoldTime[btn] > buttonHoldTime && !buttonHoldFired[btn] ) {
- // button is held longer
- if ( (millis() - lastButtonPress[btn]) > 500 ) { // avoid double triggering
- lastButtonPress[btn] = millis();
- Serial.print("Button ");
- Serial.print(btn + 1);
- Serial.println(" long pressed");
- buttonHoldAction(btn);
- buttonHoldFired[btn] = true;
- }
- }
- }
- }
- else if (buttonCurrentState[btn] == HIGH && buttonLastState[btn] == LOW) { // button is released again
- if (buttonCurrentHoldTime[btn] > debounceTime) { // entprellung
- buttonLastState[btn] = buttonCurrentState[btn];
- if (!buttonHoldFired[btn] && !buttonFired[btn]) {
- if ( (millis() - lastButtonPress[btn]) > 500 ) { // avoid double triggering
- lastButtonPress[btn] = millis();
- Serial.print("Button ");
- Serial.print(btn + 1);
- Serial.println(" short pressed");
- buttonAction(btn);
- }
- }
- buttonFired[btn] = false;
- buttonHoldFired[btn] = false;
- }
- }
- }
|