Прерывание и таймер 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() {
}
@mbdaqli, 👍-3
Обсуждение0
- Постоянная частота дискретизации АЦП на ESP8266 или ESP32
- Как избежать электромагнитных помех на входе ESP32
- Присоедините функцию Arduino ISR к члену класса
- Внешние прерывания Esp32 иногда отсутствуют
- Как реализовать детектор brown out arduino ESP32?
- Чтение внутренних критических разделов из ISR
- Анимация светодиодной ленты с ESP32 не работает при использовании WiFi
- ESP32 больше не может вводить прерывание после появления прерывания во время функции delayMicrosecond
Как вы думаете, зачем нужен перерыв? Вам скорее понадобится неблокирующее время. В Arduino это обычно делается путем сохранения текущего возвращаемого значения функции millis(). Стандартный пример "BlinkWithoutDelay" не про мигание, а про *WithoutDelay*, @DataFiddler
Пожалуйста, прочтите [спросить]. Мы не сможем вам помочь, если вы не покажете нам, что у вас уже есть., @PMF