Прерывание и таймер ESP32 GPIO

(извините за мой английский, я не родной) Мне нужно написать код для ESP32, который нажатием кнопки запускает прерывание GPIO и срабатывает таймер, в результате чего загорается светодиод 1 (на время <= 2 с) или светодиод 2 (на время > 2 с). Мне нужно, чтобы прерывания таймера и вывода GPIO были смешаны, но я не знаю, как это сделать, любая помощь в этом?

Мне нужно использовать прерывания, потому что я не хочу, чтобы процессор все время задействовался написанием кода внутри функции цикла. При нажатии клавиши (кнопки) спадающий фронт запускает функцию обнаружения1, которая запускает таймер на 2 с, и если таймер проходит 2 с, параметр с именем «Порог» срабатывает. изменяется с 0 на 1, чтобы использовать его, поскольку индикатор двойки прошел и знает, что нужно включить led2 вместо отведения1 в функции обнаружения2, иначе в функции обнаружения2, которая запускается нарастающим фронтом на выводе 12, светодиод1 будет включенный. Этот код ниже не работает, и я понятия не имею, как отключить кнопку с помощью прерываний. Любая помощь по этому коду и вопросу? СПАСИБО

     int Threshold = 0;//используйте, чтобы узнать, отсчитал ли таймер 2 секунды или нет
     const int button = 12;//вывод кнопки

     // прерывание таймера
     hw_timer_t *My_timer = NULL;
     void IRAM_ATTR onTimer(){
     Serial.println("on timer");
     Threshold = 1;
     timerEnd(My_timer);
     }

    //detect1: для обнаружения падения входного контакта (контакт 12:
    button) by pressing the key and start the timer to recognize 
    the pressing time less than 2 s or more than 2s
    void IRAM_ATTR detect1() {
    Serial.println("DETECT1 ");
    // определенный таймер для 2-секундного прерывания таймера, который изменяет
    parameter named "Threshold" to 1 if timer alarm happens 
    My_timer = timerBegin(0, 80, true);
    timerAttachInterrupt(My_timer, &onTimer, true);
    timerAlarmWrite(My_timer, 2000000, true);
    timerAlarmEnable(My_timer); //Просто включить
    }

    //detect2 : узнать, отпущена ли кнопка и нарастающий фронт
    happened and it will decide which led to turn on
    void IRAM_ATTR detect2() {

    Serial.println(" DETECT2 ");
    // цифровая запись (26, ВЫСОКИЙ);
    if (Threshold == 1 /* more than 2s key was pressed */){
    digitalWrite(26, HIGH);// загорается светодиод 2
     }
    else{
    digitalWrite(27, HIGH);// загорается светодиод 1
    } 

    }
    void setup() {
    Serial.begin(115200);

    // режим кнопки INPUT_PULLUP
    pinMode(button, INPUT_PULLUP);

    // Установить контакт кнопки как прерывание
    attachInterrupt(digitalPinToInterrupt(button), detect1,FALLING 
    );
    attachInterrupt(digitalPinToInterrupt(button), detect2,RISING);

    // Установить светодиод 1 & от 2 до НИЗКОГО
    pinMode(26, OUTPUT);
    digitalWrite(26, LOW);
    pinMode(27, OUTPUT); 
    digitalWrite(27, LOW);

    }
    void loop() {
    }

, 👍-3

Обсуждение

Как вы думаете, зачем нужен перерыв? Вам скорее понадобится неблокирующее время. В Arduino это обычно делается путем сохранения текущего возвращаемого значения функции millis(). Стандартный пример "BlinkWithoutDelay" не про мигание, а про *WithoutDelay*, @DataFiddler

Пожалуйста, прочтите [спросить]. Мы не сможем вам помочь, если вы не покажете нам, что у вас уже есть., @PMF